// ------------------------------
// PageExpand
//
// Hakuhin 2010-2014 http://hakuhin.jp
// ------------------------------
// ------------------------------
// ユーザースクリプトメタデータ
// ------------------------------
// ==UserScript==
// @name PageExpand
// @name:ja PageExpand
// @version 1.4.3
// @namespace http://hakuhin.jp/page_expand
// @description All Image Download. Image Zoom. Expand Thumbnail and Audio and Video. Expand the short URL. Generate a link from text. Extend BBS. etc...
// @description:ja 画像の一括ダウンロード、画像のポップアップ、サムネイルやビデオの展開、短縮URLの展開、URL文字列のリンク化、掲示板の拡張表示など...
// @include http://*
// @include https://*
// @include ftp://*
// @icon https://raw.githubusercontent.com/hakuhin/PageExpand/master/GreaseMonkey/icon32.png
// @icon64 https://raw.githubusercontent.com/hakuhin/PageExpand/master/GreaseMonkey/icon64.png
// @copyright hakuhin
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_log
// @grant GM_registerMenuCommand
// @grant GM_info
// ==/UserScript==
(function(page_expand_arguments){
// ------------------------------
// 手動インポート
//
// 設定からエクスポートした文字列を記述すると、その設定値で動作します。
// ------------------------------
var project_import_manual = null;
// ------------------------------
// プライベート変数
// ------------------------------
// 特権 オブジェクト
var admin = page_expand_arguments.admin;
// Window オブジェクト
var window = page_expand_arguments.window;
// Document オブジェクト
var document = window.document;
// PageExpand 関数
var PageExpand = arguments.callee;
// PageExpand プロジェクト
var page_expand_project;
// プロジェクト
var project;
// PageExpand ノード
var page_expand_root;
var page_expand_node;
// イベントディスパッチャー
var page_expand_event_dispatcher;
// マウス入力
var input_mouse;
// タッチ入力
var input_touch;
// 実行キュー関連
var execute_queue;
// ローダーキュー関連
var loader_queue;
// ダウンローダーキュー関連
var downloader_queue;
// ダウンロードリスト
var download_list_image;
var download_list_user;
// アドレス関連
var address_collection;
// タスク関連
var task_container;
var task_execute_level;
// デバッグ関連
var page_expand_debug;
// DOMノードが外れたか監視
var document_observer_remove_node;
// DOMノードの変更を監視
var document_observer_modify_node;
// スクロール監視
var document_observer_scroll;
// 進捗通知
var notify_progress;
// イメージ管理
var element_limitter_image;
var popup_image_container;
// サウンド管理
var element_limitter_sound;
// ビデオ管理
var element_limitter_video;
// リダイレクト辞書
var redirect_url_dictionary;
// 解析辞書
var analyze_work_dictionary;
// 掲示板辞書
var bbs_dictionary;
// 掲示板拡張
var expand_bbs;
// 拡張機能通信
var extension_message;
// ウィンドウ管理
var window_manager;
// 開始済み
var started = false;
// 解析が有効か
var enable_analyze = true;
// ------------------------------
// 定数
// ------------------------------
// タスクレベル
var TASK_EXECUTE_LEVEL_POPUP = 0x00000001;
// ------------------------------
// PageExpand 初期化
// ------------------------------
function PageExpandInitialize(){
// PageExpand ノード
if(!page_expand_node){
page_expand_node = new PageExpandNode();
if(page_expand_arguments.page_expand_parent){
page_expand_arguments.page_expand_parent.attachChild(page_expand_node);
}
page_expand_root = page_expand_node.getPageExpandRoot();
}
// イベントディスパッチャー
if(!page_expand_event_dispatcher){
page_expand_event_dispatcher = new EventDispatcher();
// アンロード監視
if(WindowIsChild(window)){
PageExpandObserverUnload();
}
}
}
// ------------------------------
// PageExpand コンストラクタ
// ------------------------------
function PageExpandConstructor(){
// マウス入力
if(!input_mouse){
input_mouse = new InputMouse(window);
}
// 実行キュー
if(!execute_queue){
execute_queue = new ExecuteQueue();
}
// ローダーキュー
if(!loader_queue){
loader_queue = new LoaderQueue();
}
// ダウンローダーキュー
if(!downloader_queue){
downloader_queue = new DownloaderQueue();
}
// アドレスコレクション
if(!address_collection){
address_collection = new AddressCollection();
}
// ダウンロードリスト
if(!download_list_image){
download_list_image = new DownloadList();
}
if(!download_list_user){
download_list_user = new DownloadList();
}
// タスクコンテナを生成
if(!task_container){
task_container = new TaskContainer();
task_execute_level = 0xffffffff;
// ------------------------------
// 実行ループ
// ------------------------------
(function(){
var time_handle;
// タスクを毎サイクル実行
function TaskContainerExecute(){
task_container.execute(task_execute_level);
}
// 開始関数をセット
task_container.setStartFunc(function(){
time_handle = setInterval(TaskContainerExecute, 1000 / 60);
});
// 終了関数をセット
task_container.setEndFunc(function(){
clearInterval(time_handle);
time_handle = undefined;
});
})();
}
// デバッグ
if(!page_expand_debug){
page_expand_debug = new PageExpandDebug();
}
// DOMノードが外れたか監視
if(!document_observer_remove_node){
document_observer_remove_node = new DocumentObserverRemoveDomNode();
}
// プロパティ変更を監視
if(!document_observer_modify_node){
document_observer_modify_node = new DocumentObserverModifyProperty();
}
// スクロール監視
if(!document_observer_scroll){
document_observer_scroll = new DocumentObserverScroll();
}
// 進捗通知
if(!notify_progress){
notify_progress = new NotifyProgress();
}
// イメージ管理
if(!element_limitter_image){
element_limitter_image = new ElementLimiterByByteSize();
}
if(!popup_image_container){
popup_image_container = new PopupImageContainer();
}
// サウンド管理
if(!element_limitter_sound){
element_limitter_sound = new ElementLimiterByCount();
}
// ビデオ管理
if(!element_limitter_video){
element_limitter_video = new ElementLimiterByCount();
}
// リダイレクト辞書
if(!redirect_url_dictionary){
redirect_url_dictionary = new RedirectUrlDictionary();
}
// 解析辞書
if(!analyze_work_dictionary){
analyze_work_dictionary = new AnalyzeWorkDictionary();
}
// 掲示板辞書
if(!bbs_dictionary){
bbs_dictionary = new BbsDictionary();
}
// ウィンドウ管理
if(!window_manager){
window_manager = new WindowManager(window);
}
// 掲示板拡張
if(!expand_bbs){
expand_bbs = {
enable:false,
initialized:false,
node_queue:new Array(),
work:new Object()
};
}
}
// ------------------------------
// PageExpand から実行されるか調べる
// ------------------------------
function WindowIsExecutedByPageExpand(window_obj){
try{
var re = new RegExp("^(data|blob|about):","i");
if(window_obj.location.href){}
if(window_obj.document.URL.match(re)){
return true;
}
}catch(e){
}
return false;
}
// ------------------------------
// PageExpand 開放
// ------------------------------
function PageExpandRelease(){
// 開放イベント発火
if(page_expand_event_dispatcher){
page_expand_event_dispatcher.dispatchEvent("release",null);
}
// ウィンドウ管理
if(window_manager){
window_manager.release();
window_manager = null;
}
// 拡張機能通信
if(extension_message){
extension_message.release();
extension_message = null;
}
// デバッグ関連
if(page_expand_debug){
page_expand_debug.release();
page_expand_debug = null;
}
// 掲示板辞書
if(bbs_dictionary){
bbs_dictionary.release();
bbs_dictionary = null;
}
// 解析辞書
if(analyze_work_dictionary){
analyze_work_dictionary.release();
analyze_work_dictionary = null;
}
// リダイレクト辞書
if(redirect_url_dictionary){
redirect_url_dictionary.release();
redirect_url_dictionary = null;
}
// ビデオ管理
if(element_limitter_video){
element_limitter_video.release();
element_limitter_video = null;
}
// サウンド管理
if(element_limitter_sound){
element_limitter_sound.release();
element_limitter_sound = null;
}
// イメージ管理
if(element_limitter_image){
element_limitter_image.release();
element_limitter_image = null;
}
if(popup_image_container){
popup_image_container.release();
popup_image_container = null;
}
// 進捗通知
if(notify_progress){
notify_progress.release();
notify_progress = null;
}
// スクロール監視
if(document_observer_scroll){
document_observer_scroll.release();
document_observer_scroll = null;
}
// DOMノードの変更を監視
if(document_observer_modify_node){
document_observer_modify_node.release();
document_observer_modify_node = null;
}
// DOMノードが外れたか監視
if(document_observer_remove_node){
document_observer_remove_node.release();
document_observer_remove_node = null;
}
// タスク関連
if(task_container){
task_container.release();
task_container = null;
}
// アドレス関連
if(address_collection){
address_collection.release();
address_collection = null;
}
// ダウンロードリスト
if(download_list_image){
download_list_image.release();
download_list_image = null;
}
if(download_list_user){
download_list_user.release();
download_list_user = null;
}
// ダウンローダーキュー関連
if(downloader_queue){
downloader_queue.release();
downloader_queue = null;
}
// ローダーキュー関連
if(loader_queue){
loader_queue.release();
loader_queue = null;
}
// 実行キュー関連
if(execute_queue){
execute_queue.release();
execute_queue = null;
}
// タッチ入力
if(input_touch){
input_touch.release();
input_touch = null;
}
// マウス入力
if(input_mouse){
input_mouse.release();
input_mouse = null;
}
// イベントディスパッチャー
if(page_expand_event_dispatcher){
page_expand_event_dispatcher.release();
page_expand_event_dispatcher = null;
}
// PageExpand ノード
if(page_expand_node){
page_expand_node.release();
page_expand_node = null;
page_expand_root = null;
}
// プロジェクト
if(project){
project.release();
project = null;
}
// PageExpand プロジェクト
page_expand_project = null;
// Document オブジェクト
document = null;
// Window オブジェクト
window = null;
// 特権 オブジェクト
admin = null;
}
// ------------------------------
// アンロード監視
// ------------------------------
function PageExpandObserverUnload(){
var event_handler_release;
var removeEvent = function (e){
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
if(window.removeEventListener){
window.removeEventListener("unload",unload);
}else if(window.detachEvent){
window.detachEvent("onunload",unload);
}
};
var unload = function (e){
removeEvent();
PageExpandRelease();
};
// アンロード監視
if(window.addEventListener){
window.addEventListener("unload",unload);
}else if(window.attachEvent){
window.attachEvent("onunload",unload);
}
// 開放イベント
event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
removeEvent();
});
}
// ------------------------------
// PageExpand 実行開始
// ------------------------------
function PageExpandStart(){
if(started) return;
started = true;
// ------------------------------
// 設定
// ------------------------------
loader_queue.setMaxThread(project.getLoadThreadMax());
downloader_queue.setMaxThread(project.getDownloadThreadMax());
element_limitter_image.setEnableUnload(project.getEnableUnloadExpandImage());
element_limitter_image.setByteSizeMax(project.getSizeMoreThenAllowUnloadExpandImage());
element_limitter_sound.setMaxUse(project.getSoundMaxInlineSound());
element_limitter_video.setMaxUse(project.getVideoMaxInlineVideo());
execute_queue.setOccupancyTime(project.getExecuteQueueOccupancyTime());
execute_queue.setSleepTime(project.getExecuteQueueSleepTime());
// ------------------------------
// タッチ入力
// ------------------------------
(function(){
if(project.enableInputTouch()){
var virtual_mouse_pointer;
var touch_assist;
// 開放イベント
var event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
if(virtual_mouse_pointer){
virtual_mouse_pointer.release();
virtual_mouse_pointer = null;
}
if(touch_assist){
touch_assist.release();
touch_assist = null;
}
});
// タッチ入力
input_touch = new InputTouch();
// 仮想マウスポインタ
virtual_mouse_pointer = new VirtualMousePointer(document);
// タッチ補助
if(project.enableDoubleTouchAssist()){
touch_assist = new DoubleTouchAssist();
}
var enable_old = false;
var touch_max = 0;
// タッチ入力更新
var event_update = input_touch.createEventHandler("update");
event_update.setFunction(function (e){
var enable_now = e.getEnableTouch();
if(enable_now){
var touch_list = e.getTouchList();
var touch_num = touch_list.length;
if(touch_max <= 1){
if(touch_num == 1){
input_mouse.setInputTouch(e);
virtual_mouse_pointer.setPosition(input_touch.getPositionAverage());
}else if(touch_num == 2){
var touch0 = touch_list[0];
var touch1 = touch_list[1];
if(touch0 && touch1){
var pos = {
x:touch0.clientX,
y:touch0.clientY
};
var vec = {
x:touch1.clientX - touch0.clientX,
y:touch1.clientY - touch0.clientY
};
virtual_mouse_pointer.setPosition(pos);
virtual_mouse_pointer.addVector(vec);
if(touch_assist){
touch_assist.setShow(pos,vec);
}
}
}
touch_max = touch_num;
}
}else{
touch_max = 0;
}
enable_old = enable_now;
});
}
})();
// ------------------------------
// ルートウィンドウのマウス操作
// ------------------------------
(function(){
if(!window_manager.existWindowRoot()) return;
function mouseMove (e){
if(!(task_container.getCountTask())) return;
var offset = window_manager.getPositionFromRoot();
// マウス入力を更新
input_mouse.setMouseEvent({
clientX:e.clientX - offset.x,
clientY:e.clientY - offset.y,
detail:e.detail,
screenX:e.screenX,
screenY:e.screenY,
ctrlKey:e.ctrlKey,
shiftKey:e.shiftKey,
altKey:e.altKey,
metaKey:e.metaKey,
button:e.button
});
}
var document_obj = window_manager.getWindowRoot().document;
// 開放イベント
var event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
if(document_obj.removeEventListener){
document_obj.removeEventListener("mousemove",mouseMove);
}else if(document_obj.detachEvent){
document_obj.detachEvent("onmousemove",mouseMove);
}
});
if(document_obj.addEventListener){
document_obj.addEventListener("mousemove",mouseMove);
}else if(document_obj.attachEvent){
document_obj.attachEvent("onmousemove",mouseMove);
}
})();
// ------------------------------
// 変更オブザーバー未対応
// ------------------------------
if(!MutationObserverSupported()){
(function(){
// アンカー監視
var task = task_container.createTask();
task.setExecuteFunc(function(task){
document_observer_modify_node.execute();
document_observer_remove_node.execute();
});
})();
}
// ------------------------------
// 更新イベント
// ------------------------------
// ロード完了時に実行
function DocumentLoaded(){
if(project.getEnableDebugMode()){
// デバッグモード
page_expand_debug.setVisible(true);
}
// 掲示板拡張初期化
if(project.getEnableExpandBbs()){
project.initializeScriptCallbackExpandBbs(function(response){
expand_bbs.initialized = true;
expand_bbs.enable = response.result;
var ary = expand_bbs.node_queue;
var num = ary.length;
var i;
for(i=0;i<num;i++){
execute_queue.attachForExpandBbs(ElementAnalyzeBbs,ary[i]);
}
expand_bbs.node_queue.length = 0;
});
}
if(document.addEventListener){
if(MutationObserverSupported()){
(function(){
var mutation_observer;
var event_handler_release;
mutation_observer = MutationObserverCreate(function(mutations) {
var i;
var num = mutations.length;
for(i=0;i<num;i++){
var nodes = mutations[i].addedNodes;
if(nodes){
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
execute_queue.attachLastForInsertDomNode(DomNodeAnalyzeRoot,nodes[j]);
}
}
}
});
mutation_observer.observe(document.documentElement,{subtree:true,childList:true});
event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
if(mutation_observer){
mutation_observer.disconnect();
mutation_observer = null;
}
});
})();
}else{
(function(){
var event_handler_release;
function DomNodeInsertedFunc(e){
if(enable_analyze){
execute_queue.attachLastForInsertDomNode(DomNodeAnalyzeRoot,e.target);
}
}
// 動的追加時に発生するイベント
document.addEventListener('DOMNodeInserted', DomNodeInsertedFunc, false);
event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
document.removeEventListener('DOMNodeInserted', DomNodeInsertedFunc, false);
});
})();
}
}else{
// DOM の更新を検出できないのでタイマーによるチェック
(function(){
var frame = 0;
var elements = [];
var element_pos = 0;
var task = task_container.createTask();
task.setExecuteFunc(function(task){
if(frame <= 0){
var i;
var num = 5;
if(num > element_pos) num = element_pos;
for(i=0;i<num;i++){
var element = elements[element_pos];
element_pos -= 1;
if(element){
if(!DomNodeGetInserted(element)){
execute_queue.attachLastForInsertDomNode(DomNodeAnalyzeRoot,element);
}
}
}
if(element_pos <= 0){
elements = ElementGetElementsByTagName(document.body,"*");
element_pos = elements.length;
if(element_pos > 0) element_pos -= 1;
frame = 60;
}
}else if(execute_queue.getCountQueue() <= 0){
frame -= 1;
}
});
})();
}
// 解析開始
execute_queue.attachLastForInsertDomNode(DomNodeAnalyzeRoot,document.documentElement);
}
// DOM 構築完了
DocumentGetLoadedDomContent(document,function(){
DocumentLoaded();
});
}
// ------------------------------
// PageExpand プロジェクト
// ------------------------------
function PageExpandProject(){
var _this = this;
// ------------------------------
// ローカルストレージからロード
// ------------------------------
_this.loadLocalStorage = function(func){
_proj_src = null;
function projUpdate(){
try{
_proj_src = PageExpandProjectObjectAppendPreset(_proj_src);
_proj_src = PageExpandProjectObjectUpdate(_proj_src,null);
// 辞書生成
createDictionary();
}catch(e){
projDefault();
return;
}
func({result:true});
}
function projDefault(){
_proj_src = PageExpandProjectObjectUpdate(null,null);
// 辞書生成
createDictionary();
func({result:true});
}
if(project_import_manual){
// 手動のインポート設定を使用
_proj_src = project_import_manual;
projUpdate();
}else{
// ローカルストレージから読み込み
LocalStorageGetItem(_key,function(e){
if(e.result){
try{
_proj_src = JsonParse(e.value);
}catch(e){}
projUpdate();
}else{
projDefault();
}
});
}
};
// ------------------------------
// ローカルストレージへセーブ
// ------------------------------
_this.saveLocalStorage = function(func){
var obj = _this.exportObject();
obj = PageExpandProjectObjectRemovePreset(obj);
LocalStorageSetItem(_key,JsonStringify(obj),function(e){
func(e);
});
};
// ------------------------------
// ローカルストレージから削除
// ------------------------------
_this.removeLocalStorage = function(func){
LocalStorageRemoveItem(_key,function(e){
func(e);
});
};
// ------------------------------
// 同期ストレージからロード
// ------------------------------
_this.loadSyncStorage = function(func){
SyncStorageGetItem(_key,function(e){
if(e.result){
var obj = null;
if(e.value){
obj = JsonParse(e.value);
obj = PageExpandProjectObjectAppendPreset(obj);
}
_proj_src = PageExpandProjectObjectUpdate(obj,null);
// 辞書生成
createDictionary();
func({result:true});
}else{
func(e);
}
});
};
// ------------------------------
// 同期ストレージへセーブ
// ------------------------------
_this.saveSyncStorage = function(func){
var obj = ObjectCopy(_this.getObject());
obj = PageExpandProjectObjectRemovePreset(obj);
SyncStorageSetItem(_key,JsonStringify(obj),function(e){
func(e);
});
};
// ------------------------------
// 同期ストレージから削除
// ------------------------------
_this.removeSyncStorage = function(func){
SyncStorageRemoveItem(_key,function(e){
func(e);
});
};
// ------------------------------
// 初期化
// ------------------------------
_this.initialize = function(json){
_proj_src = null;
_proj_src = PageExpandProjectObjectUpdate(_proj_src,null);
// 辞書生成
createDictionary();
};
// ------------------------------
// JSON 文字列からインポート
// ------------------------------
_this.importJSON = function(json){
_proj_src = JsonParse(json);
_proj_src = PageExpandProjectObjectUpdate(_proj_src,null);
// 辞書生成
createDictionary();
};
// ------------------------------
// オブジェクトからインポート
// ------------------------------
_this.importObject = function(obj){
_proj_src = ObjectCopy(obj);
_proj_src = PageExpandProjectObjectUpdate(_proj_src,null);
// 辞書生成
createDictionary();
};
// ------------------------------
// JSON 文字列をエクスポート
// ------------------------------
_this.exportJSON = function(){
return JsonStringify(_proj_src);
};
// ------------------------------
// オブジェクトをエクスポート
// ------------------------------
_this.exportObject = function(){
return ObjectCopy(_proj_src);
};
// ------------------------------
// オブジェクトを直接取得
// ------------------------------
_this.getObject = function (){
return _proj_src;
};
// ------------------------------
// プロジェクトオブジェクトを取得
// ------------------------------
_this.getProject = function (url){
var i;
var j;
var k;
if(!url){
return _project_unknown.getInstance();
}
// ------------------------------
// キャッシュ有効
// ------------------------------
if(_enable_urlcache){
var cache_obj = _url_cache.getObject(url);
if(!(cache_obj.project)){
var proj_obj = new Object();
// 基本設定
proj_obj.standard = _proj_src.standard;
// ダウンロード設定
proj_obj.download = _proj_src.download;
// 簡易フィルタ
if(cache_obj.enable === undefined){
cache_obj.enable = getEnable(url);
}
proj_obj.enable = cache_obj.enable;
if(proj_obj.enable){
var expand_bbs;
var urlmap;
var expand_bbs_num = _dictionary_expand_bbs.length;
for(i=0;i<expand_bbs_num;i++){
var filter = _dictionary_expand_bbs[i].filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchRegExpList(url,filter[j])){
expand_bbs = _dictionary_expand_bbs[i];
break;
}
}
if(expand_bbs) break;
}
cache_obj.expand_bbs = expand_bbs;
urlmap = cache_obj.urlmap;
if(urlmap === undefined){
urlmap = null;
var urlmap_num = _dictionary_urlmap.length;
for(i=0;i<urlmap_num;i++){
var filter = _dictionary_urlmap[i].filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchRegExpList(url,filter[j])){
urlmap = _dictionary_urlmap[i];
break;
}
}
if(urlmap) break;
}
cache_obj.urlmap = urlmap;
}
if(urlmap){
var urlmap_proj;
if(_enable_instance){
urlmap_proj = urlmap.proj_ins;
}else{
urlmap_proj = urlmap.proj_src;
}
for(var p in urlmap_proj){
proj_obj[p] = urlmap_proj[p];
}
proj_obj.enable_unsecure = urlmap.urlmap.enable_unsecure;
proj_obj.enable_mixed_content = urlmap.urlmap.enable_mixed_content;
}
if(expand_bbs){
proj_obj.expand_bbs = expand_bbs.expand_bbs;
}
// セキュアページ
if(url.indexOf("https://") == 0){
proj_obj.current_secure = true;
}else{
proj_obj.current_secure = false;
}
}
cache_obj.project = proj_obj;
}
return cache_obj.project;
// ------------------------------
// キャッシュ無効
// ------------------------------
}else{
var proj_obj = new Object();
// 基本設定
proj_obj.standard = _proj_src.standard;
// ダウンロード設定
proj_obj.download = _proj_src.download;
// 簡易フィルタ
proj_obj.enable = getEnable(url);
if(proj_obj.enable){
// インスタンス化リスト(コンテント)
var instantiate_content = [
{ asset:"access_block" , func:ProjectObjectInstantiateAccessBlock },
{ asset:"replacement_to_element" , func:ProjectObjectInstantiateReplacementToElement },
{ asset:"replacement_to_text" , func:ProjectObjectInstantiateReplacementToText },
{ asset:"replacement_to_anchor" , func:ProjectObjectInstantiateReplacementToAnchor },
{ asset:"replacement_to_link" , func:ProjectObjectInstantiateReplacementToLink },
{ asset:"make_link_to_text" , func:ProjectObjectInstantiateMakeLinkToText },
{ asset:"expand_short_url" , func:ProjectObjectInstantiateExpandShortUrl },
{ asset:"expand_text" , func:ProjectObjectInstantiateExpandText },
{ asset:"expand_image" , func:ProjectObjectInstantiateExpandImage },
{ asset:"expand_sound" , func:ProjectObjectInstantiateExpandSound },
{ asset:"expand_video" , func:ProjectObjectInstantiateExpandVideo },
{ asset:"expand_iframe" , func:ProjectObjectInstantiateExpandIframe },
{ asset:"style_sheet" , func:ProjectObjectInstantiateStyleSheet },
{ asset:"experimental" , func:ProjectObjectInstantiateExperimental }
];
var instantiate_content_num = instantiate_content.length;
// URLマッピング
var urlmap;
var urlmap_src = _proj_src.urlmap;
var urlmap_num = urlmap_src.length;
for(i=0;i<urlmap_num;i++){
var d = urlmap_src[i];
var u;
if(d.user){
u = d.user;
}else if(d.preset){
u = d.preset;
}
// 有効
if(!(u.enable)) continue;
if(u.filter.type == "asterisk"){
var filter = u.filter.asterisk.filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchAsteriskWord(url,filter[j])){
urlmap = u;
break;
}
}
}else if(u.filter.type == "regexp"){
var filter = u.filter.regexp.filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
var regexp = RegExpObjectGetRegExp(filter[j]);
if(regexp){
if(StringUrlMatchRegExpList(url,[regexp])){
urlmap = u;
break;
}
}
}
}
if(urlmap) break;
}
if(urlmap){
for(j=0;j<instantiate_content_num;j++){
var asset = instantiate_content[j].asset;
var p = urlmap[asset];
if(p.enable){
var define_src = _dictionary_define_src[asset];
var id = p.id;
if((id) && (typeof(id) == "object")){
var ary_src = new Array();
var id_num = id.length;
for(k=0;k<id_num;k++){
ary_src.push(define_src[id[k]]);
}
if(_dictionary_wildcard_src[asset]){
ary_src.push(_dictionary_wildcard_src[asset]);
}
proj_obj[asset] = ary_src;
}else{
proj_obj[asset] = define_src[id];
}
}
}
proj_obj.enable_unsecure = urlmap.enable_unsecure;
proj_obj.enable_mixed_content = urlmap.enable_mixed_content;
}
// 掲示板拡張
var expand_bbs;
var expand_bbs_src = _proj_src.expand_bbs;
var expand_bbs_num = expand_bbs_src.length;
for(i=0;i<expand_bbs_num;i++){
var d = expand_bbs_src[i];
var b;
if(d.user){
b = d.user;
}else if(d.preset){
b = d.preset;
}
// 有効
if(!(b.enable)) continue;
var obj = new Object();
obj.expand_bbs = b;
if(b.filter.type == "asterisk"){
var filter = b.filter.asterisk.filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchAsteriskWord(url,filter[j])){
expand_bbs = b;
break;
}
}
}else if(b.filter.type == "regexp"){
var filter = b.filter.regexp.filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
var regexp = RegExpObjectGetRegExp(filter[j]);
if(regexp){
if(StringUrlMatchRegExpList(url,[regexp])){
expand_bbs = b;
break;
}
}
}
}
if(expand_bbs) break;
}
proj_obj.expand_bbs = expand_bbs;
}
// セキュアページ
if(url.indexOf("https://") == 0){
proj_obj.current_secure = true;
}else{
proj_obj.current_secure = false;
}
return proj_obj;
}
};
// ------------------------------
// ウェブリクエスト用オブジェクトを取得
// ------------------------------
_this.getWebRequest = function(current_url,url){
var web_request_obj;
var cache_obj;
if(current_url){
cache_obj = _url_cache.getObject(current_url);
var urlmap = cache_obj.urlmap;
if(urlmap === undefined){
urlmap = null;
var i;
var j;
var urlmap_num = _dictionary_urlmap.length;
for(i=0;i<urlmap_num;i++){
var filter = _dictionary_urlmap[i].filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchRegExpList(current_url,filter[j])){
urlmap = _dictionary_urlmap[i];
break;
}
}
if(urlmap) break;
}
cache_obj.urlmap = urlmap;
}
if(urlmap){
web_request_obj = urlmap.web_request;
}
}
if(!web_request_obj){
cache_obj = {
enable:true
};
web_request_obj = _wildcard_webrequest;
}
var url_cache = web_request_obj.url_cache;
var obj = url_cache.getObject(url);
if(!(obj.web_request)){
var web_request = new Object();
if(cache_obj.enable === undefined){
cache_obj.enable = getEnable(current_url);
}
if(cache_obj.enable){
var access_block = web_request_obj.access_block;
var replacement_to_useragent = web_request_obj.replacement_to_useragent;
var replacement_to_referer = web_request_obj.replacement_to_referer;
// アクセスブロック
if(access_block){
var i;
var j;
var filters;
var filter_num;
var define;
var define_num = access_block.length;
for(i=0;i<define_num;i++){
define = access_block[i];
filters = define.filter;
filter_num = filters.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchRegExpList(url,filters[j])){
web_request.access_block = true;
break;
}
}
if(web_request.access_block) break;
}
}
// リファラ
if(replacement_to_referer){
var filter = ProjectInstanceDefinesGetFilterFromURL(replacement_to_referer,url);
if(filter){
var referer_obj = new Object();
var send_referer = filter.send_referer;
referer_obj.send_referer = send_referer;
referer_obj.cached = false;
switch(send_referer.type){
case "default":
referer_obj.cached = true;
break;
case "link_url":
referer_obj.referer = url;
referer_obj.cached = true;
break;
case "custom":
referer_obj.referer = send_referer.custom;
referer_obj.cached = true;
break;
}
if(send_referer.regexp.pattern){
referer_obj.regexp = RegExpObjectGetRegExp(send_referer.regexp);
if(referer_obj.referer !== undefined){
referer_obj.referer = RegExpReplacementDollarWord(referer_obj.regexp,referer_obj.referer,send_referer.replacement);
}
}
web_request.replacement_to_referer = referer_obj;
}
}
// ユーザーエージェント
if(replacement_to_useragent){
var filter = ProjectInstanceDefinesGetFilterFromURL(replacement_to_useragent,url);
if(filter){
web_request.replacement_to_useragent = filter.send_useragent.custom;
}
}
}
obj.web_request = web_request;
}
// リファラ
var referer_obj = obj.web_request.replacement_to_referer;
if(referer_obj){
if(!(referer_obj.cached)){
var send_referer = referer_obj.send_referer;
switch(send_referer.type){
case "current_url":
referer_obj.referer = current_url;
break;
}
if(referer_obj.regexp){
if(referer_obj.referer !== undefined){
referer_obj.referer = RegExpReplacementDollarWord(referer_obj.regexp,referer_obj.referer,send_referer.replacement);
}
}
}
}
return obj.web_request;
};
// ------------------------------
// 辞書生成(内部用)
// ------------------------------
function createDictionary(){
var i;
var j;
var k;
// インスタンス化リスト(コンテント)
var instantiate_content = [
{ asset:"access_block" , func:ProjectObjectInstantiateAccessBlock },
{ asset:"replacement_to_element" , func:ProjectObjectInstantiateReplacementToElement },
{ asset:"replacement_to_text" , func:ProjectObjectInstantiateReplacementToText },
{ asset:"replacement_to_anchor" , func:ProjectObjectInstantiateReplacementToAnchor },
{ asset:"replacement_to_link" , func:ProjectObjectInstantiateReplacementToLink },
{ asset:"make_link_to_text" , func:ProjectObjectInstantiateMakeLinkToText },
{ asset:"expand_short_url" , func:ProjectObjectInstantiateExpandShortUrl },
{ asset:"expand_text" , func:ProjectObjectInstantiateExpandText },
{ asset:"expand_image" , func:ProjectObjectInstantiateExpandImage },
{ asset:"expand_sound" , func:ProjectObjectInstantiateExpandSound },
{ asset:"expand_video" , func:ProjectObjectInstantiateExpandVideo },
{ asset:"expand_iframe" , func:ProjectObjectInstantiateExpandIframe },
{ asset:"style_sheet" , func:ProjectObjectInstantiateStyleSheet },
{ asset:"experimental" , func:ProjectObjectInstantiateExperimental }
];
// インスタンス化リスト(ウェブリクエスト)
var instantiate_webrequest = [
{ asset:"access_block" , func:ProjectObjectInstantiateAccessBlock },
{ asset:"replacement_to_referer" , func:ProjectObjectInstantiateReplacementToReferer },
{ asset:"replacement_to_useragent" , func:ProjectObjectInstantiateReplacementToUseragent }
];
var instantiate_content_num = instantiate_content.length;
var instantiate_webrequest_num = instantiate_webrequest.length;
// ------------------------------
// URLキャッシュ辞書を作成
// ------------------------------
if(_enable_urlcache){
_url_cache = new UrlCacheDictionary();
_url_cache.setCacheMax(32);
}
// ------------------------------
// 基本プロジェクト
// ------------------------------
_project_unknown = new Project();
_project_unknown.importObjectForBackground({
enable:true,
standard:_proj_src.standard,
download:_proj_src.download,
expand_bbs:null
});
// ------------------------------
// 基本設定をインスタンス化
// ------------------------------
var std_src = _proj_src.standard;
var std_ins = new Object();
switch(std_src.filter_type){
case "deny":
std_ins.filter_allow = false;
std_ins.filter = std_src.filter_deny;
break;
case "allow":
std_ins.filter_allow = true;
std_ins.filter = std_src.filter_allow;
break;
}
if(_enable_urlcache){
var filter_src = std_ins.filter;
var filter_ins = new Array();
var filter_num = filter_src.length;
for(i=0;i<filter_num;i++){
filter_ins[i] = StringRegExpListFromAsteriskWord(filter_src[i]);
}
std_ins.filter = filter_ins;
}
_standard = std_ins;
// ------------------------------
// 定義を辞書化
// ------------------------------
_dictionary_define_src = new Object();
_dictionary_define_ins = new Object();
_dictionary_wildcard_src = new Object();
_dictionary_wildcard_ins = new Object();
for(i=0;i<instantiate_content_num;i++){
var asset = instantiate_content[i].asset;
var dic = new Object();
var ary = _proj_src[asset];
for(var p in ary){
var d = ary[p];
if(d.user){
dic[d.id] = d.user;
}else if(d.preset){
dic[d.id] = d.preset;
}
}
_dictionary_define_src[asset] = dic;
_dictionary_define_ins[asset] = new Object();
}
if(_enable_webrequest){
for(i=0;i<instantiate_webrequest_num;i++){
var asset = instantiate_webrequest[i].asset;
if(_dictionary_define_ins[asset]) continue;
var dic = new Object();
var ary = _proj_src[asset];
for(var p in ary){
var d = ary[p];
if(d.user){
dic[d.id] = d.user;
}else if(d.preset){
dic[d.id] = d.preset;
}
}
_dictionary_define_src[asset] = dic;
_dictionary_define_ins[asset] = new Object();
if(dic.wildcard){
_dictionary_wildcard_src[asset] = dic.wildcard;
}
}
}
// ------------------------------
// 定義をインスタンス化
// ------------------------------
if(_enable_instance){
for(i=0;i<instantiate_content_num;i++){
var asset = instantiate_content[i].asset;
var func = instantiate_content[i].func;
var src = _dictionary_define_src[asset];
var ins = _dictionary_define_ins[asset];
for(var p in src){
ins[p] = func(src[p]);
}
}
}
if(_enable_webrequest){
for(i=0;i<instantiate_webrequest_num;i++){
var asset = instantiate_webrequest[i].asset;
var func = instantiate_webrequest[i].func;
var src = _dictionary_define_src[asset];
var ins = _dictionary_define_ins[asset];
for(var p in src){
if(ins[p]) continue;
ins[p] = func(src[p]);
}
if(ins.wildcard){
_dictionary_wildcard_ins[asset] = ins.wildcard;
}
}
}
if(_enable_urlcache){
// ------------------------------
// URLマッピングを辞書化
// ------------------------------
_dictionary_urlmap = new Array();
var urlmap_src = _proj_src.urlmap;
var urlmap_num = urlmap_src.length;
for(i=0;i<urlmap_num;i++){
var d = urlmap_src[i];
var u;
if(d.user){
u = d.user;
}else if(d.preset){
u = d.preset;
}
// 有効
if(!(u.enable)) continue;
var obj = new Object();
obj.urlmap = u;
obj.filter = ProjectObjectInstantiateUrlEditContainer(u.filter);
var proj_src = new Object();
var proj_ins = new Object();
for(j=0;j<instantiate_content_num;j++){
var asset = instantiate_content[j].asset;
var p = u[asset];
if(p.enable){
var define_src = _dictionary_define_src[asset];
var define_ins = _dictionary_define_ins[asset];
var id = p.id;
if((id) && (typeof(id) == "object")){
var ary_src = new Array();
var ary_ins = new Array();
var id_num = id.length;
for(k=0;k<id_num;k++){
ary_src.push(define_src[id[k]]);
ary_ins.push(define_ins[id[k]]);
}
proj_src[asset] = ary_src;
proj_ins[asset] = ary_ins;
}else{
proj_src[asset] = define_src[id];
proj_ins[asset] = define_ins[id];
}
}
if(_dictionary_wildcard_src[asset]){
if(proj_src[asset]){
proj_src[asset].push(_dictionary_wildcard_src[asset]);
}else{
proj_src[asset] = [_dictionary_wildcard_src[asset]];
}
}
}
obj.proj_src = proj_src;
obj.proj_ins = proj_ins;
if(_enable_webrequest){
var web_request = new Object();
for(j=0;j<instantiate_webrequest_num;j++){
var asset = instantiate_webrequest[j].asset;
var p = u[asset];
if(p.enable){
var define_ins = _dictionary_define_ins[asset];
var id = p.id;
if((id) && (typeof(id) == "object")){
var ary_ins = new Array();
var id_num = id.length;
for(k=0;k<id_num;k++){
ary_ins.push(define_ins[id[k]]);
}
web_request[asset] = ary_ins;
}else{
web_request[asset] = define_ins[id];
}
}
if(_dictionary_wildcard_ins[asset]){
if(web_request[asset]){
web_request[asset].push(_dictionary_wildcard_ins[asset]);
}else{
web_request[asset] = [_dictionary_wildcard_ins[asset]];
}
}
}
// URLキャッシュ辞書を作成
var url_cache = new UrlCacheDictionary();
url_cache.setCacheMax(64);
web_request.url_cache = url_cache;
obj.web_request = web_request;
}
_dictionary_urlmap.push(obj);
}
// ------------------------------
// ワイルドカードウェブリクエスト
// ------------------------------
if(_enable_webrequest){
_wildcard_webrequest = new Object();
for(i=0;i<instantiate_webrequest_num;i++){
var asset = instantiate_webrequest[i].asset;
if(_dictionary_wildcard_ins[asset]){
_wildcard_webrequest[asset] = [_dictionary_wildcard_ins[asset]];
}
}
var url_cache = new UrlCacheDictionary();
url_cache.setCacheMax(128);
_wildcard_webrequest.url_cache = url_cache;
}
// ------------------------------
// BBS拡張を辞書化
// ------------------------------
_dictionary_expand_bbs = new Array();
var expand_bbs_src = _proj_src.expand_bbs;
var expand_bbs_num = expand_bbs_src.length;
for(i=0;i<expand_bbs_num;i++){
var d = expand_bbs_src[i];
var b;
if(d.user){
b = d.user;
}else if(d.preset){
b = d.preset;
}
// 有効
if(!(b.enable)) continue;
var obj = new Object();
obj.expand_bbs = b;
obj.filter = ProjectObjectInstantiateUrlEditContainer(b.filter);
// インスタンス化
if(_enable_instance){
obj.expand_bbs = ProjectObjectInstantiateExpandBbs(obj.expand_bbs);
}
_dictionary_expand_bbs.push(obj);
}
}
}
// ------------------------------
// 言語を習得
// ------------------------------
_this.getLanguage = function(){
try{
var type = _proj_src.language.type;
var code = [
"ja", // 日本語
"en" // 英語
];
if(0 <= type && type < code.length){
return code[type];
}
}catch(e){
}
// 自動判定
var language = NavigatorGetBrowserLanguage();
return language;
};
// ------------------------------
// 有効であるかを取得(内部用)
// ------------------------------
function getEnable(url){
var filter = _standard.filter;
var i;
var filter_num = filter.length;
if(_enable_urlcache){
for(i=0;i<filter_num;i++){
if(StringUrlMatchRegExpList(url,filter[i])){
if(_standard.filter_allow) return true;
return false;
}
}
}else{
for(i=0;i<filter_num;i++){
if(StringUrlMatchAsteriskWord(url,filter[i])){
if(_standard.filter_allow) return true;
return false;
}
}
}
if(_standard.filter_allow) return false;
return true;
}
// ------------------------------
// プライベート変数
// ------------------------------
var _proj_src;
var _key;
var _standard;
var _dictionary_urlmap;
var _dictionary_expand_bbs;
var _dictionary_wildcard_src;
var _dictionary_wildcard_ins;
var _dictionary_define_src;
var _dictionary_define_ins;
var _url_cache;
var _project_unknown;
var _wildcard_webrequest;
var _enable_urlcache;
var _enable_webrequest;
var _enable_instance;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_key = "PageExpandProject";
_enable_urlcache = false;
_enable_webrequest = false;
_enable_instance = false;
})();
}
// ------------------------------
// プロジェクト
// ------------------------------
function Project(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_replacement_to_link_dictionary.release();
_replacement_to_link_dictionary = null;
_proj_src = null;
_proj_ins = null;
};
// ------------------------------
// JSON 文字列からインポート
// ------------------------------
_this.importJSON = function(json){
_this.importObject(JsonParse(json));
};
// ------------------------------
// オブジェクトからインポート
// ------------------------------
_this.importObject = function(obj){
_proj_src = obj;
instantiate();
};
// ------------------------------
// オブジェクトからインポート(バックグラウンド用)
// ------------------------------
_this.importObjectForBackground = function(obj){
_proj_src = obj;
_proj_ins = {
enable:_proj_src.enable,
standard:_proj_src.standard,
download:_proj_src.download,
expand_bbs:_proj_src.expand_bbs
};
};
// ------------------------------
// インスタンスを取得
// ------------------------------
_this.getInstance = function(){
return _proj_ins;
};
// ------------------------------
// インスタンスをセット
// ------------------------------
_this.setInstance = function(obj){
_proj_ins = obj;
};
// ------------------------------
// インスタンス化(内部用)
// ------------------------------
function instantiate(){
_proj_ins = new Object();
_proj_ins.enable = _proj_src.enable;
_proj_ins.current_secure = _proj_src.current_secure;
_proj_ins.enable_unsecure = _proj_src.enable_unsecure;
_proj_ins.enable_mixed_content = _proj_src.enable_mixed_content;
_proj_ins.standard = _proj_src.standard;
_proj_ins.download = _proj_src.download;
// インスタンス化リスト(コンテント)
var instantiate_project = [
{ asset:"access_block" , func:ProjectObjectInstantiateAccessBlock },
{ asset:"replacement_to_element" , func:ProjectObjectInstantiateReplacementToElement },
{ asset:"replacement_to_text" , func:ProjectObjectInstantiateReplacementToText },
{ asset:"replacement_to_anchor" , func:ProjectObjectInstantiateReplacementToAnchor },
{ asset:"replacement_to_link" , func:ProjectObjectInstantiateReplacementToLink },
{ asset:"make_link_to_text" , func:ProjectObjectInstantiateMakeLinkToText },
{ asset:"expand_short_url" , func:ProjectObjectInstantiateExpandShortUrl },
{ asset:"expand_text" , func:ProjectObjectInstantiateExpandText },
{ asset:"expand_image" , func:ProjectObjectInstantiateExpandImage },
{ asset:"expand_sound" , func:ProjectObjectInstantiateExpandSound },
{ asset:"expand_video" , func:ProjectObjectInstantiateExpandVideo },
{ asset:"expand_iframe" , func:ProjectObjectInstantiateExpandIframe },
{ asset:"style_sheet" , func:ProjectObjectInstantiateStyleSheet },
{ asset:"experimental" , func:ProjectObjectInstantiateExperimental },
{ asset:"expand_bbs" , func:ProjectObjectInstantiateExpandBbs }
];
var instantiate_project_num = instantiate_project.length;
var i;
var j;
for(i=0;i<instantiate_project_num;i++){
var asset = instantiate_project[i].asset;
var func = instantiate_project[i].func;
var define = _proj_src[asset];
if(!define) continue;
if(typeof(define) != "object") continue;
if(define.constructor == Array){
var ary_src = define;
var ary_ins = new Array();
var num = ary_src.length;
for(j=0;j<num;j++){
ary_ins[j] = func(ary_src[j]);
}
_proj_ins[asset] = ary_ins;
}else{
_proj_ins[asset] = func(_proj_src[asset]);
}
}
}
// ------------------------------
// 実行可能であるか取得
// ------------------------------
_this.getEnable = function(){
return _proj_ins.enable;
};
// ------------------------------
// デバッグモードが有効であるか
// ------------------------------
_this.getEnableDebugMode = function(){
return _proj_ins.standard.enable_debug_mode;
};
// ------------------------------
// ログ出力が有効であるか
// ------------------------------
_this.getEnableOutputLog = function(){
return _proj_ins.standard.enable_output_log;
};
// ------------------------------
// アドレスバーアイコンが有効であるか
// ------------------------------
_this.getEnableIconAddressBar = function(){
return _proj_ins.standard.enable_icon_address_bar;
};
// ------------------------------
// コンテキストメニューが有効か
// ------------------------------
_this.getEnableContextMenu = function(){
return _proj_ins.standard.enable_context_menu;
};
// ------------------------------
// ロード完了時から動作を開始するか
// ------------------------------
_this.getEnableStartup = function(){
return _proj_ins.standard.enable_startup;
};
// ------------------------------
// ロードスレッドの最大数
// ------------------------------
_this.getLoadThreadMax = function(){
var v = _proj_ins.download.load.thread_max;
if(v < 1) v = 1;
return v;
};
// ------------------------------
// ロードのタイムアウト
// ------------------------------
_this.getLoadTimeout = function(){
var v = _proj_ins.download.load.timeout;
if(v < 0) v = 0;
return v;
};
// ------------------------------
// ダウンロードスレッドの最大数
// ------------------------------
_this.getDownloadThreadMax = function(){
var v = _proj_ins.download.download.thread_max;
if(v < 1) v = 1;
return v;
};
// ------------------------------
// ダウンロードファイル名衝突時
// ------------------------------
_this.getDownloadConflict = function(){
return _proj_ins.download.download.conflict_type;
};
// ------------------------------
// 実行キューの占有時間
// ------------------------------
_this.getExecuteQueueOccupancyTime = function(){
var v = _proj_ins.standard.execute_queue.time_occupancy;
if(v < 0) v = 0;
if(v > 5000) v = 5000;
return v;
};
// ------------------------------
// 実行キューのスリープ時間
// ------------------------------
_this.getExecuteQueueSleepTime = function(){
var v = _proj_ins.standard.execute_queue.time_sleep;
if(v < 0) v = 0;
if(v > 1000) v = 1000;
return v;
};
// ------------------------------
// セキュアなページか
// ------------------------------
_this.getSecureCurrent = function(){
return _proj_ins.current_secure;
};
// ------------------------------
// アンセキュアなアクセスが許可されているか
// ------------------------------
_this.checkAllowUnsecure = function(url){
if(_proj_ins.enable_unsecure) return true;
if(_proj_ins.current_secure){
if(url.indexOf("http://") == 0){
return false;
}
}
return true;
};
// ------------------------------
// IFRAME 要素の展開が可能か
// ------------------------------
_this.checkAllowExpandIframeElement = function(url){
return true;
};
// ------------------------------
// EMBED 要素の展開が可能か
// ------------------------------
_this.checkAllowExpandEmbedElement = function(url){
return true;
};
// ------------------------------
// タッチ入力を使用するか
// ------------------------------
_this.enableInputTouch = function(){
if(!(window.TouchEvent)) return false;
return _proj_ins.standard.enable_input_touch;
};
// ------------------------------
// ダブルタッチ補助線を使用するか
// ------------------------------
_this.enableDoubleTouchAssist = function(){
if(!(window.TouchEvent)) return false;
return _proj_ins.standard.enable_double_touch_assist;
};
// ------------------------------
// アクセス遮断対象か調べる
// ------------------------------
_this.checkAccessBlock = function(url){
if(!(_proj_ins.access_block)){
return false;
}
var i;
var j;
var filters;
var filter_num;
var define;
var defines = _proj_ins.access_block;
var define_num = defines.length;
for(i=0;i<define_num;i++){
define = defines[i];
filters = define.filter;
filter_num = filters.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchRegExpList(url,filters[j])){
return true;
}
}
}
return false;
};
// ------------------------------
// エレメントの置換が可能であるか取得
// ------------------------------
_this.getEnableReplacementToElement = function(){
return _proj_ins.replacement_to_element;
};
// ------------------------------
// エレメントの置換用関数を実行
// ------------------------------
_this.executeScriptReplacementToElement = function(element,response){
var defines = _proj_ins.replacement_to_element;
var count = 0;
var define_num = defines.length;
var info = {element:element};
var result = {};
function func(param){
if((param) && (typeof(param) == "object")){
var k;
for(k in param){
result[k] = param[k];
}
}
if(define_num <= count){
response(result);
return;
}
var define = defines[count];
count++;
var ary = define.script;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,func)){
break;
}
}
}else{
func({});
}
}
func({});
};
// ------------------------------
// テキストの置換が可能であるか取得
// ------------------------------
_this.getEnableReplacementToText = function(){
return _proj_ins.replacement_to_text;
};
// ------------------------------
// テキストの置換用関数を実行
// ------------------------------
_this.executeScriptReplacementToText = function(element,response){
var defines = _proj_ins.replacement_to_text;
var count = 0;
var define_num = defines.length;
var info = {text_node:element};
var result = {};
function func(param){
if((param) && (typeof(param) == "object")){
var k;
for(k in param){
result[k] = param[k];
}
}
if(define_num <= count){
response(result);
return;
}
var define = defines[count];
count++;
var ary = define.script;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,func)){
break;
}
}
}else{
func({});
}
}
func({});
};
// ------------------------------
// アンカーの置換が可能であるか取得
// ------------------------------
_this.getEnableReplacementToAnchor = function(){
return _proj_ins.replacement_to_anchor;
};
// ------------------------------
// アンカーの置換用関数を実行
// ------------------------------
_this.executeScriptReplacementToAnchor = function(element,event_dispatcher,response){
var defines = _proj_ins.replacement_to_anchor;
var count = 0;
var define_num = defines.length;
var info = {anchor_element:element,event_dispatcher:event_dispatcher};
var result = {};
function func(param){
if((param) && (typeof(param) == "object")){
var k;
for(k in param){
result[k] = param[k];
}
}
if(define_num <= count){
response(result);
return;
}
var define = defines[count];
count++;
var ary = define.script;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,func)){
break;
}
}
}else{
func({});
}
}
func({});
};
// ------------------------------
// ハイパーリンクの置換が可能であるか取得
// ------------------------------
_this.getEnableReplacementToLink = function(){
return _proj_ins.replacement_to_link;
};
// ------------------------------
// リンク置換用オブジェクト取得
// ------------------------------
_this.getReplacementToLink = function(element){
var _link_container = new Object();
// ------------------------------
// アイテムを作成
// ------------------------------
function createItem(){
var _page = new Object();
// ------------------------------
// 完了状態を取得
// ------------------------------
_page.getCompleted = function(){
return _page.completed;
};
// ------------------------------
// 完了状態をセット
// ------------------------------
_page.setCompleted = function(){
_page.completed = true;
};
// ------------------------------
// リザルトデータを取得
// ------------------------------
_page.getResult = function(){
return _page.result;
};
// ------------------------------
// リザルトデータをセット
// ------------------------------
_page.setResult = function(result){
_page.result = result;
};
// ------------------------------
// フィルタをセット
// ------------------------------
_page.setFilter = function(filter){
_page._filter = filter;
};
// ------------------------------
// リンクの変更をアンカーに反映するか
// ------------------------------
_page.getEnableReflectToAnchor = function(){
if(_page._filter){
return _page._filter.enable_reflect_to_anchor;
}
return false;
};
// ------------------------------
// キャッシュが有効か
// ------------------------------
_page.getEnableCache = function(){
if(_page._filter){
return _page._filter.enable_cache;
}
return false;
};
// ------------------------------
// イベントディスパッチャーを開放
// ------------------------------
_page.releaseEventDispatcher = function(){
if(_page.event_dispatcher){
_page.event_dispatcher.release();
_page.event_dispatcher = null;
}
};
// ------------------------------
// イベントハンドラを作成
// ------------------------------
_page.createEventHandler = function(type){
return _page._event_dispatcher.createEventHandler(type);
};
// ------------------------------
// 発火
// ------------------------------
_page.dispatchEvent = function(name,param){
_page._event_dispatcher.dispatchEvent(name,param);
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
_page.completed = false;
_page.result = null;
_page._event_dispatcher = new EventDispatcher();
_page._filter = null;
})();
return _page;
}
// ------------------------------
// ハイパーリンクの置換用関数を実行
// ------------------------------
_link_container.executeScript = function(callback){
var info = {anchor_element:element};
var filter = null;
var filter_pos = 0;
// 結果
function response(r){
if(r.result){
callback({
result:r,
filter:filter
});
return;
}
execute();
}
// 失敗
function failure(){
callback({
result:{result:false},
filter:filter
});
}
// 実行
function execute(){
filter = _filters[filter_pos];
filter_pos += 1;
if(!filter){
failure();
return;
}
var ary = filter.script;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
return;
}
execute();
}
if(_filters){
execute();
return;
}
failure();
};
// ------------------------------
// 結果を取得
// ------------------------------
_link_container.getResult = function(callback){
function executeScript(page){
_link_container.executeScript(function(r){
page.setFilter(r.filter);
page.setResult(r.result);
callback(page);
// 初回実行
if(!page.getCompleted()){
page.setCompleted();
// イベント発火
if(page.getEnableCache()){
page.dispatchEvent("complete",page);
}else{
page.dispatchEvent("execute",page);
}
// イベント開放
page.releaseEventDispatcher();
}
});
}
var url = element.href;
// ページを取得
var page = _replacement_to_link_dictionary.getObject(url);
// キャッシュ無し
if(!page){
// ページを登録
page = createItem();
_replacement_to_link_dictionary.setObject(url,page);
// 初回実行
executeScript(page);
// 実行完了済み
}else if(page.getCompleted()){
if(page.getEnableCache()){
callback(page);
}else{
executeScript(page);
}
// 実行完了待ち
}else{
// 実行イベント登録
var event_handler = page.createEventHandler("execute");
event_handler.setFunction(function(page){
executeScript(page);
});
// 完了イベント登録
var event_handler = page.createEventHandler("complete");
event_handler.setFunction(function(page){
callback(page);
});
}
};
// ------------------------------
// プライベート変数
// ------------------------------
var _filters;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_filters = ProjectInstanceDefinesGetAllFiltersFromURL(_proj_ins.replacement_to_link,element.href);
})();
return _link_container;
};
// ------------------------------
// リンク置換用辞書
// ------------------------------
function ReplacementToLinkDictionary(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_dictionary = null;
};
// ------------------------------
// オブジェクトを取得
// ------------------------------
_this.getObject = function(key){
return _dictionary[key];
};
// ------------------------------
// オブジェクトをセット
// ------------------------------
_this.setObject = function(key,obj){
_dictionary[key] = obj;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _dictionary;
// ------------------------------
// 初期化
// ------------------------------
_dictionary = new Object();
}
// ------------------------------
// リファラの置換が可能であるか取得
// ------------------------------
_this.getEnableReplacementToReferer = function(){
return _proj_ins.replacement_to_referer;
};
// ------------------------------
// ユーザーエージェントの置換が可能であるか取得
// ------------------------------
_this.getEnableReplacementToUserAgent = function(){
return _proj_ins.replacement_to_useragent;
};
// ------------------------------
// ハイパーリンク化が可能であるか取得
// ------------------------------
_this.getEnableMakeLinkToText = function(){
return _proj_ins.make_link_to_text;
};
// ------------------------------
// ハイパーリンク化用関数を実行
// ------------------------------
_this.executeScriptMakeLinkToText = function(element,response){
var info = {text_node:element};
var ary = _proj_ins.make_link_to_text.script;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({});
}
};
// ------------------------------
// 短縮 URL の展開が可能であるか取得
// ------------------------------
_this.getEnableExpandShortUrl = function(){
return _proj_ins.expand_short_url;
};
// ------------------------------
// 短縮 URL の展開対象か調べる
// ------------------------------
_this.checkExpandShortUrl = function(url){
if(!(_proj_ins.expand_short_url)){
return false;
}
var a = _proj_ins.expand_short_url.filter;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(StringUrlMatchRegExpList(url,a[i])){
return true;
}
}
return false;
};
// ------------------------------
// BBSの展開が可能であるか取得
// ------------------------------
_this.getEnableExpandBbs = function(){
if(_proj_ins.expand_bbs){
return true;
}
return false;
};
// ------------------------------
// 掲示板拡張ポップアップアニメーションが有効であるか取得
// ------------------------------
_this.getEnableAnimationPopupBbsResponse = function(){
return _proj_ins.expand_bbs.popup.enable_animation;
};
// ------------------------------
// 掲示板拡張ポップアップの表示座標系を取得
// ------------------------------
_this.getOriginPopupExpandBbsResponse = function(){
return _proj_ins.expand_bbs.popup.origin_type;
};
// ------------------------------
// 掲示板拡張ポップアップの表示基点を取得
// ------------------------------
_this.getStylePositionPopupBbsResponse = function(){
return _proj_ins.expand_bbs.popup.position_type;
};
// ------------------------------
// 掲示板拡張ポップアップの表示基点を取得
// ------------------------------
_this.getPercentPopupBbsResponse = function(){
return _proj_ins.expand_bbs.popup.percent;
};
// ------------------------------
// 掲示板拡張ポップアップの開くまでに待機する時間を取得
// ------------------------------
_this.getTimeWaitOpenPopupExpandBbsResponse = function(){
return _proj_ins.expand_bbs.popup.time_wait_open;
};
// ------------------------------
// 掲示板拡張ポップアップの閉じるまでに待機する時間を取得
// ------------------------------
_this.getTimeWaitClosePopupExpandBbsResponse = function(){
return _proj_ins.expand_bbs.popup.time_wait_close;
};
// ------------------------------
// 掲示板拡張レスポンスポップアップ表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandBbsPopupResponse = function(){
return _proj_ins.expand_bbs.popup.style_sheet;
};
// ------------------------------
// 掲示板拡張用初期化関数
// ------------------------------
_this.initializeScriptCallbackExpandBbs = function(response){
var info = {work:expand_bbs.work};
var ary = _proj_ins.expand_bbs.script_initialize;
var i;
var num = ary.length;
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
};
// ------------------------------
// 掲示板拡張用コールバック関数
// ------------------------------
_this.executeScriptCallbackExpandBbs = function(element,response){
var info = {element:element,work:expand_bbs.work};
var ary = _proj_ins.expand_bbs.script_callback;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({useful:false});
}
};
// ------------------------------
// テキストの展開が可能であるか取得
// ------------------------------
_this.getEnableExpandText = function(){
return _proj_ins.expand_text;
};
// ------------------------------
// 同一のテキストはインライン展開しない
// ------------------------------
_this.getDisableSameInlineText = function(){
if(_proj_ins.expand_text){
return _proj_ins.expand_text.inline.disable_same_text;
}
return false;
};
// ------------------------------
//テキストのインライン展開を許可するかコールバック関数
// ------------------------------
_this.executeScriptAllowInlineText = function(element,url,content_type,response){
var info = {anchor_element:element,current_element:element,url:url,content_type:content_type};
var ary = _proj_ins.expand_text.inline.script_allow;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({result:false});
}
};
// ------------------------------
// テキストのインライン展開の挿入コールバック実行
// ------------------------------
_this.executeScriptInsertInlineText = function(element,textarea,event_dispatcher,response){
var info = {anchor_element:element,current_element:element,textarea_element:textarea,event_dispatcher:event_dispatcher};
var ary = _proj_ins.expand_text.inline.script_insert;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response();
}
};
// ------------------------------
// イメージの展開が可能であるか取得
// ------------------------------
_this.getEnableExpandImage = function(){
return _proj_ins.expand_image;
};
// ------------------------------
// 同一の画像はサムネイル化しない
// ------------------------------
_this.getDisableSameThumbnailImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.thumbnail.disable_same_image;
}
return false;
};
// ------------------------------
// ポップアップイメージを表示するか取得
// ------------------------------
_this.getEnablePopupImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.popup.enable_popup_mouseover;
}
return false;
};
// ------------------------------
// ポップアップアニメーションが有効であるか取得
// ------------------------------
_this.getEnableAnimationPopupImage = function(){
if(_proj_ins.expand_image.popup.enable_animation_scale) return true;
if(_proj_ins.expand_image.popup.enable_animation_alpha) return true;
return false;
};
// ------------------------------
// ポップアップアニメーションが有効であるか取得(スケール)
// ------------------------------
_this.getEnableScaleAnimationPopupImage = function(){
return _proj_ins.expand_image.popup.enable_animation_scale;
};
// ------------------------------
// ポップアップアニメーションが有効であるか取得(アルファ)
// ------------------------------
_this.getEnableAlphaAnimationPopupImage = function(){
return _proj_ins.expand_image.popup.enable_animation_alpha;
};
// ------------------------------
// サムネイルイメージを表示するか取得
// ------------------------------
_this.getEnableThumbnailImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.thumbnail.enable_thumbnail;
}
return false;
};
// ------------------------------
// サムネイルイメージをポップアップ化するか取得
// ------------------------------
_this.getEnablePopupMouseoverToThumbnailImage = function(){
return _proj_ins.expand_image.thumbnail.enable_popup_mouseover;
};
// ------------------------------
// イメージのサムネイル展開を許可するかコールバック関数
// ------------------------------
_this.executeScriptAllowThumbnailImage = function(element,url,content_type,response){
var info = {anchor_element:element,current_element:element,url:url,content_type:content_type};
var ary = _proj_ins.expand_image.thumbnail.script_allow;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({result:false});
}
};
// ------------------------------
// サムネイルイメージの挿入コールバック実行
// ------------------------------
_this.executeScriptInsertThumbnailImage = function(element,image,event_dispatcher,response){
var info = {anchor_element:element,current_element:element,image_element:image,event_dispatcher:event_dispatcher};
var ary = _proj_ins.expand_image.thumbnail.script_insert;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response();
}
};
// ------------------------------
// サムネイルイメージのプリロード設定を取得
// ------------------------------
_this.getEnablePreLoadThumbnailImage = function(){
if(_proj_ins.expand_image.thumbnail.load_type == "preload") return true;
return false;
};
// ------------------------------
// ポップアップイメージのプリロード設定を取得
// ------------------------------
_this.getEnablePreLoadPopupImage = function(){
if(_proj_ins.expand_image.popup.load_type == "preload") return true;
return false;
};
// ------------------------------
// ポップアップイメージの表示座標系を取得
// ------------------------------
_this.getOriginPopupImage = function(){
return _proj_ins.expand_image.popup.origin_type;
};
// ------------------------------
// ポップアップイメージの表示基点を取得
// ------------------------------
_this.getStylePositionPopupImage = function(){
return _proj_ins.expand_image.popup.position_type;
};
// ------------------------------
// ポップアップイメージの表示サイズを取得
// ------------------------------
_this.getScalePercentPopupImage = function(){
return _proj_ins.expand_image.popup.scale_percent;
};
// ------------------------------
// ポップアップイメージを開くまでに待機する時間を取得
// ------------------------------
_this.getTimeWaitOpenPopupImage = function(){
return _proj_ins.expand_image.popup.time_wait_open;
};
// ------------------------------
// ポップアップイメージを閉じるまでに待機する時間を取得
// ------------------------------
_this.getTimeWaitClosePopupImage = function(){
return _proj_ins.expand_image.popup.time_wait_close;
};
// ------------------------------
// イメージのポップアップ展開を許可するかコールバック関数
// ------------------------------
_this.executeScriptAllowPopupImage = function(element,url,content_type,response){
var info = {anchor_element:element,current_element:element,url:url,content_type:content_type};
var ary = _proj_ins.expand_image.popup.script_allow;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({result:false});
}
};
// ------------------------------
// 縮小イメージのポップアップが可能であるか取得
// ------------------------------
_this.getEnablePopupReducedImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.reduced_image.enable_popup;
}
return false;
};
// ------------------------------
// 縮小イメージのポップアップが有効となる縮小値
// ------------------------------
_this.getScaleLessThenAllowPopupReducedImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.reduced_image.popup_allow_slcale_less_then;
}
return false;
};
// ------------------------------
// イメージのロード通知が有効であるか取得
// ------------------------------
_this.getEnableLoadNotifyExpandImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.load.enable_notify;
}
return false;
};
// ------------------------------
// イメージのソースタイプを取得
// ------------------------------
_this.getSourceLoadExpandImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.load.src_type;
}
return "mixed_content";
};
// ------------------------------
// イメージのアンロードが有効であるか取得
// ------------------------------
_this.getEnableUnloadExpandImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.load.enable_unload;
}
return false;
};
// ------------------------------
// イメージのアンロードサイズを取得
// ------------------------------
_this.getSizeMoreThenAllowUnloadExpandImage = function(){
if(_proj_ins.expand_image){
return _proj_ins.expand_image.load.unload_allow_size_more_then;
}
return false;
};
// ------------------------------
// サウンドの展開が可能であるか取得
// ------------------------------
_this.getEnableExpandSound = function(){
return _proj_ins.expand_sound;
};
// ------------------------------
// 同一のオーディオはインライン展開しない
// ------------------------------
_this.getDisableSameInlineSound = function(){
if(_proj_ins.expand_sound){
return _proj_ins.expand_sound.inline.disable_same_audio;
}
return false;
};
// ------------------------------
// インライン表示オーディオの最大表示数
// ------------------------------
_this.getSoundMaxInlineSound = function(){
if(_proj_ins.expand_sound){
return _proj_ins.expand_sound.inline.sound_max;
}
return 0;
};
// ------------------------------
//オーディオのインライン展開を許可するかコールバック関数
// ------------------------------
_this.executeScriptAllowInlineSound = function(element,url,content_type,response){
var info = {anchor_element:element,current_element:element,url:url,content_type:content_type};
var ary = _proj_ins.expand_sound.inline.script_allow;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({result:false});
}
};
// ------------------------------
// オーディオのインライン展開の挿入コールバック実行
// ------------------------------
_this.executeScriptInsertInlineSound = function(element,audio,event_dispatcher,response){
var info = {anchor_element:element,current_element:element,element:audio,event_dispatcher:event_dispatcher};
var ary = _proj_ins.expand_sound.inline.script_insert;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response();
}
};
// ------------------------------
// AudioElement の展開を許可するかコールバック関数
// ------------------------------
_this.executeScriptAllowAudioElement = function(element,url,content_type,response){
var info = {anchor_element:element,current_element:element,url:url,content_type:content_type};
var ary = _proj_ins.expand_sound.audio_element.script_allow;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({result:false});
}
};
// ------------------------------
// SoundCloud のプレイヤー (Flash 版) を表示するか
// ------------------------------
_this.getVisiblePlayerFlashSoundcloud = function(){
return _proj_ins.expand_sound.soundcloud.visible_player_flash;
};
// ------------------------------
// SoundCloud のプレイヤー (HTML5 版) を表示するか
// ------------------------------
_this.getVisiblePlayerHtml5Soundcloud = function(){
return _proj_ins.expand_sound.soundcloud.visible_player_html5;
};
// ------------------------------
// MixCloud のプレイヤーを表示するか
// ------------------------------
_this.getVisiblePlayerMixcloud = function(){
return _proj_ins.expand_sound.mixcloud.visible_player;
};
// ------------------------------
// ビデオの展開が可能であるか取得
// ------------------------------
_this.getEnableExpandVideo = function(){
return _proj_ins.expand_video;
};
// ------------------------------
// 同一のビデオはインライン展開しない
// ------------------------------
_this.getDisableSameInlineVideo = function(){
if(_proj_ins.expand_video){
return _proj_ins.expand_video.inline.disable_same_video;
}
return false;
};
// ------------------------------
// インライン表示ビデオの最大表示数
// ------------------------------
_this.getVideoMaxInlineVideo = function(){
if(_proj_ins.expand_video){
return _proj_ins.expand_video.inline.video_max;
}
return 0;
};
// ------------------------------
// ビデオのインライン展開を許可するかコールバック関数
// ------------------------------
_this.executeScriptAllowInlineVideo = function(element,url,content_type,response){
var info = {anchor_element:element,current_element:element,url:url,content_type:content_type};
var ary = _proj_ins.expand_video.inline.script_allow;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({result:false});
}
};
// ------------------------------
// ビデオのインライン展開の挿入コールバック実行
// ------------------------------
_this.executeScriptInsertInlineVideo = function(element,video,event_dispatcher,response){
var info = {anchor_element:element,current_element:element,element:video,event_dispatcher:event_dispatcher};
var ary = _proj_ins.expand_video.inline.script_insert;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response();
}
};
// ------------------------------
// VideoElement の展開を許可するかコールバック関数
// ------------------------------
_this.executeScriptAllowVideoElement = function(element,url,content_type,response){
var info = {anchor_element:element,current_element:element,url:url,content_type:content_type};
var ary = _proj_ins.expand_video.video_element.script_allow;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({result:false});
}
};
// ------------------------------
// youtube のビデオを表示するか
// ------------------------------
_this.getVisibleVideoYoutube = function(){
return _proj_ins.expand_video.youtube.visible_video;
};
// ------------------------------
// nicovideo のビデオを表示するか
// ------------------------------
_this.getVisibleVideoNicovideo = function(){
return _proj_ins.expand_video.nicovideo.visible_video;
};
// ------------------------------
// nicovideo のビデオサムネイルを表示するか
// ------------------------------
_this.getVisibleThumbnailVideoNicovideo = function(){
return _proj_ins.expand_video.nicovideo.visible_thumbnail_video;
};
// ------------------------------
// nicovideo のマイリストサムネイルを表示するか
// ------------------------------
_this.getVisibleThumbnailMylistNicovideo = function(){
return _proj_ins.expand_video.nicovideo.visible_thumbnail_mylist;
};
// ------------------------------
// nicovideo のユーザーサムネイルを表示するか
// ------------------------------
_this.getVisibleThumbnailUserNicovideo = function(){
return _proj_ins.expand_video.nicovideo.visible_thumbnail_user;
};
// ------------------------------
// nicovideo のコミュニティサムネイルを表示するか
// ------------------------------
_this.getVisibleThumbnailCommunityNicovideo = function(){
return _proj_ins.expand_video.nicovideo.visible_thumbnail_community;
};
// ------------------------------
// nicovideo の生放送サムネイルを表示するか
// ------------------------------
_this.getVisibleThumbnailLiveNicovideo = function(){
return _proj_ins.expand_video.nicovideo.visible_thumbnail_live;
};
// ------------------------------
// nicovideo の静画サムネイルを表示するか
// ------------------------------
_this.getVisibleThumbnailSeigaNicovideo = function(){
return _proj_ins.expand_video.nicovideo.visible_thumbnail_seiga;
};
// ------------------------------
// ustream の配信ビデオを表示するか
// ------------------------------
_this.getVisibleVideoLiveUstream = function(){
return _proj_ins.expand_video.ustream.visible_video_live;
};
// ------------------------------
// ustream の録画ビデオを表示するか
// ------------------------------
_this.getVisibleVideoRecordUstream = function(){
return _proj_ins.expand_video.ustream.visible_video_record;
};
// ------------------------------
// dailymotion の録画ビデオを表示するか
// ------------------------------
_this.getVisibleVideoDailymotion = function(){
return _proj_ins.expand_video.dailymotion.visible_video;
};
// ------------------------------
// vimeo の録画ビデオを表示するか
// ------------------------------
_this.getVisibleVideoVimeo = function(){
return _proj_ins.expand_video.vimeo.visible_video;
};
// ------------------------------
// fc2video の録画ビデオを表示するか
// ------------------------------
_this.getVisibleVideoFc2video = function(){
return _proj_ins.expand_video.fc2video.visible_video;
};
// ------------------------------
// LiveLeak の録画ビデオを表示するか
// ------------------------------
_this.getVisibleVideoLiveleak = function(){
return _proj_ins.expand_video.liveleak.visible_video;
};
// ------------------------------
// テキストインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandTextInline = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_text.inline;
}
return "";
};
// ------------------------------
// サムネイルイメージのスタイルシート
// ------------------------------
_this.getStyleSheetExpandImageThumbnail = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_image.thumbnail;
}
return "";
};
// ------------------------------
// ポップアップイメージのスタイルシート
// ------------------------------
_this.getStyleSheetExpandImagePopup = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_image.popup;
}
return "";
};
// ------------------------------
// サウンドインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandSoundInlineAudioElement = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_sound.inline.audio_element.audio;
}
return "";
};
// ------------------------------
// SoundCloud インライン表示 Flash 版プレイヤーのスタイルシート
// ------------------------------
_this.getStyleSheetExpandSoundSoundcloudInlinePlayerFlash = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_sound.inline.soundcloud.player_flash;
}
return "";
};
// ------------------------------
// SoundCloud インライン表示 HTML5 版プレイヤーのスタイルシート
// ------------------------------
_this.getStyleSheetExpandSoundSoundcloudInlinePlayerHtml5 = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_sound.inline.soundcloud.player_html5;
}
return "";
};
// ------------------------------
// MixCloud インライン表示プレイヤーのスタイルシート
// ------------------------------
_this.getStyleSheetExpandSoundMixcloudInlinePlayer = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_sound.inline.mixcloud.player;
}
return "";
};
// ------------------------------
// ビデオインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoInlineVideoElement = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.video_element.video;
}
return "";
};
// ------------------------------
// youtube インライン表示ビデオのスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoYoutubeInlineVideo = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.youtube.video;
}
return "";
};
// ------------------------------
// nicovideo ビデオのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoNicovideoInlineVideo = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.nicovideo.video;
}
return "";
};
// ------------------------------
// nicovideo ビデオサムネイルのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoNicovideoInlineThumbnailVideo = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.nicovideo.thumbnail_video;
}
return "";
};
// ------------------------------
// nicovideo マイリストサムネイルのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoNicovideoInlineThumbnailMylist = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.nicovideo.thumbnail_mylist;
}
return "";
};
// ------------------------------
// nicovideo ユーザーサムネイルのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoNicovideoInlineThumbnailUser = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.nicovideo.thumbnail_user;
}
return "";
};
// ------------------------------
// nicovideo コミュニティサムネイルのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoNicovideoInlineThumbnailCommunity = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.nicovideo.thumbnail_community;
}
return "";
};
// ------------------------------
// nicovideo 生放送サムネイルのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoNicovideoInlineThumbnailLive = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.nicovideo.thumbnail_live;
}
return "";
};
// ------------------------------
// nicovideo 静画サムネイルのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoNicovideoInlineThumbnailSeiga = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.nicovideo.thumbnail_seiga;
}
return "";
};
// ------------------------------
// ustream 配信ビデオのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoUstreamInlineVideoLive = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.ustream.video_live;
}
return "";
};
// ------------------------------
// ustream 録画ビデオのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoUstreamInlineVideoRecord = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.ustream.video_record;
}
return "";
};
// ------------------------------
// dailymotion インライン表示ビデオのスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoDailymotionInlineVideo = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.dailymotion.video;
}
return "";
};
// ------------------------------
// vimeo インライン表示ビデオのスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoVimeoInlineVideo = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.vimeo.video;
}
return "";
};
// ------------------------------
// fc2video インライン表示ビデオのスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoFc2videoInlineVideo = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.fc2video.video;
}
return "";
};
// ------------------------------
// LiveLeak インライン表示ビデオのスタイルシート
// ------------------------------
_this.getStyleSheetExpandVideoLiveleakInlineVideo = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_video.inline.liveleak.video;
}
return "";
};
// ------------------------------
// インラインフレームのインライン表示のスタイルシート
// ------------------------------
_this.getStyleSheetExpandIframeInline = function(){
if(_proj_ins.style_sheet){
return _proj_ins.style_sheet.expand_iframe.inline;
}
return "";
};
// ------------------------------
// インラインフレームの展開が可能であるか取得
// ------------------------------
_this.getEnableExpandIframe = function(){
return _proj_ins.expand_iframe;
};
// ------------------------------
// 同一のインラインフレームはインライン展開しない
// ------------------------------
_this.getDisableSameInlineIframe = function(){
if(_proj_ins.expand_iframe){
return _proj_ins.expand_iframe.inline.disable_same_iframe;
}
return false;
};
// ------------------------------
// インラインフレームのインライン展開を許可するかコールバック関数
// ------------------------------
_this.executeScriptAllowInlineIframe = function(element,url,content_type,response){
var info = {anchor_element:element,current_element:element,url:url,content_type:content_type};
var ary = _proj_ins.expand_iframe.inline.script_allow;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response({result:false});
}
};
// ------------------------------
// インラインフレームのインライン展開の挿入コールバック実行
// ------------------------------
_this.executeScriptInsertInlineIframe = function(element,iframe,event_dispatcher,response){
var info = {anchor_element:element,current_element:element,iframe_element:iframe,event_dispatcher:event_dispatcher};
var ary = _proj_ins.expand_iframe.inline.script_insert;
var i;
var num = ary.length;
if(num){
for(i=0;i<num;i++){
if(ary[i](info,response)){
break;
}
}
}else{
response();
}
};
// ------------------------------
// プライベート変数
// ------------------------------
var _proj_src;
var _proj_ins;
var _replacement_to_link_dictionary;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_replacement_to_link_dictionary = new ReplacementToLinkDictionary();
})();
}
// ------------------------------
// 基本設定をインスタンス化
// ------------------------------
function ProjectObjectInstantiateStandard(src){
return src;
}
// ------------------------------
// 掲示板拡張をインスタンス化
// ------------------------------
function ProjectObjectInstantiateExpandBbs(src){
var ins = ObjectCopy(src);
ins.script_initialize = StringEvalArrayFunction(ins.script_initialize);
ins.script_callback = StringEvalArrayFunction(ins.script_callback);
return ins;
}
// ------------------------------
// アクセス遮断をインスタンス化
// ------------------------------
function ProjectObjectInstantiateAccessBlock(src){
return {
filter:ProjectObjectInstantiateUrlEditContainer(src.filter)
};
}
// ------------------------------
// エレメント置換をインスタンス化
// ------------------------------
function ProjectObjectInstantiateReplacementToElement(src){
return {
script:StringEvalArrayFunction(src.script)
};
}
// ------------------------------
// テキスト置換をインスタンス化
// ------------------------------
function ProjectObjectInstantiateReplacementToText(src){
return {
script:StringEvalArrayFunction(src.script)
};
}
// ------------------------------
// アンカー置換をインスタンス化
// ------------------------------
function ProjectObjectInstantiateReplacementToAnchor(src){
return {
script:StringEvalArrayFunction(src.script)
};
}
// ------------------------------
// ハイパーリンク置換をインスタンス化
// ------------------------------
function ProjectObjectInstantiateReplacementToLink(src){
var i;
var filter_src;
var filter_ins = new Array();
var filters = src.filter;
var filter_num = filters.length;
for(i=0;i<filter_num;i++){
filter_src = filters[i];
filter_ins[i] = {
filter:ProjectObjectInstantiateUrlEditContainer(filter_src.filter),
enable_reflect_to_anchor:filter_src.enable_reflect_to_anchor,
enable_cache:filter_src.enable_cache,
script:StringEvalArrayFunction(filter_src.script)
};
}
return {
filter:filter_ins
};
}
// ------------------------------
// リファラ置換をインスタンス化
// ------------------------------
function ProjectObjectInstantiateReplacementToReferer(src){
var i;
var filter_src;
var filter_ins = new Array();
var filters = src.filter;
var filter_num = filters.length;
for(i=0;i<filter_num;i++){
filter_src = filters[i];
filter_ins[i] = {
filter:ProjectObjectInstantiateUrlEditContainer(filter_src.filter),
send_referer:filter_src.send_referer
};
}
return {
filter:filter_ins
};
}
// ------------------------------
// ユーザーエージェント置換をインスタンス化
// ------------------------------
function ProjectObjectInstantiateReplacementToUseragent(src){
var i;
var filter_src;
var filter_ins = new Array();
var filters = src.filter;
var filter_num = filters.length;
for(i=0;i<filter_num;i++){
filter_src = filters[i];
filter_ins[i] = {
filter:ProjectObjectInstantiateUrlEditContainer(filter_src.filter),
send_useragent:filter_src.send_useragent
};
}
return {
filter:filter_ins
};
}
// ------------------------------
// ハイパーリンク化をインスタンス化
// ------------------------------
function ProjectObjectInstantiateMakeLinkToText(src){
return {
script:StringEvalArrayFunction(src.script)
};
}
// ------------------------------
// 短縮 URL の展開をインスタンス化
// ------------------------------
function ProjectObjectInstantiateExpandShortUrl(src){
return {
filter:ProjectObjectInstantiateUrlEditContainer(src.filter)
};
}
// ------------------------------
// テキストの展開をインスタンス化
// ------------------------------
function ProjectObjectInstantiateExpandText(src){
var ins = ObjectCopy(src);
ins.inline.script_allow = StringEvalArrayFunction(ins.inline.script_allow);
ins.inline.script_insert = StringEvalArrayFunction(ins.inline.script_insert);
return ins;
}
// ------------------------------
// イメージの展開をインスタンス化
// ------------------------------
function ProjectObjectInstantiateExpandImage(src){
var ins = ObjectCopy(src);
ins.thumbnail.script_allow = StringEvalArrayFunction(ins.thumbnail.script_allow);
ins.thumbnail.script_insert = StringEvalArrayFunction(ins.thumbnail.script_insert);
ins.popup.script_allow = StringEvalArrayFunction(ins.popup.script_allow);
return ins;
}
// ------------------------------
// サウンドの展開をインスタンス化
// ------------------------------
function ProjectObjectInstantiateExpandSound(src){
var ins = ObjectCopy(src);
ins.inline.script_allow = StringEvalArrayFunction(ins.inline.script_allow);
ins.inline.script_insert = StringEvalArrayFunction(ins.inline.script_insert);
ins.audio_element.script_allow = StringEvalArrayFunction(ins.audio_element.script_allow);
return ins;
}
// ------------------------------
// ビデオの展開をインスタンス化
// ------------------------------
function ProjectObjectInstantiateExpandVideo(src){
var ins = ObjectCopy(src);
ins.inline.script_allow = StringEvalArrayFunction(ins.inline.script_allow);
ins.inline.script_insert = StringEvalArrayFunction(ins.inline.script_insert);
ins.video_element.script_allow = StringEvalArrayFunction(ins.video_element.script_allow);
return ins;
}
// ------------------------------
// インラインフレームの展開をインスタンス化
// ------------------------------
function ProjectObjectInstantiateExpandIframe(src){
var ins = ObjectCopy(src);
ins.inline.script_allow = StringEvalArrayFunction(ins.inline.script_allow);
ins.inline.script_insert = StringEvalArrayFunction(ins.inline.script_insert);
return ins;
}
// ------------------------------
// スタイルシートをインスタンス化
// ------------------------------
function ProjectObjectInstantiateStyleSheet(src){
return src;
}
// ------------------------------
// 試験運用をインスタンス化
// ------------------------------
function ProjectObjectInstantiateExperimental(src){
return src;
}
// ------------------------------
// URLエディットコンテナをインスタンス化
// ------------------------------
function ProjectObjectInstantiateUrlEditContainer(src){
var filter_ins = new Array();
var filter_src;
var filter_num;
var j;
switch(src.type){
case "asterisk":
filter_src = src.asterisk.filter;
filter_num = filter_src.length;
for(j=0;j<filter_num;j++){
filter_ins[j] = StringRegExpListFromAsteriskWord(filter_src[j]);
}
break;
case "regexp":
filter_src = src.regexp.filter;
filter_num = filter_src.length;
for(j=0;j<filter_num;j++){
filter_ins[j] = [RegExpObjectGetRegExp(filter_src[j])];
}
break;
}
return filter_ins;
}
// ------------------------------
// プロジェクトの定義リストからフィルタを取得
// ------------------------------
function ProjectInstanceDefinesGetFilterFromURL (defines,url){
var i;
var j;
var k;
var filters;
var filter;
var filter_num;
var url_filters;
var url_filter_num;
var define;
var define_num = defines.length;
for(i=0;i<define_num;i++){
define = defines[i];
filters = define.filter;
filter_num = filters.length;
for(j=0;j<filter_num;j++){
filter = filters[j];
url_filters = filter.filter;
url_filter_num = url_filters.length;
for(k=0;k<url_filter_num;k++){
if(StringUrlMatchRegExpList(url,url_filters[k])){
return filter;
}
}
}
}
return null;
}
// ------------------------------
// プロジェクトの定義リストからすべてのフィルタを取得
// ------------------------------
function ProjectInstanceDefinesGetAllFiltersFromURL (defines,url){
var ary = new Array();
var i;
var j;
var k;
var filters;
var filter;
var filter_num;
var url_filters;
var url_filter_num;
var define;
var define_num = defines.length;
for(i=0;i<define_num;i++){
define = defines[i];
filters = define.filter;
filter_num = filters.length;
for(j=0;j<filter_num;j++){
filter = filters[j];
url_filters = filter.filter;
url_filter_num = url_filters.length;
for(k=0;k<url_filter_num;k++){
if(StringUrlMatchRegExpList(url,url_filters[k])){
ary.push(filter);
break;
}
}
}
}
return ary;
}
// ------------------------------
// プロジェクトオブジェクトに掲示板拡張をインポート
// ------------------------------
function PageExpandProjectObjectImportExpandBbs(proj_obj,user_obj,asset){
if(user_obj.version === undefined) return;
if(!(user_obj.expand_bbs)) return;
var preset_obj = PageExpandProjectObjectUpdate(null,{version:user_obj.version});
var user_dictionary = new Object();
var preset_dictionary = new Object();
var proj_dictionary = new Object();
var user_asset = new Array();
// ユーザー辞書
(function(){
var expand_bbs = user_obj.expand_bbs;
var num = expand_bbs.length;
var i;
for(i=0;i<num;i++){
var o = expand_bbs[i];
if(o.id !== undefined){
user_dictionary[o.id] = o;
if(o.user){
user_asset.push(o.id);
}
}
}
})();
// プリセット辞書
(function(){
var expand_bbs = preset_obj.expand_bbs;
var num = expand_bbs.length;
var i;
for(i=0;i<num;i++){
var o = expand_bbs[i];
if(o.id !== undefined){
preset_dictionary[o.id] = o;
}
}
})();
// ユーザー設定をプリセット設定にマージ
(function(){
var expand_bbs = preset_obj.expand_bbs;
var num = expand_bbs.length;
var i;
for(i=0;i<num;i++){
var o = expand_bbs[i];
if(user_dictionary[o.id]){
o.user = user_dictionary[o.id].user;
}
}
var user_id;
for(user_id in user_dictionary){
if(!(preset_dictionary[user_id])){
expand_bbs.push(user_dictionary[user_id]);
}
}
preset_obj = PageExpandProjectObjectUpdate(preset_obj,null);
})();
// プロジェクト辞書
(function(){
var expand_bbs = preset_obj.expand_bbs;
var num = expand_bbs.length;
var i;
for(i=0;i<num;i++){
var o = expand_bbs[i];
if(o.id !== undefined){
proj_dictionary[o.id] = o;
}
}
})();
// プロジェクトにインポート
(function(){
var expand_bbs = proj_obj.expand_bbs;
var define_dictionary = new Object();
var i;
var num = expand_bbs.length;
for(i=0;i<num;i++){
var d = expand_bbs[i];
define_dictionary[d.id] = d;
}
num = user_asset.length;
for(i=num-1;i>=0;i--){
var d = proj_dictionary[user_asset[i]];
if(d.preset){
define_dictionary[d.id].user = d.user;
}else{
var user_id = PageExpandProjectObjectDefineGenerateNewUserId(proj_obj.expand_bbs);
expand_bbs.unshift(d);
d.id = user_id;
}
}
})();
}
// ------------------------------
// プロジェクトオブジェクトに定義をインポート
// ------------------------------
function PageExpandProjectObjectImportDefine(proj_obj,user_obj,asset){
if(user_obj.version === undefined) return;
var preset_obj = PageExpandProjectObjectUpdate(null,{version:user_obj.version});
var user_dictionary = new Object();
var preset_dictionary = new Object();
var proj_dictionary = new Object();
var user_asset = new Object();
// ユーザー辞書
(function(){
var p;
for(p in user_obj){
var a = user_obj[p];
if((a) && (typeof(a) == "object")){
if(a.constructor == Array){
user_dictionary[p] = new Object();
var ary = new Array();
var i;
var num = a.length;
for(i=0;i<num;i++){
var o = a[i];
if(o.id !== undefined){
user_dictionary[p][o.id] = o;
if(o.user){
ary.push(o.id);
}
}
}
if(ary.length){
user_asset[p] = ary;
}
}
}
}
})();
// 更新なし
if(!(user_asset[asset])){
return;
}
// プリセット辞書
(function(){
var p;
for(p in preset_obj){
var a = preset_obj[p];
if((a) && (typeof(a) == "object")){
if(a.constructor == Array){
preset_dictionary[p] = new Object();
var i;
var num = a.length;
for(i=0;i<num;i++){
var o = a[i];
if(o.id !== undefined){
preset_dictionary[p][o.id] = o;
}
}
}
}
}
})();
// ユーザー設定をプリセット設定にマージ
(function(){
var p;
for(p in preset_obj){
var a = preset_obj[p];
if((a) && (typeof(a) == "object")){
if(a.constructor == Array){
if(!user_asset[p]) continue;
var i;
var num = a.length;
for(i=0;i<num;i++){
var o = a[i];
if(user_dictionary[p][o.id]){
o.user = user_dictionary[p][o.id].user;
}
}
var user_obj = user_dictionary[p];
var user_id;
for(user_id in user_obj){
if(!(preset_dictionary[p][user_id])){
a.push(user_obj[user_id]);
}
}
}
}
}
preset_obj = PageExpandProjectObjectUpdate(preset_obj,null);
})();
// プロジェクト辞書
(function(){
var p;
for(p in preset_obj){
var a = preset_obj[p];
if((a) && (typeof(a) == "object")){
if(a.constructor == Array){
proj_dictionary[p] = new Object();
var i;
var num = a.length;
for(i=0;i<num;i++){
var o = a[i];
if(o.id !== undefined){
proj_dictionary[p][o.id] = o;
}
}
}
}
}
})();
// プロジェクトにインポート
(function(){
var define_ary = proj_obj[asset];
var define_dictionary = new Object();
var i;
var num = define_ary.length;
for(i=0;i<num;i++){
var d = define_ary[i];
define_dictionary[d.id] = d;
}
var asset_ary = user_asset[asset];
num = asset_ary.length;
for(i=num-1;i>=0;i--){
var d = proj_dictionary[asset][asset_ary[i]];
if(d.preset){
define_dictionary[d.id].user = d.user;
}else{
var user_id = PageExpandProjectObjectDefineGenerateNewUserId(proj_obj[asset]);
define_ary.unshift(d);
d.id = user_id;
}
}
})();
}
// ------------------------------
// プロジェクトオブジェクトから最新のフィルタを取得
// ------------------------------
function PageExpandProjectObjectGetDefineFilterLatest(user_obj,asset){
if(user_obj.version === undefined) return;
if(!user_obj[asset]) return;
var preset_obj = PageExpandProjectObjectUpdate(null,{version:user_obj.version});
var user_define = user_obj[asset][0];
preset_obj[asset].push(user_define);
preset_obj = PageExpandProjectObjectUpdate(preset_obj,null);
return user_define.user.filter;
}
// ------------------------------
// プロジェクトオブジェクトにプリセットを付加
// ------------------------------
function PageExpandProjectObjectAppendPreset(proj_obj){
if(proj_obj.version === undefined) return null;
var p;
var preset = PageExpandProjectObjectUpdate(null,{version:proj_obj.version});
// 辞書を作成
var dictionary = new Object();
for(p in preset){
var a = preset[p];
if((a) && (typeof(a) == "object")){
if(a.constructor == Array){
dictionary[p] = new Object();
var i;
var num = a.length;
for(i=0;i<num;i++){
var o = a[i];
if(o.id !== undefined){
dictionary[p][o.id] = o;
}
}
}
}
}
// マージ
for(p in proj_obj){
var a = proj_obj[p];
if((a) && (typeof(a) == "object")){
if(a.constructor == Array){
var i;
var num = a.length;
for(i=0;i<num;i++){
var o = a[i];
if(o.id !== undefined){
if(dictionary[p][o.id] !== undefined){
o.preset = dictionary[p][o.id].preset;
}
}
}
}
}
}
return proj_obj;
}
// ------------------------------
// プロジェクトオブジェクトからプリセットを除去
// ------------------------------
function PageExpandProjectObjectRemovePreset(proj_obj){
var p;
for(p in proj_obj){
var a = proj_obj[p];
if((a) && (typeof(a) == "object")){
if(a.constructor == Array){
var i;
var num = a.length;
for(i=0;i<num;i++){
var o = a[i];
if(o.id !== undefined){
if(o.preset !== undefined){
ObjectDeleteProperty(o,"preset");
}
}
}
}
}
}
return proj_obj;
}
// ------------------------------
// プロジェクトオブジェクト定義から新しいユーザー ID を生成
// ------------------------------
function PageExpandProjectObjectDefineGenerateNewUserId(ary){
// 辞書作成
var dic = new Object();
var i;
var num = ary.length;
for(i=0;i<num;i++){
dic[ary[i].id] = ary[i];
}
// ユニーク名を作成
i = 0;
while(dic["user" + i]){
i++;
}
return "user" + i;
}
// ------------------------------
// プロジェクトのアップデート
// ------------------------------
function PageExpandProjectObjectUpdate(proj,param){
// ------------------------------
// プリセットを追加
// ------------------------------
function addPreset(ary,id,insert){
var i;
var obj;
var num = ary.length;
for(i=0;i<num;i++){
if(ary[i].id == id){
obj = ary[i];
break;
}
}
if(!obj){
if(insert){
// 挿入位置を検索
for(i=num-1;i>=0;i--){
if(ary[i].id == insert){
break;
}
}
if(i < 0){
i = 0;
}
}else{
i = num;
}
// オブジェクトを新規作成
obj = new Object();
obj.id = id;
ary.splice(i,0,obj);
}else{
// ユーザー設定
if(obj.user){
// 複製
var copy = ObjectCopy(obj);
delete obj.user;
delete copy.preset;
var user = copy.user;
user.name.standard += " (BackUp)";
var locales = user.name.locales;
for(var p in locales){
locales[p] += " (BackUp)";
}
ary.splice(i+1, 0, copy);
copy.id = PageExpandProjectObjectDefineGenerateNewUserId(ary);
}
}
return obj;
}
// ------------------------------
// プリセットを取得
// ------------------------------
function getPreset(ary,id){
var i;
var param;
var num = ary.length;
for(i=0;i<num;i++){
param = ary[i];
if(param.id == id){
if(param.preset){
return param.preset;
}else{
break;
}
}
}
return null;
}
// ------------------------------
// プリセットを破棄
// ------------------------------
function removePreset(asset,id){
var ary = proj[asset];
var i;
var obj;
var num = ary.length;
for(i=0;i<num;i++){
if(ary[i].id == id){
obj = ary[i];
break;
}
}
if(obj){
// オブジェクトを破棄
ary.splice(i,1);
var check = false;
var urlmaps = proj.urlmap;
var urlmap_num = urlmaps.length;
// URLマッピングで使用中
for(i=0;i<urlmap_num;i++){
var urlmap = urlmaps[i];
if(urlmap.user){
if(urlmap.user[asset]){
if(urlmap.user[asset].id == id){
check = true;
break;
}
}
}
}
if(!check){
// ユーザー設定を持つ
if(obj.user){
check = true;
}
}
// プリセットをバックアップ
if(check){
var copy = ObjectCopy(obj);
if(!copy.user){
copy.user = copy.preset;
}
delete obj.user;
delete copy.preset;
var user = copy.user;
user.name.standard += " (BackUp)";
var locales = user.name.locales;
for(var p in locales){
locales[p] += " (BackUp)";
}
ary.splice(num-1, 0, copy);
copy.id = PageExpandProjectObjectDefineGenerateNewUserId(ary);
// 複製先に変更
for(i=0;i<urlmap_num;i++){
var urlmap = urlmaps[i];
if(urlmap.user){
if(urlmap.user[asset]){
if(urlmap.user[asset].id == id){
urlmap.user[asset].id = copy.id;
}
}
}
}
}
// 未使用
for(i=0;i<urlmap_num;i++){
var urlmap = urlmaps[i];
if(urlmap.preset){
if(urlmap.preset[asset]){
if(urlmap.preset[asset].id == id){
urlmap.preset[asset].id = "";
urlmap.preset[asset].enable = false;
}
}
}
}
}
return obj;
}
// ------------------------------
// プリセット更新
// ------------------------------
function updatePreset(ary,id,func){
var i;
var param;
var num = ary.length;
for(i=0;i<num;i++){
param = ary[i];
if(id == "*" || param.id == id){
if(param.preset) func(param.preset);
}
}
}
// ------------------------------
// 更新
// ------------------------------
function update(ary,id,func){
var i;
var param;
var num = ary.length;
for(i=0;i<num;i++){
param = ary[i];
if(id == "*" || param.id == id){
if(param.user) func(param.user);
if(param.preset) func(param.preset);
}
}
}
// ------------------------------
// 配列コンテナを作成
// ------------------------------
function createArrayContainer(name){
if((proj[name]) && (typeof(proj[name]) == "object")){
if(proj[name].constructor == Array){
return proj[name];
}
}
proj[name] = new Array();
return proj[name];
}
// ------------------------------
// 終了
// ------------------------------
function exit(){
if(param){
if(param.version !== undefined){
if(proj.version >= param.version){
return true;
}
}
}
return false;
}
// ------------------------------
// プロジェクトワーク作成
// ------------------------------
if(!proj){
proj = new Object();
// バージョン値
proj.version = 0;
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.1
// ------------------------------
if(proj.version < 1){
// バージョン値
proj.version = 1;
// ------------------------------
// 基本設定
// ------------------------------
proj.standard = {
filter_type:"deny",
filter_deny:[
"*://example.com/*",
"*://*.example.com/*"
],
filter_allow:[
"*://example.com/*",
"*://*.example.com/*"
],
enable_debug_mode:false,
enable_icon_address_bar:true,
enable_context_menu:true,
enable_enable_startup:true,
load_thread_max:10,
execute_queue:{
time_occupancy:5,
time_sleep:0
}
};
// ------------------------------
// 掲示板設定
// ------------------------------
createArrayContainer("expand_bbs");
// 追加
update(proj.expand_bbs,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.enable)) obj.enable = false;
if(!(obj.script_allow)) obj.script_allow = "[]";
if(!(obj.script_callback)) obj.script_callback = "[]";
if(!(obj.popup)) obj.popup = new Object();
if(!(obj.popup.origin_type)) obj.popup.origin_type = "adsorb_top_down";
if(!(obj.popup.position_type)) obj.popup.position_type = "absolute";
if(!(obj.popup.enable_animation)) obj.popup.enable_animation = false;
if(!(obj.popup.percent)) obj.popup.percent = new Object();
if(!(obj.popup.percent.x)) obj.popup.percent.x = 0;
if(!(obj.popup.percent.y)) obj.popup.percent.y = 0;
if(!(obj.popup.time_wait_open)) obj.popup.time_wait_open = 0;
if(!(obj.popup.time_wait_close)) obj.popup.time_wait_close = 0;
if(!(obj.popup.style_sheet)) obj.popup.style_sheet = 0;
});
// 2ちゃんねる掲示板
var obj = addPreset(proj.expand_bbs,"2ch",null);
obj.preset = {
name:{
standard:"2ch.net",
locales:{
ja:"2ちゃんねる掲示板",
en:"2ch.net"
}
},
enable:true,
script_allow:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
// ログ速
var obj = addPreset(proj.expand_bbs,"logsoku","2ch");
obj.preset = {
name:{
standard:"logsoku.com",
locales:{
ja:"ログ速",
en:"logsoku.com"
}
},
enable:true,
script_allow:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
// みみずん検索
var obj = addPreset(proj.expand_bbs,"mimizun","logsoku");
obj.preset = {
name:{
standard:"mimizun.com",
locales:{
ja:"みみずん検索",
en:"mimizun.com"
}
},
enable:true,
script_allow:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
// ふたば☆ちゃんねる
var obj = addPreset(proj.expand_bbs,"2chan","mimizun");
obj.preset = {
name:{
standard:"2chan.net",
locales:{
ja:"ふたば☆ちゃんねる",
en:"2chan.net"
}
},
enable:true,
script_allow:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
// 4chan.org
var obj = addPreset(proj.expand_bbs,"4chan","2chan");
obj.preset = {
name:{
standard:"4chan.org",
locales:{
ja:"4chan",
en:"4chan.org"
}
},
enable:true,
script_allow:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
// ------------------------------
// URLマッピング設定
// ------------------------------
createArrayContainer("urlmap");
// 追加
update(proj.urlmap,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.enable)) obj.enable = false;
if(!(obj.filter)) obj.filter = [];
if(!(obj.access_block)) obj.access_block = new Object();
if(!(obj.access_block.enable)) obj.access_block.enable = false;
if(!(obj.replacement_to_element)) obj.replacement_to_element = new Object();
if(!(obj.replacement_to_element.enable)) obj.replacement_to_element.enable = false;
if(!(obj.replacement_to_text)) obj.replacement_to_text = new Object();
if(!(obj.replacement_to_text.enable)) obj.replacement_to_text.enable = false;
if(!(obj.replacement_to_link)) obj.replacement_to_link = new Object();
if(!(obj.replacement_to_link.enable)) obj.replacement_to_link.enable = false;
if(!(obj.replacement_to_referer)) obj.replacement_to_referer = new Object();
if(!(obj.replacement_to_referer.enable)) obj.replacement_to_referer.enable = false;
if(!(obj.replacement_to_useragent)) obj.replacement_to_useragent = new Object();
if(!(obj.replacement_to_useragent.enable)) obj.replacement_to_useragent.enable = false;
if(!(obj.make_link_to_text)) obj.make_link_to_text = new Object();
if(!(obj.make_link_to_text.enable)) obj.make_link_to_text.enable = false;
if(!(obj.expand_short_url)) obj.expand_short_url = new Object();
if(!(obj.expand_short_url.enable)) obj.expand_short_url.enable = false;
if(!(obj.expand_text)) obj.expand_text = new Object();
if(!(obj.expand_text.enable)) obj.expand_text.enable = false;
if(!(obj.expand_image)) obj.expand_image = new Object();
if(!(obj.expand_image.enable)) obj.expand_image.enable = false;
if(!(obj.expand_sound)) obj.expand_sound = new Object();
if(!(obj.expand_sound.enable)) obj.expand_sound.enable = false;
if(!(obj.expand_video)) obj.expand_video = new Object();
if(!(obj.expand_video.enable)) obj.expand_video.enable = false;
if(!(obj.expand_iframe)) obj.expand_iframe = new Object();
if(!(obj.expand_iframe.enable)) obj.expand_iframe.enable = false;
if(!(obj.style_sheet)) obj.style_sheet = new Object();
if(!(obj.style_sheet.enable)) obj.style_sheet.enable = false;
if(!(obj.experimental)) obj.experimental = new Object();
if(!(obj.experimental.enable)) obj.experimental.enable = false;
});
// デフォルト
var obj = addPreset(proj.urlmap,"default",null);
obj.preset = {
name:{
standard:"Default",
locales:{
ja:"デフォルト(すべて)",
en:"Default"
}
},
enable:true,
filter:[
"*://*"
],
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:""},
replacement_to_text:{enable:false,id:""},
replacement_to_link:{enable:false,id:""},
replacement_to_referer:{enable:false,id:""},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"simple"},
expand_short_url:{enable:true,id:"simple"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup"},
expand_sound:{enable:false,id:""},
expand_video:{enable:false,id:""},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// twitter
var obj = addPreset(proj.urlmap,"twitter","default");
obj.preset = {
name:{
standard:"twitter.com",
locales:{
ja:"ツイッター",
en:"twitter.com"
}
},
enable:true,
filter:[
"*://twitter.com/*"
],
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:""},
replacement_to_text:{enable:false,id:""},
replacement_to_link:{enable:true,id:"no_referrer"},
replacement_to_referer:{enable:true,id:"replacement_link"},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"simple"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"thumbnail"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// スレッド掲示板
var obj = addPreset(proj.urlmap,"bbs","twitter");
obj.preset = {
name:{
standard:"2ch.net",
locales:{
ja:"スレッド掲示板",
en:"2ch.net"
}
},
enable:true,
filter:[
"*://2ch.net/*",
"*://*.2ch.net/*",
"*://*.machi.to/*",
"*://machibbs.net/*",
"*://*.machibbs.net/*",
"*://*.bbspink.com/*",
"*://jbbs.livedoor.jp/*",
"*://logsoku.com/*",
"*://mimizun.com/log/*/*",
"*://*.kakiko.com/*",
"*://*.60.kg/*",
"*://*.atchs.jp/*"
],
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:""},
replacement_to_text:{enable:false,id:""},
replacement_to_link:{enable:true,id:"direct_link_bbs"},
replacement_to_referer:{enable:true,id:"replacement_link"},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"detail"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"thumbnail"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// 画像掲示板
var obj = addPreset(proj.urlmap,"image_bbs","bbs");
obj.preset = {
name:{
standard:"www.4chan.org",
locales:{
ja:"画像掲示板",
en:"www.4chan.org"
}
},
enable:true,
filter:[
"*://*.4chan.org/*",
"*://*.2chan.net/*"
],
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:""},
replacement_to_text:{enable:false,id:""},
replacement_to_link:{enable:true,id:"no_referrer"},
replacement_to_referer:{enable:true,id:"replacement_link"},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"detail"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// 検索サイト
var obj = addPreset(proj.urlmap,"search","image_bbs");
obj.preset = {
name:{
standard:"Search",
locales:{
ja:"検索サイト",
en:"Search"
}
},
enable:true,
filter:[
"*://www.google.com/#*q=*",
"*://www.google.com/search?*",
"*://www.google.co.jp/#*q=*",
"*://www.google.co.jp/search?*",
"*://search.yahoo.com/search*",
"*://search.yahoo.co.jp/*",
"*://www.bing.com/search?*q=*",
"*://topsy.com/s*"
],
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:""},
replacement_to_text:{enable:false,id:""},
replacement_to_link:{enable:true,id:"direct_link_search"},
replacement_to_referer:{enable:false,id:""},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"simple"},
expand_short_url:{enable:true,id:"simple"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// 画像検索サイト
var obj = addPreset(proj.urlmap,"image_search","search");
obj.preset = {
name:{
standard:"Image Search",
locales:{
ja:"画像検索サイト",
en:"Image Search"
}
},
enable:true,
filter:[],
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:""},
replacement_to_text:{enable:false,id:""},
replacement_to_link:{enable:true,id:"direct_link_image_search"},
replacement_to_referer:{enable:true,id:"replacement_link"},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"simple"},
expand_short_url:{enable:true,id:"simple"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup"},
expand_sound:{enable:false,id:""},
expand_video:{enable:false,id:""},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// リアルタイム検索サイト
var obj = addPreset(proj.urlmap,"realtime_search","image_search");
obj.preset = {
name:{
standard:"Real Time Search",
locales:{
ja:"リアルタイム検索サイト",
en:"Real Time Search"
}
},
enable:true,
filter:[
"*://realtime.search.yahoo.co.jp/*",
"*://topsy.com/s/*/tweet?*",
"*://topsy.com/s?*type=tweet*",
"*://www.bing.com/social/search*",
"*://*search.naver.jp/realtime?*"
],
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:""},
replacement_to_text:{enable:false,id:""},
replacement_to_link:{enable:true,id:"direct_link_realtime_search"},
replacement_to_referer:{enable:false,id:""},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"simple"},
expand_short_url:{enable:true,id:"simple"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"thumbnail"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// ------------------------------
// アクセスブロック定義
// ------------------------------
createArrayContainer("access_block");
// 追加
update(proj.access_block,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.filter)) obj.filter = [];
});
// ------------------------------
// エレメント置換定義
// ------------------------------
createArrayContainer("replacement_to_element");
// 追加
update(proj.replacement_to_element,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.script)) obj.script = "[]";
});
// フォントの種類をメイリオに変更
var obj = addPreset(proj.replacement_to_element,"meiryo_font",null);
obj.preset = {
name:{
standard:"Meiryo Font",
locales:{
ja:"フォントの種類をメイリオに変更",
en:"Meiryo Font"
}
},
script:PresetScript_ReplacementToElement_MeiryoFont()
};
// ------------------------------
// テキスト置換定義
// ------------------------------
createArrayContainer("replacement_to_text");
// 追加
update(proj.replacement_to_text,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.script)) obj.script = "[]";
});
// 英数字記号を半角、カタカナを全角に変更
var obj = addPreset(proj.replacement_to_text,"alphanumeric_half",null);
obj.preset = {
name:{
standard:"String Convert From AlphanumericHalf To AlphanumericFull",
locales:{
ja:"英数字記号を半角、カタカナを全角に変更",
en:"String Convert From AlphanumericHalf To AlphanumericFull"
}
},
script:PresetScript_ReplacementToText_AlphanumericHalf()
};
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
createArrayContainer("replacement_to_link");
// 追加
update(proj.replacement_to_link,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.script)) obj.script = "[]";
});
// ノーリファラ属性を追加
var obj = addPreset(proj.replacement_to_link,"no_referrer",null);
obj.preset = {
name:{
standard:"No Referer",
locales:{
ja:"ノーリファラ属性を追加",
en:"No Referer"
}
},
script:PresetScript_ReplacementToAnchor_NoReferrer()
};
// ソーシャルサービスのカウント数を表示
var obj = addPreset(proj.replacement_to_link,"attach_sns_counter","no_referrer");
obj.preset = {
name:{
standard:"Attach SNS Counter",
locales:{
ja:"ソーシャルサービスのカウント数を表示",
en:"Attach SNS Counter"
}
},
script:""
};
// 2ch.net 用
var obj = addPreset(proj.replacement_to_link,"direct_link_bbs","attach_sns_counter");
obj.preset = {
name:{
standard:"Direct Link (bbs)",
locales:{
ja:"直リンクに変更(スレッド掲示板用)",
en:"Direct Link (bbs)"
}
},
script:""
};
// 検索用
var obj = addPreset(proj.replacement_to_link,"direct_link_search","direct_link_bbs");
obj.preset = {
name:{
standard:"Direct Link (search)",
locales:{
ja:"直リンクに変更(検索用)",
en:"Direct Link (search)"
}
},
script:""
};
// イメージ検索用
var obj = addPreset(proj.replacement_to_link,"direct_link_image_search","direct_link_search");
obj.preset = {
name:{
standard:"Direct Link (image search)",
locales:{
ja:"直リンクに変更(イメージ検索用)",
en:"Direct Link (image search)"
}
},
script:""
};
// リアルタイム検索用
var obj = addPreset(proj.replacement_to_link,"direct_link_realtime_search","direct_link_image_search");
obj.preset = {
name:{
standard:"Direct Link (realtime search)",
locales:{
ja:"直リンクに変更(リアルタイム検索用)",
en:"Direct Link (realtime search)"
}
},
script:""
};
// ------------------------------
// リファラ置換定義
// ------------------------------
createArrayContainer("replacement_to_referer");
// 追加
update(proj.replacement_to_referer,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.script)) obj.script = "[]";
});
// 空文字列に変更
var obj = addPreset(proj.replacement_to_referer,"replacement_empty",null);
obj.preset = {
name:{
standard:"Replace Empty",
locales:{
ja:"空文字列に変更",
en:"Replace Empty"
}
},
script:""
};
// リンク先のURLに変更
var obj = addPreset(proj.replacement_to_referer,"replacement_link","replacement_empty");
obj.preset = {
name:{
standard:"Replace Link",
locales:{
ja:"リンク先のURLに変更",
en:"Replace Link"
}
},
script:""
};
// ------------------------------
// ユーザーエージェント置換定義
// ------------------------------
createArrayContainer("replacement_to_useragent");
// 追加
update(proj.replacement_to_useragent,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.script)) obj.script = "[]";
});
// iPhone4
var obj = addPreset(proj.replacement_to_useragent,"iphone_4",null);
obj.preset = {
name:{
standard:"iPhone4",
locales:{
ja:"iPhone4",
en:"iPhone4"
}
},
script:""
};
// Android 2.1
var obj = addPreset(proj.replacement_to_useragent,"android_2_1","iphone_4");
obj.preset = {
name:{
standard:"Android 2.1",
locales:{
ja:"Android 2.1",
en:"Android 2.1"
}
},
script:""
};
// DoCoMo/2.0
var obj = addPreset(proj.replacement_to_useragent,"docomo_2_0","android_2_1");
obj.preset = {
name:{
standard:"DoCoMo / 2.0",
locales:{
ja:"DoCoMo / 2.0",
en:"DoCoMo / 2.0"
}
},
script:""
};
// ------------------------------
// ハイパーリンク化定義
// ------------------------------
createArrayContainer("make_link_to_text");
// 追加
update(proj.make_link_to_text,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.script)) obj.script = "[]";
});
// 簡易
var obj = addPreset(proj.make_link_to_text,"simple",null);
obj.preset = {
name:{
standard:"Simple",
locales:{
ja:"簡易",
en:"Simple"
}
},
script:""
};
// 詳細
var obj = addPreset(proj.make_link_to_text,"detail","simple");
obj.preset = {
name:{
standard:"Detail",
locales:{
ja:"詳細",
en:"Detail"
}
},
script:""
};
// ------------------------------
// 短縮 URL 展開
// ------------------------------
createArrayContainer("expand_short_url");
// 追加
update(proj.expand_short_url,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.filter)) obj.filter = [];
});
// 簡易
var obj = addPreset(proj.expand_short_url,"simple",null);
obj.preset = {
name:{
standard:"Simple",
locales:{
ja:"簡易",
en:"Simple"
}
},
filter:[
"http://bit.ly/*",
"http://j.mp/*",
"http://goo.gl/*",
"http://c23.biz/*",
"http://p.tl/*",
"http://tinyurl.com/*",
"http://ow.ly/*",
"http://t.co/*",
"http://fb.me/*",
"http://amzn.to/*",
"http://youtu.be/*",
"http://g.co/*",
"http://r10.to/*",
"http://s.nikkei.com/*",
"http://t.asahi.com/*"
]
};
// 詳細
var obj = addPreset(proj.expand_short_url,"detail","simple");
obj.preset = {
name:{
standard:"Detail",
locales:{
ja:"詳細",
en:"Detail"
}
},
filter:[
"http://tinyurl.com/*",
"http://ow.ly/*",
"http://dlvr.it/*",
"http://s.nikkei.com/*",
"http://t.asahi.com/*",
"http://is.gd/*",
"http://t.co/*",
"http://fb.me/*",
"http://amzn.to/*",
"http://youtu.be/*",
"http://tumblr.com/*",
"http://a.r10.to/*",
"http://ht.ly/*",
"http://lnk.ms/*",
"http://ustre.am/**",
"http://r10.to/*",
"http://tou.ch/*",
"http://po.st/*",
"http://htn.to/*",
"http://moi.st/*",
"http://fc2.in/*",
"http://a8.net/*",
"http://p.tl/*",
"http://itun.es/*",
"http://flic.kr/*",
"http://moby.to/*",
"http://instapaper.com/*",
"http://icio.us/*",
"http://dai.ly/*",
"http://pbckt.com/*",
"http://nhk.jp/*",
"http://post.ly/*",
"http://bit.ly/*",
"http://goo.gl/*",
"http://r.sm3.jp/*",
"http://cot.ag/*",
"http://mpr.hn/*",
"http://rss.rssad.jp/*",
"http://to.ly/*",
"http://g.co/*",
"http://fon.gs/*",
"http://tuna.be/*",
"http://mysp.ac/*",
"http://j.mp/*",
"http://snurl.com/*",
"http://v.gd/*",
"http://ux.nu/*",
"http://qurl.com/*",
"http://tr.im/*",
"http://gigaz.in/*",
"http://3.ly/*",
"http://artbeat.ly/*",
"http://sgp.cm/*",
"http://30m.in/*",
"http://bt.io/*",
"http://pic.gd/*",
"http://twt.mx/*",
"http://url4.eu/*",
"http://idek.net/*",
"http://c23.biz/*"
]
};
// ------------------------------
// テキスト展開定義
// ------------------------------
createArrayContainer("expand_text");
// 追加
update(proj.expand_text,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.inline)) obj.inline = new Object();
if(!(obj.inline.disable_same_text)) obj.inline.disable_same_text = false;
if(!(obj.inline.script_allow)) obj.inline.script_allow = "[]";
if(!(obj.inline.script_insert)) obj.inline.script_insert = "[]";
});
// インライン表示
var obj = addPreset(proj.expand_text,"inline",null);
obj.preset = {
name:{
standard:"Inline",
locales:{
ja:"インライン表示",
en:"Inline"
}
},
inline:{
disable_same_text:true,
script_allow:"",
script_insert:""
}
};
// ------------------------------
// イメージ展開定義
// ------------------------------
createArrayContainer("expand_image");
// 追加
update(proj.expand_image,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.thumbnail)) obj.thumbnail = new Object();
if(!(obj.thumbnail.enable_popup_mouseover)) obj.thumbnail.enable_popup_mouseover = false;
if(!(obj.thumbnail.disable_same_image)) obj.thumbnail.disable_same_image = false;
if(!(obj.thumbnail.script_allow)) obj.thumbnail.script_allow = "[]";
if(!(obj.thumbnail.script_insert)) obj.thumbnail.script_insert = "[]";
if(!(obj.popup)) obj.popup = new Object();
if(!(obj.popup.origin_type)) obj.popup.origin_type = "center";
if(!(obj.popup.position_type)) obj.popup.position_type = "absolute";
if(!(obj.popup.time_wait_open)) obj.popup.time_wait_open = 0;
if(!(obj.popup.time_wait_close)) obj.popup.time_wait_close = 0;
if(!(obj.popup.enable_animation)) obj.popup.enable_animation = false;
if(!(obj.popup.script_allow)) obj.popup.script_allow = "[]";
if(!(obj.reduced_image)) obj.reduced_image = new Object();
if(!(obj.reduced_image.enable_popup)) obj.reduced_image.enable_popup = false;
if(!(obj.reduced_image.popup_allow_slcale_less_then)) obj.reduced_image.popup_allow_slcale_less_then = 0;
});
// サムネイル表示
var obj = addPreset(proj.expand_image,"thumbnail",null);
obj.preset = {
name:{
standard:"Thumbnail",
locales:{
ja:"サムネイル表示",
en:"Thumbnail"
}
},
thumbnail:{
enable_popup_mouseover:true,
disable_same_image:false,
script_allow:"",
script_insert:""
},
popup:{
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation:true,
script_allow:""
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
}
};
// ポップアップ表示
var obj = addPreset(proj.expand_image,"popup","thumbnail");
obj.preset = {
name:{
standard:"Popup",
locales:{
ja:"ポップアップ表示",
en:"Popup"
}
},
thumbnail:{
enable_popup_mouseover:true,
disable_same_image:false,
script_allow:"",
script_insert:""
},
popup:{
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation:true,
script_allow:""
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
}
};
// ------------------------------
// サウンド展開定義
// ------------------------------
createArrayContainer("expand_sound");
// 追加
update(proj.expand_sound,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.inline)) obj.inline = new Object();
if(!(obj.inline.disable_same_audio)) obj.inline.disable_same_audio = false;
if(!(obj.inline.script_allow)) obj.inline.script_allow = "[]";
if(!(obj.inline.script_insert)) obj.inline.script_insert = "[]";
});
// インライン表示
var obj = addPreset(proj.expand_sound,"inline",null);
obj.preset = {
name:{
standard:"Inline",
locales:{
ja:"インライン表示",
en:"Inline"
}
},
inline:{
disable_same_audio:true,
script_allow:"",
script_insert:""
}
};
// ------------------------------
// ビデオ展開定義
// ------------------------------
createArrayContainer("expand_video");
// 追加
update(proj.expand_video,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.inline)) obj.inline = new Object();
if(!(obj.inline.disable_same_video)) obj.inline.disable_same_video = false;
if(!(obj.inline.script_allow)) obj.inline.script_allow = "[]";
if(!(obj.inline.script_insert)) obj.inline.script_insert = "[]";
if(!(obj.video_element)) obj.video_element = new Object();
if(!(obj.video_element.script_allow)) obj.video_element.script_allow = "[]";
if(!(obj.youtube)) obj.youtube = new Object();
if(!(obj.youtube.visible_video)) obj.youtube.visible_video = false;
if(!(obj.nicovideo)) obj.nicovideo = new Object();
if(!(obj.nicovideo.visible_video)) obj.nicovideo.visible_video = false;
if(!(obj.nicovideo.visible_thumbnail_video)) obj.nicovideo.visible_thumbnail_video = false;
if(!(obj.nicovideo.visible_thumbnail_mylist)) obj.nicovideo.visible_thumbnail_mylist = false;
if(!(obj.nicovideo.visible_thumbnail_user)) obj.nicovideo.visible_thumbnail_user = false;
if(!(obj.nicovideo.visible_thumbnail_community)) obj.nicovideo.visible_thumbnail_community = false;
if(!(obj.nicovideo.visible_thumbnail_live)) obj.nicovideo.visible_thumbnail_live = false;
if(!(obj.ustream)) obj.ustream = new Object();
if(!(obj.ustream.visible_video)) obj.ustream.visible_video = false;
if(!(obj.dailymotion)) obj.dailymotion = new Object();
if(!(obj.dailymotion.visible_video)) obj.dailymotion.visible_video = false;
if(!(obj.vimeo)) obj.vimeo = new Object();
if(!(obj.vimeo.visible_video)) obj.vimeo.visible_video = false;
if(!(obj.fc2video)) obj.fc2video = new Object();
if(!(obj.fc2video.visible_video)) obj.fc2video.visible_video = false;
});
// インライン表示
var obj = addPreset(proj.expand_video,"inline",null);
obj.preset = {
name:{
standard:"Inline",
locales:{
ja:"インライン表示",
en:"Inline"
}
},
inline:{
disable_same_video:true,
video_max:10,
script_allow:PresetScript_ExpandVideo_InlineScriptAllow_Inline(),
script_insert:""
},
video_element:{
script_allow:""
},
youtube:{
visible_video:true
},
nicovideo:{
visible_video:true,
visible_thumbnail_video:true,
visible_thumbnail_mylist:true,
visible_thumbnail_user:true,
visible_thumbnail_community:true,
visible_thumbnail_live:true
},
ustream:{
visible_video_live:true,
visible_video_record:true
},
dailymotion:{
visible_video:true
},
vimeo:{
visible_video:true
},
fc2video:{
visible_video:true
}
};
// ------------------------------
// インラインフレーム展開定義
// ------------------------------
createArrayContainer("expand_iframe");
// 追加
update(proj.expand_iframe,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.inline)) obj.inline = new Object();
if(!(obj.inline.disable_same_iframe)) obj.inline.disable_same_iframe = false;
if(!(obj.inline.script_allow)) obj.inline.script_allow = "[]";
if(!(obj.inline.script_insert)) obj.inline.script_insert = "[]";
});
// Flash のインライン表示
var obj = addPreset(proj.expand_iframe,"expand_flash_inline",null);
obj.preset = {
name:{
standard:"Expand Flash Inline",
locales:{
ja:"Flash のインライン表示",
en:"Expand Flash Inline"
}
},
inline:{
disable_same_iframe:true,
script_allow:"",
script_insert:""
}
};
// PDF のインライン表示
var obj = addPreset(proj.expand_iframe,"expand_pdf_inline","expand_flash_inline");
obj.preset = {
name:{
standard:"Expand PDF Inline",
locales:{
ja:"PDF のインライン表示",
en:"Expand PDF Inline"
}
},
inline:{
disable_same_iframe:true,
script_allow:"",
script_insert:""
}
};
// ------------------------------
// スタイルシート定義
// ------------------------------
createArrayContainer("style_sheet");
// 追加
update(proj.style_sheet,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.expand_text)) obj.expand_text = new Object();
if(!(obj.expand_text.inline)) obj.expand_text.inline = "";
if(!(obj.expand_image)) obj.expand_image = new Object();
if(!(obj.expand_image.thumbnail)) obj.expand_image.thumbnail = "";
if(!(obj.expand_image.popup)) obj.expand_image.popup = "";
if(!(obj.expand_sound)) obj.expand_sound = new Object();
if(!(obj.expand_sound.inline)) obj.expand_sound.inline = "";
if(!(obj.expand_video)) obj.expand_video = new Object();
if(!(obj.expand_video.inline)) obj.expand_video.inline = new Object();
var inline = obj.expand_video.inline;
if(!(inline.video_element)) inline.video_element = new Object();
if(!(inline.video_element.video)) inline.video_element.video = "";
if(!(inline.youtube)) inline.youtube = new Object();
if(!(inline.youtube.video)) inline.youtube.video = "";
if(!(inline.nicovideo)) inline.nicovideo = new Object();
if(!(inline.nicovideo.video)) inline.nicovideo.video = "";
if(!(inline.nicovideo.thumbnail_video)) inline.nicovideo.thumbnail_video = "";
if(!(inline.nicovideo.thumbnail_mylist)) inline.nicovideo.thumbnail_mylist = "";
if(!(inline.nicovideo.thumbnail_user)) inline.nicovideo.thumbnail_user = "";
if(!(inline.nicovideo.thumbnail_community)) inline.nicovideo.thumbnail_community = "";
if(!(inline.nicovideo.thumbnail_live)) inline.nicovideo.thumbnail_live = "";
if(!(inline.ustream)) inline.ustream = new Object();
if(!(inline.ustream.video_live)) inline.ustream.video_live = "";
if(!(inline.ustream.video_record)) inline.ustream.video_record = "";
if(!(inline.dailymotion)) inline.dailymotion = new Object();
if(!(inline.dailymotion.video)) inline.dailymotion.video = "";
if(!(inline.vimeo)) inline.vimeo = new Object();
if(!(inline.vimeo.video)) inline.vimeo.video = "";
if(!(inline.fc2video)) inline.fc2video = new Object();
if(!(inline.fc2video.video)) inline.fc2video.video = "";
if(!(obj.expand_iframe)) obj.expand_iframe = new Object();
if(!(obj.expand_iframe.inline)) obj.expand_iframe.inline = "";
});
// シンプル
var obj = addPreset(proj.style_sheet,"simple",null);
obj.preset = {
name:{
standard:"Simple",
locales:{
ja:"シンプル",
en:"Simple"
}
},
expand_text:{
inline:"margin:2px 0px 2px 0px;"
},
expand_image:{
thumbnail:"margin:2px 0px 2px 0px; background-color:#FFF; border:1px #000 solid;",
popup:"background-color:#FFF; border:1px #000 solid;"
},
expand_sound:{
inline:"margin:2px 0px 2px 0px;"
},
expand_video:{
inline:{
video_element:{
video:"margin:2px 0px 2px 0px; width:720px; height:405px;"
},
youtube:{
video:"margin:2px 0px 2px 0px; width:720px; height:405px; border:0px;"
},
nicovideo:{
video:"margin:2px 0px 2px 0px; width:674px; height:386px; border:0px;",
thumbnail_video:"margin:2px 0px 2px 0px; width:400px; height:180px; border:0px;",
thumbnail_mylist:"margin:2px 0px 2px 0px; width:400px; height:180px; border:0px;",
thumbnail_user:"margin:2px 0px 2px 0px; width:340px; height:160px; border:0px;",
thumbnail_community:"margin:2px 0px 2px 0px; width:340px; height:180px; border:0px;",
thumbnail_live:"margin:2px 0px 2px 0px; width:340px; height:180px; border:0px;"
},
ustream:{
video_live:"margin:2px 0px 2px 0px; width:720px; height:405px; border:0px;",
video_record:"margin:2px 0px 2px 0px; width:720px; height:405px; border:0px;"
},
dailymotion:{
video:"margin:2px 0px 2px 0px; width:720px; height:405px; border:0px;"
},
vimeo:{
video:"margin:2px 0px 2px 0px; width:720px; height:405px; border:0px;"
},
fc2video:{
video:"margin:2px 0px 2px 0px; width:720px; height:405px; border:0px;"
}
}
},
expand_iframe:{
inline:"margin:2px 0px 2px 0px; background-color:#FFF; border:1px #000 solid;"
}
};
// デフォルト
var obj = addPreset(proj.style_sheet,"default","simple");
obj.preset = {
name:{
standard:"Default",
locales:{
ja:"デフォルト",
en:"Default"
}
},
expand_text:{
inline:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:4px; background-color:#FFF; display:block;"
},
expand_image:{
thumbnail:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF;",
popup:"margin:0px; border:1px #000 solid; padding:1px; background-color:#FFF;"
},
expand_sound:{
inline:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF;"
},
expand_video:{
inline:{
video_element:{
video:"margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:720px; height:405px;"
},
youtube:{
video:"margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:720px; height:405px;"
},
nicovideo:{
video:"margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:674px; height:386px;",
thumbnail_video:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:400px; height:180px;",
thumbnail_mylist:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:400px; height:180px;",
thumbnail_user:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:340px; height:160px;",
thumbnail_community:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:340px; height:180px;",
thumbnail_live:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:340px; height:180px;"
},
ustream:{
video_live:"margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:720px; height:405px;",
video_record:"margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:720px; height:405px;"
},
dailymotion:{
video:"margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:720px; height:405px;"
},
vimeo:{
video:"margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:720px; height:405px;"
},
fc2video:{
video:"margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:720px; height:405px;"
}
}
},
expand_iframe:{
inline:"margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF;"
}
};
// ------------------------------
// 試験運用展開定義
// ------------------------------
createArrayContainer("experimental");
// 追加
update(proj.experimental,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
});
// ------------------------------
// 言語設定
// ------------------------------
proj.language = {
type:-1
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.2
// ------------------------------
if(proj.version < 2){
// バージョン値
proj.version = 2;
// ニコニコ大百科
var obj = addPreset(proj.expand_bbs,"nicovideo_dictionary","4chan");
obj.preset = {
name:{
standard:"dic.nicovideo.jp",
locales:{
ja:"ニコニコ大百科",
en:"dic.nicovideo.jp"
}
},
enable:true,
script_allow:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.3
// ------------------------------
if(proj.version < 3){
// バージョン値
proj.version = 3;
// URLマッピング設定 追加
update(proj.urlmap,"*",function(obj){
if(!(obj.enable_unsecure)) obj.enable_unsecure = false;
});
// スレッド掲示板 追加
var obj = addPreset(proj.urlmap,"bbs","bbs");
obj.preset.filter.push("*://unkar.org/r/*/*");
// unkar.org
var obj = addPreset(proj.expand_bbs,"unkar","mimizun");
obj.preset = {
name:{
standard:"unkar.org",
locales:{
ja:"うんかー",
en:"unkar.org"
}
},
enable:true,
script_allow:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.4
// ------------------------------
if(proj.version < 4){
// バージョン値
proj.version = 4;
// ------------------------------
// 基本設定
// ------------------------------
proj.standard.enable_output_log = false;
// ------------------------------
// 掲示板設定
// ------------------------------
// 追加
update(proj.expand_bbs,"*",function(obj){
if(!(obj.filter)) obj.filter = new Array();
if(!(obj.script_initialize)) obj.script_initialize = PresetScript_ExpandBbs_ScriptInitialize();
});
// 削除
updatePreset(proj.expand_bbs,"*",function(obj){
if(obj.script_allow !== undefined) delete obj.script_allow;
});
// 2ちゃんねる掲示板
update(proj.expand_bbs,"2ch",function(obj){
obj.filter = [
{
pattern:"http://.*\\.2ch\\.net/test/read\\.cgi/.*/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://.*\\.machi\\.to/bbs/read\\.cgi/.*/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://machibbs\\.net/.*/[0-9]+.html",
flags:{i:true,g:false}
},{
pattern:"http://.*\\.machibbs\\.net/.*/[0-9]+.html",
flags:{i:true,g:false}
},{
pattern:"http://.*\\.bbspink\\.com/test/read\\.cgi/.*/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://jbbs\\.livedoor\\.jp/bbs/read.cgi/.*/[0-9]+/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://.*\\.kakiko\\.com/test/read\\.cgi/.*/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://.*\\.60\\.kg/test/read\\.cgi/.*/[0-9]+",
flags:{i:true,g:false}
}
];
obj.script_initialize = "";
obj.script_callback = "";
});
// ログ速
update(proj.expand_bbs,"logsoku",function(obj){
obj.filter = [
{
pattern:"http://logsoku\\.com/thread/.*\\.2ch\\.net/.*/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://.*\\.atchs\\.jp/test/read\\.cgi/.*/[0-9]+",
flags:{i:true,g:false}
}
];
obj.script_initialize = "";
obj.script_callback = "";
});
// みみずん検索
update(proj.expand_bbs,"mimizun",function(obj){
obj.filter = [
{
pattern:"http://mimizun\\.com/log/2ch/.*/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://mimizun\\.com/log/machi/.*/[0-9]+",
flags:{i:true,g:false}
}
];
obj.script_initialize = "";
obj.script_callback = "";
});
// unkar.org
update(proj.expand_bbs,"unkar",function(obj){
obj.filter = [
{
pattern:"http://unkar\\.org/r/.*/[0-9]+",
flags:{i:true,g:false}
}
];
obj.script_initialize = "";
obj.script_callback = "";
});
// ふたば☆ちゃんねる
update(proj.expand_bbs,"2chan",function(obj){
obj.filter = [
{
pattern:"http://.*?\\.2chan\\.net/.*/",
flags:{i:true,g:false}
}
];
});
// 4chan.org
update(proj.expand_bbs,"4chan",function(obj){
obj.filter = [
{
pattern:"http://boards\\.4chan\\.org/.*/",
flags:{i:true,g:false}
}
];
obj.script_callback = "";
});
// ニコニコ大百科
update(proj.expand_bbs,"nicovideo_dictionary",function(obj){
obj.filter = [
{
pattern:"http://dic\\.nicovideo\\.jp/b/a/.+",
flags:{i:true,g:false}
},{
pattern:"http://dic\\.nicovideo\\.jp/a/.+",
flags:{i:true,g:false}
}
];
obj.script_initialize = "";
obj.script_callback = "";
});
// ------------------------------
// 「ハイパーリンク置換定義」を「アンカー置換定義」に変更
// ------------------------------
update(proj.urlmap,"*",function(obj){
obj.replacement_to_anchor = obj.replacement_to_link;
delete obj.replacement_to_link;
});
proj.replacement_to_anchor = proj.replacement_to_link;
delete proj.replacement_to_link;
// ------------------------------
// アクセスブロック定義
// ------------------------------
var obj = addPreset(proj.access_block,"opera_extension",null);
obj.preset = {
name:{
standard:"For Opera Extension",
locales:{
ja:"Opera 拡張機能用",
en:"For Opera Extension"
}
},
filter:[]
};
// ------------------------------
// エレメント置換定義
// ------------------------------
// 連続するBRタグを削除
var obj = addPreset(proj.replacement_to_element,"delete_br_tags","meiryo_font");
obj.preset = {
name:{
standard:"Delete BR Tags Continuous",
locales:{
ja:"連続するBRタグを削除",
en:"Delete BR Tags Continuous"
}
},
script:PresetScript_ReplacementToElement_DeleteBrTags()
};
// ------------------------------
// アンカー置換定義
// ------------------------------
// イメージ検索用ポップアップ無効化
var obj = addPreset(proj.replacement_to_anchor,"disable_popup_image_search","direct_link_realtime_search");
obj.preset = {
name:{
standard:"Disable Popup (image search)",
locales:{
ja:"ポップアップを無効化(イメージ検索用)",
en:"Disable Popup (image search)"
}
},
script:""
};
// 「イメージ検索用」を破棄
removePreset("replacement_to_anchor","direct_link_image_search");
// ツイッター用
var obj = addPreset(proj.replacement_to_anchor,"direct_link_twitter","direct_link_realtime_search");
obj.preset = {
name:{
standard:"Direct Link (twitter.com)",
locales:{
ja:"直リンクに変更(ツイッター用)",
en:"Direct Link (twitter.com)"
}
},
script:""
};
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
createArrayContainer("replacement_to_link");
// イメージ検索用
var obj = addPreset(proj.replacement_to_link,"direct_link_image_search",null);
obj.preset = {
name:{
standard:"Direct Link (image search)",
locales:{
ja:"直リンク(イメージ検索用)",
en:"Direct Link (image search)"
}
},
filter:[
{
name:{
standard:"Google",
locales:{
ja:"Google 画像検索",
en:"Google"
}
},
filter:[
"*://*.google.*/imgres?*",
"*://*.google.co.*/imgres?*",
"*://*.google.com.*/imgres?*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Yahoo Image Search",
locales:{
ja:"Yahoo Image Search",
en:"Yahoo Image Search"
}
},
filter:[
"*://images.search.yahoo.com/images/view;*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Yahoo! JAPAN",
locales:{
ja:"Yahoo! JAPAN 画像検索",
en:"Yahoo! JAPAN"
}
},
filter:[
"*://ord.yahoo.co.jp/o/image/*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Bing",
locales:{
ja:"Bing 画像検索",
en:"Bing"
}
},
filter:[
"*://www.bing.com/images/search?*"
],
enable_reflect_to_anchor:false,
script:""
}
]
};
// 直リンク(汎用)
var obj = addPreset(proj.replacement_to_link,"direct_link_generic","direct_link_image_search");
obj.preset = {
name:{
standard:"Direct Link (generic)",
locales:{
ja:"直リンク(汎用)",
en:"Direct Link (generic)"
}
},
filter:[
{
name:{
standard:"OGP \"og:image\"",
locales:{
ja:"OGP \"og:image\"",
en:"OGP \"og:image\""
}
},
filter:[
"*://instagr.am/p/*",
"*://www.flickr.com/photos/*/*",
"*://lockerz.com/s/*",
"*://pics.lockerz.com/s/*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Twitpic",
locales:{
ja:"Twitpic",
en:"Twitpic"
}
},
filter:[
"*://twitpic.com/*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Twitter Photo",
locales:{
ja:"Twitter Photo",
en:"Twitter Photo"
}
},
filter:[
"*://pic.twitter.com/*",
"*://twitter.com/*/status/*/photo/*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Facebook Photo",
locales:{
ja:"Facebook Photo",
en:"Facebook Photo"
}
},
filter:[
"*://www.facebook.com/photo.php?*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Tumblr",
locales:{
ja:"Tumblr",
en:"Tumblr"
}
},
filter:[
"*://*.tumblr.com/post/*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Photozou Photo",
locales:{
ja:"フォト蔵",
en:"Photozou Photo"
}
},
filter:[
"*://photozou.jp/photo/show/*/*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"Twipple Photo",
locales:{
ja:"ついっぷる",
en:"Twipple Photo"
}
},
filter:[
"*://p.twipple.jp/*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"NICONICO SEIGA (must log in)",
locales:{
ja:"ニコニコ静画 (ログインが必要)",
en:"NICONICO SEIGA (must log in)"
}
},
filter:[
"*://seiga.nicovideo.jp/seiga/im*",
"*://nico.ms/im*"
],
enable_reflect_to_anchor:false,
script:""
},{
name:{
standard:"pixiv (must referer)",
locales:{
ja:"ピクシブ (リファラが必要)",
en:"pixiv (must referer)"
}
},
filter:[
"*://www.pixiv.net/member_illust.php?*illust_id*"
],
enable_reflect_to_anchor:false,
script:""
}
]
};
// ------------------------------
// リファラ置換定義
// ------------------------------
// 追加
update(proj.replacement_to_referer,"*",function(obj){
if(!(obj.filter)) obj.filter = new Array();
});
// 削除
updatePreset(proj.replacement_to_referer,"*",function(obj){
if(obj.script !== undefined) delete obj.script;
});
// 空文字列に変更
update(proj.replacement_to_referer,"replacement_empty",function(obj){
obj.filter = [
{
name:{
standard:"Empty",
locales:{
ja:"空文字列",
en:"Empty"
}
},
filter:[
"*://*"
],
send_referer:{
type:"custom",
custom:"",
regexp:{
pattern:"",
flags:{i:false,g:false}
},
replacement:""
}
}
];
});
// リンク先のURLに変更
var obj = addPreset(proj.replacement_to_referer,"replacement_link_url","replacement_link");
obj.preset = {
name:{
standard:"Replace Link URL",
locales:{
ja:"リンク先のURLに変更",
en:"Replace Link URL"
}
},
filter:[
{
name:{
standard:"Link URL",
locales:{
ja:"リンク先のURL",
en:"Link URL"
}
},
filter:[
"*://*"
],
send_referer:{
type:"link_url",
custom:"",
regexp:{
pattern:"",
flags:{i:false,g:false}
},
replacement:""
}
}
]
};
// リンク先のディレクトリに変更
var obj = addPreset(proj.replacement_to_referer,"replacement_link_directory","replacement_link");
obj.preset = {
name:{
standard:"Replace Link Directory",
locales:{
ja:"リンク先のカレントディレクトリに変更",
en:"Replace Link Directory"
}
},
filter:[
{
name:{
standard:"Link Directory",
locales:{
ja:"リンク先のディレクトリ",
en:"Link Directory"
}
},
filter:[
"*://*"
],
send_referer:{
type:"link_url",
custom:"",
regexp:{
pattern:"^(http|https|ftp)(:\\/\\/.*\\/).*",
flags:{i:true,g:false}
},
replacement:"\\1\\2"
}
}
]
};
// リンク先のドメインに変更
var obj = addPreset(proj.replacement_to_referer,"replacement_link_domain","replacement_link_directory");
obj.preset = {
name:{
standard:"Replace Link Domain",
locales:{
ja:"リンク先のドメインに変更",
en:"Replace Link Domain"
}
},
filter:[
{
name:{
standard:"Link Domain",
locales:{
ja:"リンク先のドメイン",
en:"Link Domain"
}
},
filter:[
"*://*"
],
send_referer:{
type:"link_url",
custom:"",
regexp:{
pattern:"^(http|https|ftp)(:\\/\\/.*?\\/).*",
flags:{i:true,g:false}
},
replacement:"\\1\\2"
}
}
]
};
// 古い「リンク先のURL」を破棄
removePreset("replacement_to_referer","replacement_link");
// ------------------------------
// ユーザーエージェント置換定義
// ------------------------------
// 追加
update(proj.replacement_to_useragent,"*",function(obj){
if(!(obj.filter)) obj.filter = new Array();
});
// 削除
updatePreset(proj.replacement_to_useragent,"*",function(obj){
if(obj.script !== undefined) delete obj.script;
});
// iPhone4
update(proj.replacement_to_useragent,"iphone_4",function(obj){
obj.filter = [
{
name:{
standard:"iPhone4",
locales:{
ja:"iPhone4",
en:"iPhone4"
}
},
filter:[
"*://*"
],
send_useragent:{
custom:"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7"
}
}
];
});
// Android 2.1
update(proj.replacement_to_useragent,"android_2_1",function(obj){
obj.filter = [
{
name:{
standard:"Android 2.1",
locales:{
ja:"Android 2.1",
en:"Android 2.1"
}
},
filter:[
"*://*"
],
send_useragent:{
custom:"Mozilla/5.0 (Linux; U; Android 2.1-update1; ja-jp; XXX Build/RA201) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17"
}
}
];
});
// DoCoMo/2.0
update(proj.replacement_to_useragent,"docomo_2_0",function(obj){
obj.filter = [
{
name:{
standard:"DoCoMo / 2.0",
locales:{
ja:"DoCoMo / 2.0",
en:"DoCoMo / 2.0"
}
},
filter:[
"*://*"
],
send_useragent:{
custom:"DoCoMo/2.0 XXX(c100;TB)"
}
}
];
});
// ------------------------------
// 短縮 URL 展開
// ------------------------------
// 詳細
var obj = getPreset(proj.expand_short_url,"detail");
obj.filter.splice(7,0,
"http://pic.twitter.com/*",
"http://tmblr.co/*"
);
// ------------------------------
// テキスト展開定義
// ------------------------------
// インライン表示
var obj = addPreset(proj.expand_text,"inline",null);
obj.preset.inline.script_allow = PresetScript_ExpandText_InlineScriptAllow_Inline();
// ------------------------------
// イメージ展開定義
// ------------------------------
// サムネイル表示
var obj = addPreset(proj.expand_image,"thumbnail",null);
obj.preset.thumbnail.script_allow = "";
// ポップアップ表示
var obj = addPreset(proj.expand_image,"popup",null);
obj.preset.popup.script_allow = "";
// ------------------------------
// サウンド展開定義
// ------------------------------
// インライン表示
var obj = addPreset(proj.expand_sound,"inline",null);
obj.preset.inline.script_allow = "";
// ------------------------------
// ビデオ展開定義
// ------------------------------
// 追加
update(proj.expand_video,"*",function(obj){
if(!(obj.nicovideo.visible_thumbnail_seiga)) obj.nicovideo.visible_thumbnail_seiga = true;
if(!(obj.liveleak)) obj.liveleak = new Object();
if(!(obj.liveleak.visible_video)) obj.liveleak.visible_video = true;
});
// インライン表示
var obj = addPreset(proj.expand_video,"inline",null);
obj.preset.video_element.script_allow = PresetScript_ExpandVideo_VideoElementScriptAllow_Inline();
// ------------------------------
// インラインフレーム展開定義
// ------------------------------
// Flash のインライン表示
var obj = addPreset(proj.expand_iframe,"expand_flash_inline",null);
obj.preset.inline.script_allow = PresetScript_ExpandIframe_InlineScriptAllow_ExpandFlashInline();
// PDF のインライン表示
var obj = addPreset(proj.expand_iframe,"expand_pdf_inline",null);
obj.preset.inline.script_allow = PresetScript_ExpandIframe_InlineScriptAllow_ExpandPdfInline();
// ------------------------------
// スタイルシート定義
// ------------------------------
// 追加
update(proj.style_sheet,"*",function(obj){
var inline = obj.expand_video.inline;
if(!(inline.nicovideo.thumbnail_seiga)) inline.nicovideo.thumbnail_seiga = "";
if(!(inline.liveleak)) inline.liveleak = new Object();
if(!(inline.liveleak.video)) inline.liveleak.video = "";
});
// デフォルト
update(proj.style_sheet,"default",function(obj){
obj.expand_video.inline.nicovideo.thumbnail_seiga = "margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:312px; height:176px;";
obj.expand_video.inline.liveleak.video = "margin:2px 0px 2px 0px; border:1px #000 solid; background-color:#000; width:640px; height:360px;";
});
// シンプル
update(proj.style_sheet,"simple",function(obj){
obj.expand_video.inline.nicovideo.thumbnail_seiga = "margin:2px 0px 2px 0px; width:312px; height:176px; border:0px;";
obj.expand_video.inline.liveleak.video = "margin:2px 0px 2px 0px; width:640px; height:360px; border:0px;";
});
// ------------------------------
// URLマッピング設定
// ------------------------------
// 追加
update(proj.urlmap,"*",function(obj){
if(!(obj.replacement_to_link)) obj.replacement_to_link = new Object();
var replacement_to_link = obj.replacement_to_link;
if(!(replacement_to_link.enable)) replacement_to_link.enable = false;
if(!(replacement_to_link.id)) replacement_to_link.id = "";
});
// twitter
var preset = getPreset(proj.urlmap,"twitter");
preset.replacement_to_anchor = {enable:true,id:"direct_link_twitter"};
preset.replacement_to_link = {enable:true,id:"direct_link_generic"};
preset.replacement_to_referer = {enable:true,id:"replacement_link_url"};
// スレッド掲示板
var preset = getPreset(proj.urlmap,"bbs");
preset.replacement_to_link = {enable:true,id:"direct_link_generic"};
preset.replacement_to_referer = {enable:true,id:"replacement_link_url"};
// 画像掲示板
var preset = getPreset(proj.urlmap,"image_bbs");
preset.replacement_to_link = {enable:true,id:"direct_link_generic"};
preset.replacement_to_referer = {enable:true,id:"replacement_link_url"};
// 画像検索サイト
var obj = addPreset(proj.urlmap,"image_search",null);
obj.preset.replacement_to_referer = {enable:true,id:"replacement_link_url"};
obj.preset.replacement_to_anchor = {enable:true,id:"disable_popup_image_search"};
obj.preset.replacement_to_link = {enable:true,id:"direct_link_image_search"};
obj.preset.filter = [
"*://*.google.at/search?*tbm=isch*",
"*://*.google.be/search?*tbm=isch*",
"*://*.google.ca/search?*tbm=isch*",
"*://*.google.ch/search?*tbm=isch*",
"*://*.google.de/search?*tbm=isch*",
"*://*.google.es/search?*tbm=isch*",
"*://*.google.fr/search?*tbm=isch*",
"*://*.google.it/search?*tbm=isch*",
"*://*.google.nl/search?*tbm=isch*",
"*://*.google.no/search?*tbm=isch*",
"*://*.google.pl/search?*tbm=isch*",
"*://*.google.ru/search?*tbm=isch*",
"*://*.google.se/search?*tbm=isch*",
"*://*.google.co.id/search?*tbm=isch*",
"*://*.google.co.in/search?*tbm=isch*",
"*://*.google.co.jp/search?*tbm=isch*",
"*://*.google.co.th/search?*tbm=isch*",
"*://*.google.co.uk/search?*tbm=isch*",
"*://*.google.co.za/search?*tbm=isch*",
"*://*.google.com/search?*tbm=isch*",
"*://*.google.com.ar/search?*tbm=isch*",
"*://*.google.com.au/search?*tbm=isch*",
"*://*.google.com.br/search?*tbm=isch*",
"*://*.google.com.mx/search?*tbm=isch*",
"*://*.google.com.sa/search?*tbm=isch*",
"*://*.google.com.tr/search?*tbm=isch*",
"*://*.google.com.tw/search?*tbm=isch*",
"*://www.google.at/images?*",
"*://www.google.be/images?*",
"*://www.google.ca/images?*",
"*://www.google.ch/images?*",
"*://www.google.de/images?*",
"*://www.google.es/images?*",
"*://www.google.fr/images?*",
"*://www.google.it/images?*",
"*://www.google.nl/images?*",
"*://www.google.no/images?*",
"*://www.google.pl/images?*",
"*://www.google.ru/images?*",
"*://www.google.se/images?*",
"*://www.google.co.id/images?*",
"*://www.google.co.in/images?*",
"*://www.google.co.jp/images?*",
"*://www.google.co.th/images?*",
"*://www.google.co.uk/images?*",
"*://www.google.co.za/images?*",
"*://www.google.com/images?*",
"*://www.google.com.ar/images?*",
"*://www.google.com.au/images?*",
"*://www.google.com.br/images?*",
"*://www.google.com.mx/images?*",
"*://www.google.com.sa/images?*",
"*://www.google.com.tr/images?*",
"*://www.google.com.tw/images?*",
"*://images.search.yahoo.com/search/images*",
"*://image.search.yahoo.co.jp/search?*",
"*://www.bing.com/images/search?*"
];
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.5
// ------------------------------
if(proj.version < 5){
// バージョン値
proj.version = 5;
// ------------------------------
// テキスト置換定義
// ------------------------------
// 空白とタブを可視化
var obj = addPreset(proj.replacement_to_text,"visualize_space_and_tab",null);
obj.preset = {
name:{
standard:"Visualize spaces and tabs",
locales:{
ja:"空白とタブを可視化",
en:"Visualize spaces and tabs"
}
},
script:PresetScript_ReplacementToText_VisualizeSpaceAndTab()
};
// ------------------------------
// アンカー置換定義
// ------------------------------
// 2ch.net 用
var preset = getPreset(proj.replacement_to_anchor,"direct_link_bbs");
preset.script = "";
// 検索用
var preset = getPreset(proj.replacement_to_anchor,"direct_link_search");
preset.script = PresetScript_ReplacementToAnchor_DirectLinkSearch();
// リアルタイム検索用
var preset = getPreset(proj.replacement_to_anchor,"direct_link_realtime_search");
preset.script = "";
// ツイッター用
var preset = getPreset(proj.replacement_to_anchor,"direct_link_twitter");
preset.script = "";
// イメージ検索用ポップアップ無効化
var preset = getPreset(proj.replacement_to_anchor,"disable_popup_image_search");
preset.script = PresetScript_ReplacementToAnchor_DisablePopupImageSearch();
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// 直リンク(汎用)
updatePreset(proj.replacement_to_link,"direct_link_generic",function(obj){
obj.filter[0].filter.splice(0,0,"*://instagram.com/p/*");
obj.filter.splice(1,0,{
name:{
standard:"OGP \"twitter:*\"",
locales:{
ja:"OGP \"twitter:*\"",
en:"OGP \"twitter:*\""
}
},
filter:[],
enable_reflect_to_anchor:false,
script:""
});
});
// イメージ検索用
updatePreset(proj.replacement_to_link,"direct_link_image_search",function(obj){
obj.filter[1].filter.push("*://*.images.search.yahoo.com/images/view;*");
obj.filter[1].filter.push("*://*.image.search.yahoo.com/images/view;*");
obj.filter[1].script = "";
obj.filter.splice(3,0,{
name:{
standard:"yahoo.cn",
locales:{
ja:"yahoo.cn",
en:"yahoo.cn"
}
},
filter:[
"http://image.yahoo.cn/view?*"
],
enable_reflect_to_anchor:false,
script:""
});
obj.filter.push({
name:{
standard:"Ask.com",
locales:{
ja:"Ask 画像検索",
en:"Ask.com"
}
},
filter:[
"*://*.ask.com/fr?*"
],
enable_reflect_to_anchor:false,
script:""
});
obj.filter.push({
name:{
standard:"AOL Image Search",
locales:{
ja:"AOL 画像検索",
en:"AOL Image Search"
}
},
filter:[
"*://search.aol.*/aol/imageDetails?*"
],
enable_reflect_to_anchor:false,
script:""
});
obj.filter.push({
name:{
standard:"goo",
locales:{
ja:"goo 画像検索",
en:"goo"
}
},
filter:[
"*://*bsearch.goo.ne.jp/image_detail.php?*DOC_ID=*",
"*://*bsearch.goo.ne.jp/similarity.php?*DOC_ID=*",
"*://*bsearch.goo.ne.jp/imgdt.php?*DOC_ID=*"
],
enable_reflect_to_anchor:false,
script:""
});
obj.filter.push({
name:{
standard:"Baidu",
locales:{
ja:"百度",
en:"Baidu"
}
},
filter:[
"http://image.baidu.com/i*"
],
enable_reflect_to_anchor:false,
script:""
});
obj.filter.push({
name:{
standard:"Baidu.jp",
locales:{
ja:"Baidu.jp",
en:"Baidu.jp"
}
},
filter:[
"http://image.baidu.jp/*baiduimagedetail*di=*"
],
enable_reflect_to_anchor:false,
script:""
});
obj.filter.push({
name:{
standard:"NAVER",
locales:{
ja:"NAVER 画像検索",
en:"NAVER"
}
},
filter:[
"http://imagesearch.naver.com/search*",
"http://image.search.naver.com/search*"
],
enable_reflect_to_anchor:false,
script:""
});
obj.filter.push({
name:{
standard:"naver.jp",
locales:{
ja:"naver.jp",
en:"naver.jp"
}
},
filter:[
"http://*search.naver.jp/image?*",
"http://image.search.biglobe.ne.jp/search?*"
],
enable_reflect_to_anchor:false,
script:""
});
});
// ウィキペディア用
var obj = addPreset(proj.replacement_to_link,"direct_link_wikipedia",null);
obj.preset = {
name:{
standard:"Direct Link (wikipedia.org)",
locales:{
ja:"直リンク(ウィキペディア用)",
en:"Direct Link (wikipedia.org)"
}
},
filter:[
{
name:{
standard:"File:",
locales:{
ja:"ファイル:",
en:"File:"
}
},
filter:[
"*://*.wikipedia.org/wiki/*:*",
"*://*.wikipedia.org/w/*:*",
"*://*.wikimedia.org/wiki/*:*",
"*://*.wikimedia.org/w/*:*"
],
enable_reflect_to_anchor:false,
script:""
}
]
};
// ------------------------------
// サウンド展開定義
// ------------------------------
// 追加
update(proj.expand_sound,"*",function(obj){
if(!obj.audio_element) obj.audio_element = new Object();
obj.audio_element.script_allow = PresetScript_ExpandSound_AudioElementScriptAllow_Inline();
if(!obj.soundcloud) obj.soundcloud = new Object();
obj.soundcloud.visible_player_flash = true;
obj.soundcloud.visible_player_html5 = false;
if(!obj.mixcloud) obj.mixcloud = new Object();
obj.mixcloud.visible_player = true;
obj.inline.script_allow = PresetScript_ExpandSound_InlineScriptAllow_Inline();
obj.inline.script_insert = "";
obj.inline.sound_max = 10;
});
// ------------------------------
// スタイルシート定義
// ------------------------------
// 追加
update(proj.style_sheet,"*",function(obj){
var inline = new Object();
if(!(inline.audio_element)) inline.audio_element = new Object();
inline.audio_element.audio = obj.expand_sound.inline;
if(!(inline.soundcloud)) inline.soundcloud = new Object();
if(!(inline.mixcloud)) inline.mixcloud = new Object();
obj.expand_sound.inline = inline;
});
// デフォルト
update(proj.style_sheet,"default",function(obj){
obj.expand_sound.inline.soundcloud.player_flash = "margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:100%;";
obj.expand_sound.inline.soundcloud.player_html5 = "margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:100%;";
obj.expand_sound.inline.mixcloud.player = "margin:2px 0px 2px 0px; border:1px #000 solid; padding:1px; background-color:#FFF; width:460px; height:68px;";
});
// シンプル
update(proj.style_sheet,"simple",function(obj){
obj.expand_sound.inline.soundcloud.player_flash = "margin:2px 0px 2px 0px; width:100%; border:0px;";
obj.expand_sound.inline.soundcloud.player_html5 = "margin:2px 0px 2px 0px; width:100%; border:0px;";
obj.expand_sound.inline.mixcloud.player = "margin:2px 0px 2px 0px; width:460px; border:0px; height:68px;";
});
// ------------------------------
// URLマッピング設定
// ------------------------------
// 追加
update(proj.urlmap,"*",function(obj){
// マルチ化
if(obj.replacement_to_element.enable){
obj.replacement_to_element.id = [obj.replacement_to_element.id];
}else{
obj.replacement_to_element.id = [];
}
if(obj.replacement_to_text.enable){
obj.replacement_to_text.id = [obj.replacement_to_text.id];
}else{
obj.replacement_to_text.id = [];
}
if(obj.replacement_to_anchor.enable){
obj.replacement_to_anchor.id = [obj.replacement_to_anchor.id];
}else{
obj.replacement_to_anchor.id = [];
}
});
// リアルタイム検索用
var preset = getPreset(proj.urlmap,"realtime_search");
preset.replacement_to_anchor.id.push("no_referrer");
preset.filter.push("*://search.goo.ne.jp/web.jsp?*from=lside_twitter*");
preset.filter.push("*://search.goo.ne.jp/web.jsp?*mode=1*");
preset.replacement_to_link = {enable:true,id:"direct_link_generic"};
preset.expand_short_url = {enable:true,id:"detail"};
// 検索サイト
var preset = getPreset(proj.urlmap,"search");
preset.replacement_to_anchor.id.push("no_referrer");
// twitter
var preset = getPreset(proj.urlmap,"twitter");
preset.replacement_to_anchor.id.push("no_referrer");
// スレッド掲示板
var preset = getPreset(proj.urlmap,"bbs");
preset.replacement_to_anchor.id.push("no_referrer");
// 画像検索サイト
var preset = getPreset(proj.urlmap,"image_search");
preset.replacement_to_anchor.id.push("no_referrer");
preset.filter.splice(55,0,"*://*.images.search.yahoo.com/search/images*");
preset.filter.splice(56,0,"*://*.image.search.yahoo.com/search/images*");
preset.filter.splice(58,0,"*://image.yahoo.cn/s?*");
preset.filter.push("*://*.ask.com/pictures?*");
preset.filter.push("*://search.aol.com/aol/image?*");
preset.filter.push("*://search.aol.jp/aol/image?*");
preset.filter.push("*://*bsearch.goo.ne.jp/image.php?*MT=*");
preset.filter.push("*://*bsearch.goo.ne.jp/scrimg.php?*MT=*");
preset.filter.push("*://*bsearch.goo.ne.jp/similarity.php?*MT=*");
preset.filter.push("*://image.baidu.com/*");
preset.filter.push("*://image.baidu.jp/*");
preset.filter.push("*://image.search.naver.com/*");
preset.filter.push("*://*search.naver.jp/image?*");
preset.filter.push("*://image.search.biglobe.ne.jp/search?*");
// ウィキペディア
var obj = addPreset(proj.urlmap,"wikipedia","default");
obj.preset = {
name:{
standard:"Wikipedia",
locales:{
ja:"ウィキペディア",
en:"Wikipedia"
}
},
enable:true,
filter:[
"*://*.wikipedia.org/*"
],
enable_unsecure:false,
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:[]},
replacement_to_text:{enable:false,id:[]},
replacement_to_anchor:{enable:true,id:["no_referrer"]},
replacement_to_link:{enable:true,id:"direct_link_wikipedia"},
replacement_to_referer:{enable:false,id:""},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"simple"},
expand_short_url:{enable:true,id:"simple"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.6
// ------------------------------
if(proj.version < 6){
// バージョン値
proj.version = 6;
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// イメージ検索用
updatePreset(proj.replacement_to_link,"direct_link_image_search",function(obj){
obj.filter.splice(7,0,{
name:{
standard:"Yandex Images",
locales:{
ja:"Yandex 画像検索",
en:"Yandex Images"
}
},
filter:[
"http://images.yandex.ru/yandsearch?*",
"http://images.yandex.com/yandsearch?*"
],
enable_reflect_to_anchor:false,
script:""
});
});
// ------------------------------
// URLマッピング設定
// ------------------------------
// 画像検索サイト
var preset = getPreset(proj.urlmap,"image_search");
preset.filter.splice(63,0,"*://images.yandex.ru/*");
preset.filter.splice(64,0,"*://images.yandex.com/*");
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.7
// ------------------------------
if(proj.version < 7){
// バージョン値
proj.version = 7;
// ------------------------------
// 掲示板設定
// ------------------------------
// ログ速
update(proj.expand_bbs,"logsoku",function(obj){
obj.filter = [
{
pattern:"http://logsoku\\.com/thread/.*\\.2ch\\.net/.*?/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://.*?\\.logsoku\\.com/r/.*?/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"http://logsoku\\.com/r/.*?/[0-9]+",
flags:{i:true,g:false}
}
];
obj.script_initialize = "";
obj.script_callback = "";
});
// あっとちゃんねるず
var obj = addPreset(proj.expand_bbs,"atchs","unkar");
obj.preset = {
name:{
standard:"atchs.jp",
locales:{
ja:"あっとちゃんねるず",
en:"atchs.jp"
}
},
enable:true,
filter:[],
script_initialize:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
// ------------------------------
// アクセスブロック定義
// ------------------------------
var obj = addPreset(proj.access_block,"firefox_extension","opera_extension");
obj.preset = {
name:{
standard:"For Firefox Extension",
locales:{
ja:"Firefox 拡張機能用",
en:"For Firefox Extension"
}
},
filter:[]
};
// ------------------------------
// リファラ置換定義
// ------------------------------
update(proj.replacement_to_referer,"*",function(obj){
var filter = obj.filter;
var i;
var num = filter.length;
for(i=0;i<num;i++){
var send_referer = filter[i].send_referer;
var str = send_referer.replacement.replace(new RegExp("[$]","g"), "$$$$");
send_referer.replacement = str.replace(new RegExp("\\\\\\\\|\\\\[0-9]","g"),function(str, p1, p2) {
if(str == "\\\\") return "\\";
return "$" + str[1];
});
}
});
var obj = addPreset(proj.replacement_to_referer,"firefox_extension",null);
obj.preset = {
name:{
standard:"For Firefox Extension",
locales:{
ja:"Firefox 拡張機能用",
en:"For Firefox Extension"
}
},
filter:[]
};
// ------------------------------
// ユーザーエージェント置換定義
// ------------------------------
var obj = addPreset(proj.replacement_to_useragent,"firefox_extension",null);
obj.preset = {
name:{
standard:"For Firefox Extension",
locales:{
ja:"Firefox 拡張機能用",
en:"For Firefox Extension"
}
},
filter:[]
};
// ------------------------------
// アンカー置換定義
// ------------------------------
// ツイッター用
var preset = getPreset(proj.replacement_to_anchor,"direct_link_twitter");
preset.script = PresetScript_ReplacementToAnchor_DirectLinkTwitter();
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// 追加
updatePreset(proj.replacement_to_link,"*",function(obj){
var filter = obj.filter;
var i;
var num = filter.length;
for(i=0;i<num;i++){
filter[i].enable_cache = true;
}
});
// 直リンク(汎用)
updatePreset(proj.replacement_to_link,"direct_link_generic",function(obj){
var filter = obj.filter;
// Facebook Photo
filter[4].script = "";
});
// ------------------------------
// 短縮 URL 展開
// ------------------------------
// 簡易
var obj = getPreset(proj.expand_short_url,"simple");
obj.filter[7] = "*://t.co/*";
// 詳細
var obj = getPreset(proj.expand_short_url,"detail");
obj.filter[6] = "*://t.co/*";
// ------------------------------
// URLマッピング設定
// ------------------------------
// スレッド掲示板 追加
var obj = addPreset(proj.urlmap,"bbs","bbs");
obj.preset.filter.splice(8,0,"*://*.logsoku.com/*");
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.8
// ------------------------------
if(proj.version < 8){
// バージョン値
proj.version = 8;
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// イメージ検索用
updatePreset(proj.replacement_to_link,"direct_link_image_search",function(obj){
var filter = obj.filter;
// Bing 画像検索
filter[4].script = "";
// Yandex 画像検索
filter[7].script = "";
// 百度
filter[9].script = "";
// naver.jp
filter[12].enable_cache = false;
});
// ------------------------------
// イメージ展開定義
// ------------------------------
// 追加
update(proj.expand_image,"*",function(obj){
var enable_animation = false;
if(obj.popup.enable_animation){
enable_animation = true;
}
obj.popup.enable_animation_scale = enable_animation;
obj.popup.enable_animation_alpha = enable_animation;
delete obj.popup.enable_animation;
if((obj.popup.load_type) === undefined) obj.popup.load_type = "preload";
if((obj.thumbnail.load_type) === undefined) obj.thumbnail.load_type ="preload";
if((obj.load) === undefined) obj.load = new Object();
if((obj.load.enable_notify) === undefined) obj.load.enable_notify = true;
if((obj.load.enable_unload) === undefined) obj.load.enable_unload = false;
if((obj.load.unload_allow_size_more_then) === undefined) obj.load.unload_allow_size_more_then = 256;
});
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.9
// ------------------------------
if(proj.version < 9){
// バージョン値
proj.version = 9;
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// 直リンク(汎用)
updatePreset(proj.replacement_to_link,"direct_link_generic",function(obj){
var filter = obj.filter;
// OGP "og:image"
filter[0].filter.push("*://twitter.yfrog.com/*");
filter[0].filter.push("*://yfrog.com/*");
// OGP "twitter:*"
filter[1].filter.push("*://campl.us/*");
// Twitpic
filter[2].script = "";
// Giphy
filter.splice(6,0,{
name:{
standard:"giphy.com",
locales:{
ja:"giphy.com",
en:"giphy.com"
}
},
filter:[
"*://giphy.com/gifs/*",
"*://giphy.com/embed/*"
],
enable_reflect_to_anchor:false,
enable_cache:true,
script:""
});
// Gyazo
filter.splice(7,0,{
name:{
standard:"gyazo.com",
locales:{
ja:"Gyazo",
en:"gyazo.com"
}
},
filter:[
"*://gyazo.com/*"
],
enable_reflect_to_anchor:false,
enable_cache:true,
script:""
});
// フォト蔵
filter[8].script = PresetScript_ReplacementToLink_DirectLinkGeneric_PhotozouPhoto();
// ピクシブ
filter[11].script = "";
});
// イメージ検索用
updatePreset(proj.replacement_to_link,"direct_link_image_search",function(obj){
var filter = obj.filter;
// Bing 画像検索
filter[4].script = "";
});
// ------------------------------
// 短縮 URL 展開
// ------------------------------
// 詳細
var obj = getPreset(proj.expand_short_url,"detail");
obj.filter.push("http://gph.is/*");
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.10
// ------------------------------
if(proj.version < 10){
// バージョン値
proj.version = 10;
// ------------------------------
// 掲示板設定
// ------------------------------
// 4chan.org
var obj = addPreset(proj.expand_bbs,"4chan",null);
var preset = obj.preset;
preset.name = {
standard:"4chan.org (Image Boards)",
locales:{
ja:"4chan (Image Boards)",
en:"4chan.org (Image Boards)"
}
};
preset.filter = [
{
pattern:"^(http|https)://boards\\.4chan\\.org/.*/",
flags:{i:true,g:false}
}
];
preset.popup.style_sheet = "padding:20px 10px; border:1px solid #000; overflow-y:auto; word-wrap:break-word; word-break:break-all; display:block;";
// ニコニコ大百科
var obj = addPreset(proj.expand_bbs,"nicovideo_dictionary",null);
var preset = obj.preset;
preset.filter = [
{
pattern:"^http://dic\\.nicovideo\\.jp/b/(a|c|i|l|u|v)/.+",
flags:{i:true,g:false}
},{
pattern:"^http://dic\\.nicovideo\\.jp/(a|c|i|l|u|v)/.+",
flags:{i:true,g:false}
}
];
// ------------------------------
// ハイパーリンク化定義
// ------------------------------
// 簡易
updatePreset(proj.make_link_to_text,"simple",function(obj){
obj.script = "";
});
// 詳細
updatePreset(proj.make_link_to_text,"detail",function(obj){
obj.script = "";
});
// ------------------------------
// アンカー置換定義
// ------------------------------
// 2ch.net 用
updatePreset(proj.replacement_to_anchor,"direct_link_bbs",function(obj){
obj.script = "";
});
// リンク先をツールチップで表示
var obj = addPreset(proj.replacement_to_anchor,"display_url_in_tooltip","attach_sns_counter");
obj.preset = {
name:{
standard:"Display URL in the ToolTip",
locales:{
ja:"ツールチップにリンク先を表示",
en:"Display URL in the ToolTip"
}
},
script:PresetScript_ReplacementToAnchor_DisplayUrlInTooltip()
};
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// 直リンク(汎用)
updatePreset(proj.replacement_to_link,"direct_link_generic",function(obj){
var filter = obj.filter;
// Google+ Photo
filter.splice(5,0,{
name:{
standard:"Google+ Photo",
locales:{
ja:"Google+ Photo",
en:"Google+ Photo"
}
},
filter:[
"*://plus.google.com/*photos/*/albums/*"
],
enable_reflect_to_anchor:false,
enable_cache:true,
script:""
});
// Picasa Photo
filter.splice(6,0,{
name:{
standard:"Picasa Photo",
locales:{
ja:"Picasa Photo",
en:"Picasa Photo"
}
},
filter:[
"*://picasaweb.google.com/lh/photo/*",
"*://picasaweb.google.com/*/*?*#*",
"*://picasaweb.google.com/*/*#*"
],
enable_reflect_to_anchor:false,
enable_cache:true,
script:PresetScript_ReplacementToLink_DirectLinkGeneric_PicasaPhoto()
});
// ついっぷる (直リンク)
filter.splice(12,0,{
name:{
standard:"Twipple Photo (Direct Link)",
locales:{
ja:"ついっぷる (直リンク)",
en:"Twipple Photo (Direct Link)"
}
},
filter:[
"*://p.twpl.jp/show/*"
],
enable_reflect_to_anchor:false,
enable_cache:true,
script:""
});
// Gyazo
filter[9].script = "";
// ニコニコ静画
filter[13].script = "";
// ピクシブ
filter[14].filter.push("*://touch.pixiv.net/member_illust.php?*illust_id*");
filter[14].script = "";
});
// イメージ検索用
updatePreset(proj.replacement_to_link,"direct_link_image_search",function(obj){
var filter = obj.filter;
// Bing 画像検索
filter[4].script = "";
// 百度
filter[9].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_Baidu();
});
// ------------------------------
// テキスト展開定義
// ------------------------------
// インライン表示
updatePreset(proj.expand_text,"inline",function(obj){
obj.inline.script_insert = "";
});
// ------------------------------
// イメージ展開定義
// ------------------------------
// サムネイル表示
updatePreset(proj.expand_image,"thumbnail",function(obj){
obj.thumbnail.script_allow = "";
});
// ポップアップ表示
updatePreset(proj.expand_image,"popup",function(obj){
obj.popup.script_allow = "";
});
// サムネイル許可
updatePreset(proj.expand_image,"*",function(obj){
obj.thumbnail.script_insert = "";
});
// 画像掲示板用
var obj = addPreset(proj.expand_image,"image_bbs",null);
obj.preset = {
name:{
standard:"For www.4chan.org",
locales:{
ja:"画像掲示板用",
en:"For www.4chan.org"
}
},
thumbnail:{
enable_popup_mouseover:true,
disable_same_image:false,
load_type:"preload",
script_allow:"",
script_insert:""
},
popup:{
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation_scale:true,
enable_animation_alpha:true,
load_type:"preload",
script_allow:PresetScript_ExpandImage_PopupScriptAllow_ImageBbs()
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
},
load:{
enable_notify:true,
enable_unload:false,
unload_allow_size_more_then:256
}
};
// ------------------------------
// サウンド展開定義
// ------------------------------
// インライン表示
updatePreset(proj.expand_sound,"inline",function(obj){
obj.inline.script_insert = "";
});
// ------------------------------
// ビデオ展開定義
// ------------------------------
// インライン表示
updatePreset(proj.expand_video,"inline",function(obj){
obj.inline.script_insert = "";
});
// ------------------------------
// インラインフレーム展開定義
// ------------------------------
// Flash のインライン表示
updatePreset(proj.expand_iframe,"expand_flash_inline",function(obj){
obj.inline.script_insert = "";
});
// PDF のインライン表示
updatePreset(proj.expand_iframe,"expand_pdf_inline",function(obj){
obj.inline.script_insert = "";
});
// ------------------------------
// URLマッピング設定
// ------------------------------
// 画像検索サイト
updatePreset(proj.urlmap,"image_bbs",function(obj){
obj.expand_image.id = "image_bbs";
});
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.11
// ------------------------------
if(proj.version < 11){
// バージョン値
proj.version = 11;
// ------------------------------
// エレメント置換定義
// ------------------------------
createArrayContainer("replacement_to_element");
// 追加
update(proj.replacement_to_element,"*",function(obj){
if(!(obj.name)) obj.name = new Object();
if(!(obj.name.standard)) obj.name.standard = "";
if(!(obj.name.locales)) obj.name.locales = new Object();
if(!(obj.script)) obj.script = "[]";
});
// ------------------------------
// エレメント置換定義
// ------------------------------
// 展開アシスト(画像検索用)
var obj = addPreset(proj.replacement_to_element,"assist_image_search",null);
obj.preset = {
name:{
standard:"Assist Expand (image search)",
locales:{
ja:"展開アシスト(画像検索用)",
en:"Assist Expand (image search)"
}
},
script:PresetScript_ReplacementToElement_AssistImageSearch()
};
// 展開アシスト(ツイッター用)
var obj = addPreset(proj.replacement_to_element,"assist_twitter",null);
obj.preset = {
name:{
standard:"Assist Expand (twitter)",
locales:{
ja:"展開アシスト(ツイッター用)",
en:"Assist Expand (twitter)"
}
},
script:PresetScript_ReplacementToElement_AssistTwitter()
};
// 展開アシスト(ピクシブ用)
var obj = addPreset(proj.replacement_to_element,"assist_pixiv",null);
obj.preset = {
name:{
standard:"Assist Expand (pixiv)",
locales:{
ja:"展開アシスト(ピクシブ用)",
en:"Assist Expand (pixiv)"
}
},
script:""
};
// ------------------------------
// アンカー置換定義
// ------------------------------
// 直リンクに変更(フェイスブック用)
var obj = addPreset(proj.replacement_to_anchor,"direct_link_facebook","direct_link_realtime_search");
obj.preset = {
name:{
standard:"Direct Link (facebook.com)",
locales:{
ja:"直リンクに変更(フェイスブック用)",
en:"Direct Link (facebook.com)"
}
},
script:PresetScript_ReplacementToAnchor_DirectLinkFacebook()
};
// イベントを無効化(フェイスブック用)
var obj = addPreset(proj.replacement_to_anchor,"disable_event_facebook","direct_link_twitter");
obj.preset = {
name:{
standard:"Disable Event (facebook)",
locales:{
ja:"イベントを無効化(フェイスブック用)",
en:"Disable Event (facebook)"
}
},
script:PresetScript_ReplacementToAnchor_DisableEventFacebook()
};
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// 直リンク(汎用)
updatePreset(proj.replacement_to_link,"direct_link_generic",function(obj){
var filter = obj.filter;
// OGP "og:image"
filter[0].filter.push("*://seiga.nicovideo.jp/watch/bk*");
filter[0].script = "";
// OGP "twitter:*"
filter[1].script = PresetScript_ReplacementToLink_DirectLinkGeneric_OgpTwitter();
// Facebook Photo
filter[4].script = "";
// Tumblr
filter[7].script = PresetScript_ReplacementToLink_DirectLinkGeneric_Tumblr();
// ついっぷる
filter[11].script = "";
// blog.fc2.com
filter.splice(13,0,{
name:{
standard:"blog.fc2.com",
locales:{
ja:"FC2ブログ Photo",
en:"blog.fc2.com"
}
},
filter:[
"http://*.blog.fc2.com/img/*/"
],
enable_reflect_to_anchor:false,
enable_cache:true,
script:""
});
// Miiverse
filter.splice(16,0,{
name:{
standard:"Miiverse",
locales:{
ja:"Miiverse",
en:"Miiverse"
}
},
filter:[
"*://miiverse.nintendo.net/posts/*"
],
enable_reflect_to_anchor:false,
enable_cache:true,
script:""
});
// ピクシブ
filter[15].script = "";
});
// イメージ検索用
updatePreset(proj.replacement_to_link,"direct_link_image_search",function(obj){
var filter = obj.filter;
// Google 画像検索
filter[0].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_Google();
// Yahoo Image Search
filter[1].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_YahooImageSearch();
// Yahoo! JAPAN 画像検索
filter[2].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_YahooJapan();
// yahoo.cn
filter[3].script = "";
// Bing 画像検索
filter[4].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_Bing();
// Ask 画像検索
filter[5].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_Ask();
// AOL 画像検索
filter[6].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_Aol();
// Yandex 画像検索
filter[7].script = "";
// goo 画像検索
filter[8].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_Goo();
// Baidu.jp
filter[10].script = "";
// NAVER 画像検索
filter[11].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_Naver();
// naver.jp
filter[12].filter = [
"http://*search.naver.jp/jthumb?*",
"http://*search.naver.jp/jdanmi?*"
];
filter[12].enable_cache = true;
filter[12].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_NaverJp();
});
// ウィキペディア用
updatePreset(proj.replacement_to_link,"direct_link_wikipedia",function(obj){
var filter = obj.filter;
filter[0].script = PresetScript_ReplacementToLink_DirectLinkWikipedia();
filter = filter[0].filter;
filter.push("*://*.m.wikipedia.org/wiki/*:*");
filter.push("*://*.m.wikipedia.org/w/*:*");
filter.push("*://*.m.wikimedia.org/wiki/*:*");
filter.push("*://*.m.wikimedia.org/w/*:*");
});
// ------------------------------
// 短縮 URL 展開
// ------------------------------
// 簡易
var obj = getPreset(proj.expand_short_url,"simple");
obj.filter.splice(12,3);
obj.filter.push("http://dlvr.it/*");
obj.filter.push("http://is.gd/*");
obj.filter.push("http://ht.ly/*");
obj.filter.push("http://lnk.ms/*");
obj.filter.push("http://po.st/*");
obj.filter.push("http://htn.to/*");
obj.filter.push("http://r.sm3.jp/*");
obj.filter.push("http://cot.ag/*");
obj.filter.push("http://to.ly/*");
obj.filter.push("http://ux.nu/*");
obj.filter.push("http://qurl.com/*");
obj.filter.push("http://tr.im/*");
obj.filter.push("http://spr.ly/*");
obj.filter.push("http://buff.ly/*");
// 詳細
var obj = getPreset(proj.expand_short_url,"detail");
obj.filter.splice(59,1);
obj.filter.splice(54,4);
obj.filter.splice(52,1);
obj.filter.splice(47,1);
obj.filter.splice(42,1);
obj.filter.splice(38,1);
obj.filter.splice(33,1);
obj.filter.splice(28,2);
obj.filter.splice(23,1);
obj.filter.splice(12,1);
obj.filter.push("http://spr.ly/*");
obj.filter.push("http://buff.ly/*");
obj.filter.push("http://amba.to/*");
obj.filter.push("http://nico.ms/*");
obj.filter.push("http://yhoo.it/*");
obj.filter.push("http://shar.es/*");
obj.filter.push("http://feedly.com/k/*");
obj.filter.push("http://wp.me/*");
obj.filter.push("http://migre.me/*");
obj.filter.push("http://flip.it/*");
// ------------------------------
// イメージ展開定義
// ------------------------------
// 「サムネイル表示」を破棄
removePreset("expand_image","thumbnail");
// 「ポップアップ表示」を破棄
removePreset("expand_image","popup");
// 追加
update(proj.expand_image,"*",function(obj){
if(!(obj.popup.scale_percent)) obj.popup.scale_percent = 100;
});
// ポップアップ表示(すべてのリンク)
var obj = addPreset(proj.expand_image,"popup_all","image_bbs");
obj.preset = {
name:{
standard:"Popup (all)",
locales:{
ja:"ポップアップ表示(すべてのリンク)",
en:"Popup (all)"
}
},
thumbnail:{
enable_popup_mouseover:true,
disable_same_image:false,
load_type:"preload",
script_allow:PresetScript_ExpandImage_ThumbnailScriptAllow_PopupAll(),
script_insert:"[]"
},
popup:{
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation_scale:true,
enable_animation_alpha:true,
load_type:"preload",
scale_percent:100,
script_allow:PresetScript_ExpandImage_PopupScriptAllow_PopupAll()
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
},
load:{
enable_notify:true,
enable_unload:false,
unload_allow_size_more_then:256
}
};
// ポップアップ表示(画像を含むリンク)
var obj = addPreset(proj.expand_image,"popup_include_image","image_bbs");
obj.preset = {
name:{
standard:"Popup (include image)",
locales:{
ja:"ポップアップ表示(画像を含むリンク)",
en:"Popup (include image)"
}
},
thumbnail:{
enable_popup_mouseover:true,
disable_same_image:false,
load_type:"preload",
script_allow:PresetScript_ExpandImage_ThumbnailScriptAllow_PopupIncludeImage(),
script_insert:"[]"
},
popup:{
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation_scale:true,
enable_animation_alpha:true,
load_type:"preload",
scale_percent:100,
script_allow:PresetScript_ExpandImage_PopupScriptAllow_PopupIncludeImage()
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
},
load:{
enable_notify:true,
enable_unload:false,
unload_allow_size_more_then:256
}
};
// サムネイル表示(すべて)
var obj = addPreset(proj.expand_image,"thumbnail_all","image_bbs");
obj.preset = {
name:{
standard:"Thumbnail (all)",
locales:{
ja:"サムネイル表示(すべてのリンク)",
en:"Thumbnail (all)"
}
},
thumbnail:{
enable_popup_mouseover:true,
disable_same_image:false,
load_type:"preload",
script_allow:PresetScript_ExpandImage_ThumbnailScriptAllow_ThumbnailAll(),
script_insert:"[]"
},
popup:{
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation_scale:true,
enable_animation_alpha:true,
load_type:"preload",
scale_percent:100,
script_allow:PresetScript_ExpandImage_PopupScriptAllow_ThumbnailAll()
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
},
load:{
enable_notify:true,
enable_unload:false,
unload_allow_size_more_then:256
}
};
// サムネイル表示(画像を含まないリンク)
var obj = addPreset(proj.expand_image,"thumbnail_not_include_image","image_bbs");
obj.preset = {
name:{
standard:"Thumbnail (not include image)",
locales:{
ja:"サムネイル表示(画像を含まないリンク)",
en:"Thumbnail (not include image)"
}
},
thumbnail:{
enable_popup_mouseover:true,
disable_same_image:false,
load_type:"preload",
script_allow:PresetScript_ExpandImage_ThumbnailScriptAllow_ThumbnailNotIncludeImage(),
script_insert:"[]"
},
popup:{
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation_scale:true,
enable_animation_alpha:true,
load_type:"preload",
scale_percent:100,
script_allow:PresetScript_ExpandImage_PopupScriptAllow_ThumbnailNotIncludeImage()
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
},
load:{
enable_notify:true,
enable_unload:false,
unload_allow_size_more_then:256
}
};
// ツイッター用
var obj = addPreset(proj.expand_image,"twitter",null);
obj.preset = {
name:{
standard:"For twitter",
locales:{
ja:"ツイッター用",
en:"For twitter"
}
},
thumbnail:{
enable_popup_mouseover:true,
disable_same_image:false,
load_type:"preload",
script_allow:PresetScript_ExpandImage_ThumbnailScriptAllow_Twitter(),
script_insert:"[]"
},
popup:{
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation_scale:true,
enable_animation_alpha:true,
load_type:"preload",
scale_percent:100,
script_allow:PresetScript_ExpandImage_PopupScriptAllow_Twitter()
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
},
load:{
enable_notify:true,
enable_unload:false,
unload_allow_size_more_then:256
}
};
// サムネイル挿入
updatePreset(proj.expand_image,"*",function(obj){
obj.thumbnail.script_insert = PresetScript_ExpandImage_ThumbnailScriptInsert();
});
// ------------------------------
// URLマッピング設定
// ------------------------------
// 追加
update(proj.urlmap,"*",function(obj){
if(obj.enable_mixed_content === undefined) obj.enable_mixed_content = false;
});
// デフォルト
var preset = getPreset(proj.urlmap,"default");
preset.make_link_to_text = {enable:false,id:""};
preset.expand_image = {enable:true,id:"popup_all"};
// 検索サイト
var preset = getPreset(proj.urlmap,"search");
preset.expand_image = {enable:true,id:"popup_include_image"};
// 画像検索サイト
var preset = getPreset(proj.urlmap,"image_search");
preset.replacement_to_element = {enable:true,id:["assist_image_search"]};
preset.expand_image = {enable:true,id:"popup_include_image"};
// リアルタイム検索用
var preset = getPreset(proj.urlmap,"realtime_search");
preset.expand_image = {enable:true,id:"thumbnail_not_include_image"};
// スレッド掲示板
var preset = getPreset(proj.urlmap,"bbs");
preset.expand_image = {enable:true,id:"thumbnail_not_include_image"};
// twitter
var preset = getPreset(proj.urlmap,"twitter");
preset.replacement_to_element = {enable:true,id:["assist_twitter"]};
preset.expand_image = {enable:true,id:"twitter"};
// ウィキペディア
var preset = getPreset(proj.urlmap,"wikipedia");
preset.expand_image = {enable:true,id:"popup_include_image"};
preset.filter.push("*://*.m.wikipedia.org/*");
// ピクシブ
var obj = addPreset(proj.urlmap,"pixiv","default");
obj.preset = {
name:{
standard:"pixiv",
locales:{
ja:"ピクシブ",
en:"pixiv"
}
},
enable:true,
filter:[
"http://*.pixiv.net/",
"http://*.pixiv.net/*"
],
enable_unsecure:false,
enable_mixed_content:false,
access_block:{enable:false,id:""},
replacement_to_element:{enable:true,id:["assist_pixiv"]},
replacement_to_text:{enable:false,id:[]},
replacement_to_anchor:{enable:false,id:[]},
replacement_to_link:{enable:true,id:"direct_link_generic"},
replacement_to_referer:{enable:false,id:""},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"simple"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup_include_image"},
expand_sound:{enable:false,id:""},
expand_video:{enable:false,id:""},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// フェイスブック
var obj = addPreset(proj.urlmap,"facebook","twitter");
obj.preset = {
name:{
standard:"Facebook",
locales:{
ja:"フェイスブック",
en:"Facebook"
}
},
enable:true,
filter:[
"*://www.facebook.com/*"
],
enable_unsecure:false,
enable_mixed_content:false,
access_block:{enable:false,id:""},
replacement_to_element:{enable:false,id:[]},
replacement_to_text:{enable:false,id:[]},
replacement_to_anchor:{enable:true,id:["disable_event_facebook","direct_link_facebook","no_referrer"]},
replacement_to_link:{enable:true,id:"direct_link_generic"},
replacement_to_referer:{enable:false,id:""},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"simple"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup_include_image"},
expand_sound:{enable:false,id:""},
expand_video:{enable:false,id:""},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.12
// ------------------------------
if(proj.version < 12){
// バージョン値
proj.version = 12;
// ------------------------------
// URLマッピング設定
// ------------------------------
// 追加
update(proj.urlmap,"*",function(obj){
// マルチ化
if(obj.access_block.enable){
obj.access_block.id = [obj.access_block.id];
}else{
obj.access_block.id = [];
}
if(obj.replacement_to_link.enable){
obj.replacement_to_link.id = [obj.replacement_to_link.id];
}else{
obj.replacement_to_link.id = [];
}
if(obj.replacement_to_referer.enable){
obj.replacement_to_referer.id = [obj.replacement_to_referer.id];
}else{
obj.replacement_to_referer.id = [];
}
if(obj.replacement_to_useragent.enable){
obj.replacement_to_useragent.id = [obj.replacement_to_useragent.id];
}else{
obj.replacement_to_useragent.id = [];
}
});
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.13
// ------------------------------
if(proj.version < 13){
// バージョン値
proj.version = 13;
// ------------------------------
// 掲示板設定
// ------------------------------
// ログ速
var obj = addPreset(proj.expand_bbs,"logsoku",null);
var preset = obj.preset;
preset.filter = [
{
pattern:"^http://logsoku\\.com/thread/.*\\.2ch\\.net/[^/]+/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"^http://[^.]+\\.logsoku\\.com/r/[^/]+/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"^http://logsoku\\.com/r/[^/]+/[0-9]+",
flags:{i:true,g:false}
}
];
preset.script_initialize = "";
preset.script_callback = "";
// みみずん検索
var obj = addPreset(proj.expand_bbs,"mimizun",null);
var preset = obj.preset;
preset.filter = [
{
pattern:"^http://mimizun\\.com/log/2ch/[^/]+/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"^http://mimizun\\.com/log/machi/[^/]+/[0-9]+",
flags:{i:true,g:false}
}
];
preset.script_initialize = "";
preset.script_callback = "";
// unkar.org
var obj = addPreset(proj.expand_bbs,"unkar",null);
var preset = obj.preset;
preset.filter = [
{
pattern:"^http://unkar\\.org/r/[^/]+/[0-9]+",
flags:{i:true,g:false}
}
];
preset.script_initialize = "";
preset.script_callback = "";
// あっとちゃんねるず
var obj = addPreset(proj.expand_bbs,"atchs",null);
var preset = obj.preset;
preset.filter = [
{
pattern:"^http://[^.]+\\.atchs\\.jp/test/read\\.cgi/[^/]+/[0-9]+",
flags:{i:true,g:false}
}
];
preset.script_initialize = "";
preset.script_callback = "";
// 4chan.org
var obj = addPreset(proj.expand_bbs,"4chan",null);
var preset = obj.preset;
preset.script_callback = PresetScript_ExpandBbs_ScriptCallback_4chan();
// ------------------------------
// URLマッピング設定
// ------------------------------
// chaika
var obj = addPreset(proj.urlmap,"chaika","image_bbs");
obj.preset = {
name:{
standard:"chaika",
locales:{
ja:"chaika",
en:"chaika"
}
},
enable:true,
filter:[
"http://127.0.0.1:*/thread/http://2ch.net/*",
"http://127.0.0.1:*/thread/http://*.2ch.net/*",
"http://127.0.0.1:*/thread/http://*.bbspink.com/*",
"http://127.0.0.1:*/thread/http://jbbs.livedoor.jp/*"
],
enable_unsecure:false,
enable_mixed_content:false,
access_block:{enable:false,id:[]},
replacement_to_element:{enable:false,id:[]},
replacement_to_text:{enable:false,id:[]},
replacement_to_anchor:{enable:true,id:["direct_link_bbs","no_referrer"]},
replacement_to_link:{enable:true,id:["direct_link_generic"]},
replacement_to_referer:{enable:true,id:["replacement_link_url"]},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"detail"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"thumbnail_not_include_image"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.14
// ------------------------------
if(proj.version < 14){
// バージョン値
proj.version = 14;
var wildcard_name = {
standard:"Wild Card",
locales:{
ja:"ワイルドカード",
en:"Wild Card"
}
};
// ------------------------------
// アクセスブロック定義
// ------------------------------
removePreset("access_block","firefox_extension");
removePreset("access_block","opera_extension");
// ワイルドカード
var obj = addPreset(proj.access_block,"wildcard",null);
obj.preset = {
name:wildcard_name,
filter:[]
};
// ------------------------------
// リファラ置換定義
// ------------------------------
removePreset("replacement_to_referer","firefox_extension");
// ワイルドカード
var obj = addPreset(proj.replacement_to_referer,"wildcard",null);
obj.preset = {
name:wildcard_name,
filter:[]
};
// ------------------------------
// ユーザーエージェント置換定義
// ------------------------------
removePreset("replacement_to_useragent","firefox_extension");
// ワイルドカード
var obj = addPreset(proj.replacement_to_useragent,"wildcard",null);
obj.preset = {
name:wildcard_name,
filter:[]
};
// ------------------------------
// エレメント置換定義
// ------------------------------
// 展開アシスト(アンカー内画像用)
var obj = addPreset(proj.replacement_to_element,"assist_image_in_anchor","assist_image_search");
obj.preset = {
name:{
standard:"Assist Expand (image in anchor)",
locales:{
ja:"展開アシスト(アンカー内画像用)",
en:"Assist Expand (image in anchor)"
}
},
script:PresetScript_ReplacementToElement_AssistImageInAnchor()
};
// ------------------------------
// アンカー置換定義
// ------------------------------
// 2ch.net 用
updatePreset(proj.replacement_to_anchor,"direct_link_bbs",function(obj){
obj.script = "";
});
// ------------------------------
// イメージ展開定義
// ------------------------------
// 追加
update(proj.expand_image,"*",function(obj){
if((obj.thumbnail.enable_thumbnail) === undefined) obj.thumbnail.enable_thumbnail = true;
if((obj.popup.enable_popup_mouseover) === undefined) obj.popup.enable_popup_mouseover = true;
if((obj.load.src_type) === undefined) obj.load.src_type = "mixed_content";
});
// ポップアップ表示(すべてのリンク)
var preset_popup_all = getPreset(proj.expand_image,"popup_all");
// ポップアップ表示(画像を含むリンク)
var preset_popup_include_image = getPreset(proj.expand_image,"popup_include_image");
// サムネイル表示(すべて)
var preset_thumbnail_all = getPreset(proj.expand_image,"thumbnail_all");
// サムネイル表示(画像を含まないリンク)
var preset_thumbnail_not_include_image = getPreset(proj.expand_image,"thumbnail_not_include_image");
preset_popup_all.thumbnail.enable_thumbnail = false;
preset_popup_include_image.thumbnail.enable_thumbnail = false;
preset_thumbnail_all.popup.enable_popup_mouseover = false;
preset_thumbnail_not_include_image.popup.enable_popup_mouseover = false;
preset_popup_all.thumbnail.script_allow = preset_thumbnail_all.thumbnail.script_allow;
preset_thumbnail_all.popup.script_allow = preset_popup_all.popup.script_allow;
preset_popup_include_image.thumbnail.script_allow = preset_thumbnail_not_include_image.thumbnail.script_allow;
preset_thumbnail_not_include_image.popup.script_allow = preset_popup_include_image.popup.script_allow;
// ポップアップ表示(アシスト要素のみ)
var obj = addPreset(proj.expand_image,"popup_image_in_anchor","thumbnail_all");
obj.preset = {
name:{
standard:"Popup (assist only)",
locales:{
ja:"ポップアップ表示(アシスト要素のみ)",
en:"Popup (assist only)"
}
},
thumbnail:{
enable_thumbnail:false,
enable_popup_mouseover:true,
disable_same_image:false,
load_type:"preload",
script_allow:PresetScript_ExpandImage_ThumbnailScriptAllow_PopupImageInAnchor(),
script_insert:preset_thumbnail_not_include_image.thumbnail.script_insert
},
popup:{
enable_popup_mouseover:true,
origin_type:"center",
position_type:"absolute",
time_wait_open:0,
time_wait_close:0,
enable_animation_scale:true,
enable_animation_alpha:true,
load_type:"preload",
scale_percent:100,
script_allow:PresetScript_ExpandImage_PopupScriptAllow_PopupImageInAnchor()
},
reduced_image:{
enable_popup:true,
popup_allow_slcale_less_then:70
},
load:{
enable_notify:true,
enable_unload:false,
src_type:"mixed_content",
unload_allow_size_more_then:256
}
};
// ------------------------------
// 掲示板設定
// ------------------------------
// ふたば☆ちゃんねる
var obj = addPreset(proj.expand_bbs,"2chan",null);
var preset = obj.preset;
preset.filter = [
{
pattern:"^http://[^.]+\\.2chan\\.net/[^/]+/res/[0-9]+.htm",
flags:{i:true,g:false}
}
];
preset.script_initialize = "";
preset.script_callback = "";
// chaika
var obj = addPreset(proj.expand_bbs,"chaika","atchs");
obj.preset = {
name:{
standard:"chaika",
locales:{
ja:"chaika",
en:"chaika"
}
},
enable:true,
filter:[
{
pattern:"^http://127\\.0\\.0\\.1:[0-9]+/thread/http://[^.]+\\.2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"^http://127\\.0\\.0\\.1:[0-9]+/thread/http://[^.]+\\.bbspink\\.com/test/read\\.cgi/[^/]+/[0-9]+",
flags:{i:true,g:false}
},{
pattern:"^http://127\\.0\\.0\\.1:[0-9]+/thread/http://jbbs\\.shitaraba\\.net/bbs/read.cgi/[^/]+/[0-9]+/[0-9]+",
flags:{i:true,g:false}
}
],
script_initialize:"",
script_callback:"",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
// ------------------------------
// URLマッピング設定
// ------------------------------
// スレッド掲示板
updatePreset(proj.urlmap,"bbs",function(obj){
obj.filter[6] = "*://jbbs.shitaraba.net/*";
});
// chaika
updatePreset(proj.urlmap,"chaika",function(obj){
obj.filter[3] = "http://127.0.0.1:*/thread/http://jbbs.shitaraba.net/*";
});
// ピクシブ
updatePreset(proj.urlmap,"pixiv",function(obj){
obj.replacement_to_element.id.unshift("assist_image_in_anchor");
obj.expand_image.id = "popup_image_in_anchor";
});
// ------------------------------
// 基本設定
// ------------------------------
proj.standard.enable_startup = proj.standard.enable_enable_startup;
delete proj.standard.enable_enable_startup;
proj.standard.enable_input_touch = true;
proj.standard.enable_double_touch_assist = false;
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.15
// ------------------------------
if(proj.version < 15){
// バージョン値
proj.version = 15;
// ------------------------------
// URLフィルタ形式を更新
// ------------------------------
var updateForAsteriskFilter = function(filter){
return {
type:"asterisk",
asterisk:{
filter:filter
},
regexp:{
filter:[]
}
};
};
var updateForRegExpFilter = function(filter){
return {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:filter
}
};
};
// ------------------------------
// 掲示板設定
// ------------------------------
update(proj.expand_bbs,"*",function(obj){
obj.filter = updateForRegExpFilter(obj.filter);
});
// 2ちゃんねる掲示板
var obj = addPreset(proj.expand_bbs,"2ch",null);
var preset = obj.preset;
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^http://[^.]+\\.2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://(|[^.]+\\.)machi\\.to/bbs/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://(|[^.]+\\.)machibbs\\.net/[^/]+/[^/]*[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://[^.]+\\.bbspink\\.com/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://jbbs\\.shitaraba\\.net/bbs/read.cgi/[^/]+/[0-9]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://[^.]+\\.kakiko\\.com/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://[^.]+\\.60\\.kg/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
}
]
}
};
preset.script_initialize = "";
preset.script_callback = "";
// ログ速
var obj = addPreset(proj.expand_bbs,"logsoku",null);
var preset = obj.preset;
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^http://logsoku\\.com/thread/.*\\.2ch\\.net/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://[^.]+\\.logsoku\\.com/r/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://logsoku\\.com/r/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
}
]
}
};
// みみずん検索
var obj = addPreset(proj.expand_bbs,"mimizun",null);
var preset = obj.preset;
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^http://mimizun\\.com/log/2ch/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://mimizun\\.com/log/machi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
}
]
}
};
// unkar.org
var obj = addPreset(proj.expand_bbs,"unkar",null);
var preset = obj.preset;
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^http://unkar\\.org/r/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
}
]
}
};
// あっとちゃんねるず
var obj = addPreset(proj.expand_bbs,"atchs",null);
var preset = obj.preset;
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^http://[^.]+\\.atchs\\.jp/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
}
]
}
};
// chaika
var obj = addPreset(proj.expand_bbs,"chaika",null);
var preset = obj.preset;
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^http://127\\.0\\.0\\.1:[0-9]+/thread/http://[^.]+\\.2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://127\\.0\\.0\\.1:[0-9]+/thread/http://[^.]+\\.bbspink\\.com/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://127\\.0\\.0\\.1:[0-9]+/thread/http://jbbs\\.shitaraba\\.net/bbs/read.cgi/[^/]+/[0-9]+/[0-9]+.*$",
flags:{i:true,g:false}
}
]
}
};
// 4chan.org
var obj = addPreset(proj.expand_bbs,"4chan",null);
var preset = obj.preset;
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^(http|https)://boards\\.4chan\\.org/[^/]+/.*$",
flags:{i:true,g:false}
}
]
}
};
// ニコニコ大百科
var obj = addPreset(proj.expand_bbs,"nicovideo_dictionary",null);
var preset = obj.preset;
preset.script_initialize = "";
preset.script_callback = "";
// ------------------------------
// アクセスブロック定義
// ------------------------------
update(proj.access_block,"*",function(obj){
obj.filter = updateForAsteriskFilter(obj.filter);
});
// ------------------------------
// リファラ置換定義
// ------------------------------
update(proj.replacement_to_referer,"*",function(obj){
var filter = obj.filter;
var i;
var num = filter.length;
for(i=0;i<num;i++){
filter[i].filter = updateForAsteriskFilter(filter[i].filter);
}
});
// ------------------------------
// ユーザーエージェント置換定義
// ------------------------------
update(proj.replacement_to_useragent,"*",function(obj){
var filter = obj.filter;
var i;
var num = filter.length;
for(i=0;i<num;i++){
filter[i].filter = updateForAsteriskFilter(filter[i].filter);
}
});
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
update(proj.replacement_to_link,"*",function(obj){
var filter = obj.filter;
var i;
var num = filter.length;
for(i=0;i<num;i++){
filter[i].filter = updateForAsteriskFilter(filter[i].filter);
}
});
// ウィキペディア用
var preset = getPreset(proj.replacement_to_link,"direct_link_wikipedia");
preset.filter[0].filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[{
pattern:"^[^:]+://[^.]+\\.(|m\\.)(wikipedia|wikimedia|wiktionary|wikinews|wikiquote|wikibooks|wikisource|wikiversity|wikivoyage|mediawiki)\\.org/(wiki|w).*:.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://en\\.uncyclopedia\\.co/(wiki|w).*:.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://ansaikuropedia\\.org/(wiki|w).*:.*",
flags:{i:true,g:false}
}]
}
};
// ------------------------------
// 短縮 URL 展開
// ------------------------------
update(proj.expand_short_url,"*",function(obj){
obj.filter = updateForAsteriskFilter(obj.filter);
});
// ------------------------------
// URLマッピング設定
// ------------------------------
update(proj.urlmap,"*",function(obj){
obj.filter = updateForAsteriskFilter(obj.filter);
});
// 画像検索サイト
var preset = getPreset(proj.urlmap,"image_search");
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[{
pattern:"^[^:]+://[^.]+\\.google\\.(at|be|ca|ch|de|es|fr|it|nl|no|pl|ru|se|co\\.(id|in|jp|th|uk|za)|com|com\\.(ar|au|br|mx|sa|tr|tw))/(search[?].*tbm=isch|images[?]).*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://images\\.search\\.yahoo\\.com/search/images.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://[^.]+\\.images\\.search\\.yahoo\\.com/search/images.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://[^.]+\\.image\\.search\\.yahoo\\.com/search/images.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://image\\.search\\.yahoo\\.co\\.jp/search[?].*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://image\\.yahoo\\.cn/s[?].*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://www\\.bing\\.com/images/search[?].*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://[^.]+\\.ask\\.com/pictures[?].*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://search\\.aol\\.(com|jp)/aol/image[?].*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://images\\.yandex\\.(ru|com)/.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://bsearch\\.goo\\.ne\\.jp/(image|scrimg|similarity)\\.php[?].*MT=.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://image\\.baidu\\.com/.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://image\\.search\\.naver\\.com/.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://[^.]*search\\.naver\\.jp/image[?].*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://image\\.search\\.biglobe\\.ne\\.jp/search[?].*",
flags:{i:true,g:false}
}]
}
};
// ウィキペディア
var preset = getPreset(proj.urlmap,"wikipedia");
preset.filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[{
pattern:"^[^:]+://[^.]+\\.(|m\\.)(wikipedia|wikimedia|wiktionary|wikinews|wikiquote|wikibooks|wikisource|wikiversity|wikivoyage|mediawiki)\\.org/.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://en\\.uncyclopedia\\.co/.*",
flags:{i:true,g:false}
},{
pattern:"^[^:]+://ansaikuropedia\\.org/.*",
flags:{i:true,g:false}
}]
}
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.16
// ------------------------------
if(proj.version < 16){
// バージョン値
proj.version = 16;
// ------------------------------
// アンカー置換定義
// ------------------------------
// リアルタイム検索用
updatePreset(proj.replacement_to_anchor,"direct_link_realtime_search",function(obj){
obj.script = PresetScript_ReplacementToAnchor_DirectLinkRealtimeSearch();
});
// ------------------------------
// ハイパーリンク化定義
// ------------------------------
// 簡易
updatePreset(proj.make_link_to_text,"simple",function(obj){
obj.script = PresetScript_MakeLinkToText_Simple();
});
// 詳細
updatePreset(proj.make_link_to_text,"detail",function(obj){
obj.script = PresetScript_MakeLinkToText_Detail();
});
// ------------------------------
// テキスト展開定義
// ------------------------------
// インライン表示
updatePreset(proj.expand_text,"inline",function(obj){
obj.inline.script_insert = PresetScript_ExpandText_InlineScriptInsert_Inline();
});
// ------------------------------
// サウンド展開定義
// ------------------------------
// インライン表示
updatePreset(proj.expand_sound,"inline",function(obj){
obj.inline.script_insert = PresetScript_ExpandSound_InlineScriptInsert_Inline();
});
// ------------------------------
// ビデオ展開定義
// ------------------------------
// インライン表示
updatePreset(proj.expand_video,"inline",function(obj){
obj.inline.script_insert = PresetScript_ExpandVideo_InlineScriptInsert_Inline();
});
// ------------------------------
// インラインフレーム展開定義
// ------------------------------
// Flash のインライン表示
updatePreset(proj.expand_iframe,"expand_flash_inline",function(obj){
obj.inline.script_insert = PresetScript_ExpandIframe_InlineScriptInsert_ExpandFlashInline();
});
// PDF のインライン表示
updatePreset(proj.expand_iframe,"expand_pdf_inline",function(obj){
obj.inline.script_insert = PresetScript_ExpandIframe_InlineScriptInsert_ExpandPdfInline();
});
// ------------------------------
// 掲示板設定
// ------------------------------
// ログ速
var obj = addPreset(proj.expand_bbs,"logsoku",null);
var preset = obj.preset;
preset.script_initialize = PresetScript_ExpandBbs_ScriptInitialize_Logsoku();
preset.script_callback = PresetScript_ExpandBbs_ScriptCallback_Logsoku();
// みみずん検索
var obj = addPreset(proj.expand_bbs,"mimizun",null);
var preset = obj.preset;
preset.script_initialize = PresetScript_ExpandBbs_ScriptInitialize_Mimizun();
preset.script_callback = PresetScript_ExpandBbs_ScriptCallback_Mimizun();
// unkar.org
var obj = addPreset(proj.expand_bbs,"unkar",null);
var preset = obj.preset;
preset.script_initialize = "";
preset.script_callback = "";
// ニコニコ大百科
var obj = addPreset(proj.expand_bbs,"nicovideo_dictionary",null);
var preset = obj.preset;
preset.script_initialize = PresetScript_ExpandBbs_ScriptInitialize_NicovideoDictionary();
preset.script_callback = PresetScript_ExpandBbs_ScriptCallback_NicovideoDictionary();
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.17
// ------------------------------
if(proj.version < 17){
// バージョン値
proj.version = 17;
// ------------------------------
// ダウンロード設定
// ------------------------------
proj.download = new Object();
proj.download.load = new Object();
proj.download.download = new Object();
proj.download.load.thread_max = proj.standard.load_thread_max;
proj.download.load.timeout = 0;
proj.download.download.thread_max = 2;
proj.download.download.conflict_type = "rename";
// ------------------------------
// 基本設定
// ------------------------------
delete proj.standard.load_thread_max;
// ------------------------------
// アンカー置換定義
// ------------------------------
// 自動ダウンロード(すべて)
var obj = addPreset(proj.replacement_to_anchor,"auto_download_all","disable_popup_image_search");
obj.preset = {
name:{
standard:"Auto Download (all)",
locales:{
ja:"自動ダウンロード(すべて)",
en:"Auto Download (all)"
}
},
script:PresetScript_ReplacementToAnchor_AutoDownloadAll()
};
// 自動ダウンロード(画像のみ)
var obj = addPreset(proj.replacement_to_anchor,"auto_download_image","disable_popup_image_search");
obj.preset = {
name:{
standard:"Auto Download (image only)",
locales:{
ja:"自動ダウンロード(画像のみ)",
en:"Auto Download (image only)"
}
},
script:PresetScript_ReplacementToAnchor_AutoDownloadImage()
};
// ダウンロードリストに登録(すべて)
var obj = addPreset(proj.replacement_to_anchor,"add_download_list_all","disable_popup_image_search");
obj.preset = {
name:{
standard:"Add the DownloadList (all)",
locales:{
ja:"ダウンロードリストに登録(すべて)",
en:"Add the DownloadList (all)"
}
},
script:PresetScript_ReplacementToAnchor_AddDownloadListAll()
};
// ダウンロードリストに登録(画像のみ)
var obj = addPreset(proj.replacement_to_anchor,"add_download_list_image","disable_popup_image_search");
obj.preset = {
name:{
standard:"Add the DownloadList (image only)",
locales:{
ja:"ダウンロードリストに登録(画像のみ)",
en:"Add the DownloadList (image only)"
}
},
script:PresetScript_ReplacementToAnchor_AddDownloadListImage()
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.18
// ------------------------------
if(proj.version < 18){
// バージョン値
proj.version = 18;
// ------------------------------
// 掲示板設定
// ------------------------------
// 2ちゃんねる掲示板
var obj = addPreset(proj.expand_bbs,"2ch",null);
var preset = obj.preset;
preset.filter.regexp.filter.push({
pattern:"^http://[^.]+\\.2ch\\.sc/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
});
// おーぷん2ちゃんねる
var obj = addPreset(proj.expand_bbs,"open2ch","atchs");
obj.preset = {
name:{
standard:"open2ch.net",
locales:{
ja:"おーぷん2ちゃんねる",
en:"open2ch.net"
}
},
enable:true,
filter:{
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^http://[^.]+\\.open2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
},{
pattern:"^http://open2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+.*$",
flags:{i:true,g:false}
}
]
}
},
script_initialize: PresetScript_ExpandBbs_ScriptInitialize_Open2ch(),
script_callback: PresetScript_ExpandBbs_ScriptCallback_Open2ch(),
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; border:1px solid #000; background:#FFF; overflow-y:auto; word-wrap:break-word; word-break:break-all;"
}
};
// ------------------------------
// URLマッピング設定
// ------------------------------
// スレッド掲示板
updatePreset(proj.urlmap,"bbs",function(obj){
var filter = obj.filter.asterisk.filter;
filter.push("*://open2ch.net/*");
filter.push("*://*.open2ch.net/*");
filter.push("*://2ch.sc/*");
filter.push("*://*.2ch.sc/*");
});
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.19
// ------------------------------
if(proj.version < 19){
// バージョン値
proj.version = 19;
// ------------------------------
// エレメント置換定義
// ------------------------------
// 展開アシスト(deviantART 用)
var obj = addPreset(proj.replacement_to_element,"assist_deviant_art","assist_pixiv");
obj.preset = {
name:{
standard:"Assist Expand (deviantART)",
locales:{
ja:"展開アシスト(deviantART 用)",
en:"Assist Expand (deviantART)"
}
},
script:PresetScript_ReplacementToElement_AssistDeviantArt()
};
// 展開アシスト(ニコニコ静画用)
var obj = addPreset(proj.replacement_to_element,"assist_nico_seiga","assist_pixiv");
obj.preset = {
name:{
standard:"Assist Expand (NICONICO SEIGA)",
locales:{
ja:"展開アシスト(ニコニコ静画用)",
en:"Assist Expand (NICONICO SEIGA)"
}
},
script:PresetScript_ReplacementToElement_AssistNicoSeiga()
};
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// 直リンク(汎用)
updatePreset(proj.replacement_to_link,"direct_link_generic",function(obj){
var filter = obj.filter;
// OGP "og:image"
filter[0].filter.asterisk.filter.splice(2,5);
filter[0].script = PresetScript_ReplacementToLink_DirectLinkGeneric_OgpOgImage();
// Twitpic
filter[2].script = PresetScript_ReplacementToLink_DirectLinkGeneric_Twitpic();
// Twitter Photo
filter[3].script = PresetScript_ReplacementToLink_DirectLinkGeneric_TwitterPhoto();
// Facebook Photo
filter[4].filter.asterisk.filter.push("*://www.facebook.com/*/photos/*");
filter[4].script = PresetScript_ReplacementToLink_DirectLinkGeneric_FacebookPhoto();
// Google+ Photo
filter[5].filter.asterisk.filter.push("*://plus.google.com/*/posts/*");
filter[5].script = PresetScript_ReplacementToLink_DirectLinkGeneric_GooglePlusPhoto();
// Flickr
filter.splice(8,0,{
name:{
standard:"Flickr",
locales:{
ja:"Flickr",
en:"Flickr"
}
},
filter:{
type:"asterisk",
asterisk:{
filter:[
"*://www.flickr.com/photos/*/*",
"*://flic.kr/p/*"
]
},
regexp:{
filter:[]
}
},
enable_reflect_to_anchor:false,
enable_cache:true,
script:PresetScript_ReplacementToLink_DirectLinkGeneric_Flickr()
});
// yfrog.com
filter.splice(9,0,{
name:{
standard:"yfrog.com",
locales:{
ja:"yfrog.com",
en:"yfrog.com"
}
},
filter:{
type:"asterisk",
asterisk:{
filter:[
"*://twitter.yfrog.com/*",
"*://yfrog.com/*"
]
},
regexp:{
filter:[]
}
},
enable_reflect_to_anchor:false,
enable_cache:true,
script:PresetScript_ReplacementToLink_DirectLinkGeneric_Yfrog()
});
// Giphy
filter[10].script = PresetScript_ReplacementToLink_DirectLinkGeneric_Giphy();
// Gyazo
filter[11].script = PresetScript_ReplacementToLink_DirectLinkGeneric_Gyazo();
// ついっぷる
filter[13].script = PresetScript_ReplacementToLink_DirectLinkGeneric_Twipple();
// ついっぷる (直リンク)
filter[14].script = PresetScript_ReplacementToLink_DirectLinkGeneric_TwippleDirectLink();
// blog.fc2.com
filter[15].script = PresetScript_ReplacementToLink_DirectLinkGeneric_BlogFc2Com();
// deviantART
filter.splice(16,0,{
name:{
standard:"deviantART",
locales:{
ja:"deviantART",
en:"deviantART"
}
},
filter:{
type:"asterisk",
asterisk:{
filter:[
"*://*.deviantart.com/art/*"
]
},
regexp:{
filter:[]
}
},
enable_reflect_to_anchor:false,
enable_cache:true,
script:PresetScript_ReplacementToLink_DirectLinkGeneric_DeviantArt()
});
// ニコニコ静画 イラスト
filter[17].name = {
standard:"NICONICO SEIGA Illust",
locales:{
ja:"ニコニコ静画 イラスト",
en:"NICONICO SEIGA Illust"
}
};
filter[17].script = PresetScript_ReplacementToLink_DirectLinkGeneric_NicoSeigaIllust();
// ニコニコ静画 イラスト (直リンク)
filter.splice(18,0,{
name:{
standard:"NICONICO SEIGA Illust (Direct Link)",
locales:{
ja:"ニコニコ静画 イラスト (直リンク)",
en:"NICONICO SEIGA Illust (Direct Link)"
}
},
filter:{
type:"asterisk",
asterisk:{
filter:[
"*://seiga.nicovideo.jp/image/source/*",
"*://seiga.nicovideo.jp/image/source?id=*"
]
},
regexp:{
filter:[]
}
},
enable_reflect_to_anchor:false,
enable_cache:true,
script:PresetScript_ReplacementToLink_DirectLinkGeneric_NicoSeigaIllustDirectLink()
});
// ニコニコ静画 漫画
filter.splice(19,0,{
name:{
standard:"NICONICO SEIGA Manga",
locales:{
ja:"ニコニコ静画 漫画",
en:"NICONICO SEIGA Manga"
}
},
filter:{
type:"asterisk",
asterisk:{
filter:[
"*://seiga.nicovideo.jp/watch/mg*",
"*://nico.ms/mg*"
]
},
regexp:{
filter:[]
}
},
enable_reflect_to_anchor:false,
enable_cache:true,
script:PresetScript_ReplacementToLink_DirectLinkGeneric_NicoSeigaManga()
});
// Miiverse
filter[21].script = PresetScript_ReplacementToLink_DirectLinkGeneric_Miiverse();
});
// イメージ検索用
updatePreset(proj.replacement_to_link,"direct_link_image_search",function(obj){
var filter = obj.filter;
// yahoo.cn
filter.splice(3,1);
// Baidu.jp
filter.splice(9,1);
// Yandex 画像検索
filter[6].filter = {
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^http://yandex\\.(ru|com)/images/search[?].*$",
flags:{i:true,g:false}
}
]
}
};
filter[6].script = PresetScript_ReplacementToLink_DirectLinkImageSearch_Yandex();
});
// ------------------------------
// 掲示板設定
// ------------------------------
// 2ちゃんねる掲示板
var obj = addPreset(proj.expand_bbs,"2ch",null);
var preset = obj.preset;
preset.filter.regexp.filter.splice(5,0,{
pattern:"^http://jbbs\\.shitaraba\\.net/[^/]+/[0-9]+/storage/[0-9]+.*$",
flags:{i:true,g:false}
});
preset.script_initialize = PresetScript_ExpandBbs_ScriptInitialize_2ch();
preset.script_callback = "";
// unkar.org
removePreset("expand_bbs","unkar");
// あっとちゃんねるず
var obj = addPreset(proj.expand_bbs,"atchs",null);
var preset = obj.preset;
preset.script_initialize = PresetScript_ExpandBbs_ScriptInitialize_Atchs();
preset.script_callback = PresetScript_ExpandBbs_ScriptCallback_Atchs();
// ふたば☆ちゃんねる
var obj = addPreset(proj.expand_bbs,"2chan",null);
var preset = obj.preset;
preset.script_initialize = PresetScript_ExpandBbs_ScriptInitialize_2chan();
preset.script_callback = PresetScript_ExpandBbs_ScriptCallback_2chan();
// ------------------------------
// URLマッピング設定
// ------------------------------
// 画像検索サイト
var preset = getPreset(proj.urlmap,"image_search");
var filter = preset.filter.regexp.filter;
filter.splice(5,1);
filter[8] = {
pattern:"^[^:]+://yandex\\.(ru|com)/images/.*",
flags:{i:true,g:false}
};
filter[9] = {
pattern:"^[^:]+://(|[^.]+\\.)bsearch\\.goo\\.ne\\.jp/(image|scrimg|similarity)\\.php[?].*MT=.*",
flags:{i:true,g:false}
};
filter[13] = {
pattern:"^[^:]+://images\\.search\\.biglobe\\.ne\\.jp/cgi-bin/search[?].*",
flags:{i:true,g:false}
};
// フェイスブック
var preset = getPreset(proj.urlmap,"facebook");
preset.replacement_to_anchor = {enable:true,id:["disable_event_facebook","direct_link_facebook"]};
// deviantART
var obj = addPreset(proj.urlmap,"deviant_art","pixiv");
obj.preset = {
name:{
standard:"deviantART",
locales:{
ja:"deviantART",
en:"deviantART"
}
},
enable:true,
filter:{
type:"asterisk",
asterisk:{
filter:[
"*://*.deviantart.com/*"
]
},
regexp:{
filter:[]
}
},
enable_unsecure:false,
enable_mixed_content:false,
access_block:{enable:false,id:[]},
replacement_to_element:{enable:true,id:["assist_deviant_art"]},
replacement_to_text:{enable:false,id:[]},
replacement_to_anchor:{enable:true,id:["no_referrer"]},
replacement_to_link:{enable:true,id:["direct_link_generic"]},
replacement_to_referer:{enable:true,id:["replacement_link_url"]},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"detail"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup_image_in_anchor"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// ニコニコ静画
var obj = addPreset(proj.urlmap,"nico_seiga","pixiv");
obj.preset = {
name:{
standard:"niconico seiga",
locales:{
ja:"ニコニコ静画",
en:"niconico seiga"
}
},
enable:true,
filter:{
type:"asterisk",
asterisk:{
filter:[
"http://seiga.nicovideo.jp/seiga/im*",
"http://seiga.nicovideo.jp/illust/*",
"http://seiga.nicovideo.jp/shunga/*"
]
},
regexp:{
filter:[]
}
},
enable_unsecure:false,
enable_mixed_content:false,
access_block:{enable:false,id:[]},
replacement_to_element:{enable:true,id:["assist_nico_seiga"]},
replacement_to_text:{enable:false,id:[]},
replacement_to_anchor:{enable:true,id:["no_referrer"]},
replacement_to_link:{enable:true,id:["direct_link_generic"]},
replacement_to_referer:{enable:true,id:["replacement_link_url"]},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"detail"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup_image_in_anchor"},
expand_sound:{enable:true,id:"inline"},
expand_video:{enable:true,id:"inline"},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
// ピクシブ
updatePreset(proj.urlmap,"pixiv",function(obj){
obj.replacement_to_element.id.shift();
});
// ブログ
var obj = addPreset(proj.urlmap,"blog_ja","default");
obj.preset = {
name:{
standard:"Blog",
locales:{
ja:"ブログ",
en:"Blog"
}
},
enable:true,
filter:{
type:"asterisk",
asterisk:{
filter:[
"*://ameblo.jp/*/*",
"*://blogs.yahoo.co.jp/*",
"*://blog.livedoor.jp/*",
"*://*.blog.jp/*",
"*://*.doorblog.jp/*",
"*://*.blog*.fc2.com/*",
"*://*.exblog.jp/*",
"*://*.seesaa.net/*",
"*://*.blogspot.jp/*",
"*://*.hatenablog.jp/*"
]
},
regexp:{
filter:[]
}
},
enable_unsecure:false,
enable_mixed_content:false,
access_block:{enable:false,id:[]},
replacement_to_element:{enable:true,id:["assist_image_in_anchor"]},
replacement_to_text:{enable:false,id:[]},
replacement_to_anchor:{enable:true,id:["no_referrer"]},
replacement_to_link:{enable:true,id:["direct_link_generic"]},
replacement_to_referer:{enable:true,id:["replacement_link_url"]},
replacement_to_useragent:{enable:false,id:""},
make_link_to_text:{enable:true,id:"detail"},
expand_short_url:{enable:true,id:"detail"},
expand_text:{enable:false,id:""},
expand_image:{enable:true,id:"popup_image_in_anchor"},
expand_sound:{enable:false,id:""},
expand_video:{enable:false,id:""},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:true,id:"default"},
experimental:{enable:false,id:""}
};
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.20
// ------------------------------
if(proj.version < 20){
// バージョン値
proj.version = 20;
// ------------------------------
// エレメント置換定義
// ------------------------------
// 展開アシスト(ピクシブ用)
updatePreset(proj.replacement_to_element,"assist_pixiv",function(obj){
obj.script = PresetScript_ReplacementToElement_AssistPixiv();
});
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// 直リンク(汎用)
updatePreset(proj.replacement_to_link,"direct_link_generic",function(obj){
var filter = obj.filter;
// ピクシブ
filter[20].script = PresetScript_ReplacementToLink_DirectLinkGeneric_PixivNet();
});
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.21
// ------------------------------
if(proj.version < 21){
// バージョン値
proj.version = 21;
// ------------------------------
// 掲示板設定
// ------------------------------
// 8chan.co
var obj = addPreset(proj.expand_bbs,"8chan","4chan");
obj.preset = {
name:{
standard:"8chan.co",
locales:{
ja:"8chan",
en:"8chan.co"
}
},
filter:{
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^(http|https)://([^.]+\\.|)8chan\\.co/[^/]+/.*$",
flags:{i:true,g:false}
},{
pattern:"^(http|https)://([^.]+\\.|)8ch\\.net/[^/]+/.*$",
flags:{i:true,g:false}
}
]
}
},
enable:true,
script_initialize:PresetScript_ExpandBbs_ScriptInitialize(),
script_callback:PresetScript_ExpandBbs_ScriptCallback_8chan(),
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:75,y:90},
time_wait_open:0,
time_wait_close:250,
style_sheet:"padding:20px 10px; margin:0px; border:1px solid #000; overflow-y:auto; word-wrap:break-word; word-break:break-all; display:block;"
}
};
// ------------------------------
// イメージ展開定義
// ------------------------------
// 画像掲示板用
updatePreset(proj.expand_image,"image_bbs",function(obj){
obj.thumbnail.script_allow = PresetScript_ExpandImage_ThumbnailScriptAllow_ImageBbs();
});
// ------------------------------
// URLマッピング設定
// ------------------------------
// 画像掲示板
updatePreset(proj.urlmap,"image_bbs",function(obj){
var filter = obj.filter.asterisk.filter;
filter.push("*://8ch.net/*");
filter.push("*://8chan.co/*");
filter.push("*://*.8chan.co/*");
});
}
if(exit()) return proj;
// ------------------------------
// プロジェクト ver.22
// ------------------------------
if(proj.version < 22){
// バージョン値
proj.version = 22;
// ------------------------------
// アンカー置換定義
// ------------------------------
// 2ch.net 用
updatePreset(proj.replacement_to_anchor,"direct_link_bbs",function(obj){
obj.script = PresetScript_ReplacementToAnchor_DirectLinkBbs();
});
// ソーシャルサービスのカウント数を表示
updatePreset(proj.replacement_to_anchor,"attach_sns_counter",function(obj){
obj.script = PresetScript_ReplacementToAnchor_AttachSnsCounter();
});
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
// 直リンク(HTML 内の画像を検索)
var obj = addPreset(proj.replacement_to_link,"direct_link_find_image_in_html",null);
obj.preset = {
name:{
standard:"Direct Link (Find an image in HTML)",
locales:{
ja:"直リンク(HTML 内の画像を検索)",
en:"Direct Link (Find an image in HTML)"
}
},
filter:[
{
name:{
standard:"Image of the largest byte",
locales:{
ja:"最大バイトの画像",
en:"Image of the largest byte"
}
},
filter:{
type:"regexp",
asterisk:{
filter:[]
},
regexp:{
filter:[
{
pattern:"^(http|https)://.*\\.(bmp|gif|jpg|jpe|jpeg|png)([^#?/]*)([#?].*|$)",
flags:{i:true,g:false}
}
]
}
},
enable_reflect_to_anchor:false,
enable_cache:true,
script:PresetScript_ReplacementToLink_DirectLinkFindImageInHTML_ImageOfTheLargestByte()
}
]
};
// ------------------------------
// 掲示板設定
// ------------------------------
// 2ちゃんねる掲示板
var obj = addPreset(proj.expand_bbs,"2ch",null);
var preset = obj.preset;
preset.script_callback = PresetScript_ExpandBbs_ScriptCallback_2ch();
// chaika
var obj = addPreset(proj.expand_bbs,"chaika","atchs");
var preset = obj.preset;
preset.script_initialize = PresetScript_ExpandBbs_ScriptInitialize_Chaika();
preset.script_callback = PresetScript_ExpandBbs_ScriptCallback_Chaika();
}
if(exit()) return proj;
return proj;
}
// ------------------------------
// エレメント置換定義「連続するBRタグを削除」
// ------------------------------
function PresetScript_ReplacementToElement_DeleteBrTags(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
if(element.tagName.toLowerCase() != "br"){
return false;
}
// 最大連続改行数
var allow_max = 2;
var count = 0;
var e = element.previousSibling;
while(true){
if(!e) break;
var node_type = e.nodeType;
if(node_type == 1){
if(e.tagName.toLowerCase() != "br"){
break;
}
count++;
if(count >= allow_max){
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeRemoveElementBefore(element);
DomNodeRemove(element);
revise_scroll.executeRemoveElementAfter(element);
break;
}
}else if(node_type == 3){
if(!ElementGetTextContent(e).match(new RegExp("^[ \r\n\t ]*$"))){
break;
}
}
e = e.previousSibling;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// エレメント置換定義「フォントの種類をメイリオに変更」
// ------------------------------
function PresetScript_ReplacementToElement_MeiryoFont(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var style = element.style;
if(style){
// フォントのサイズ(font-size)
//style.fontSize = "12px";
// フォントの太さ(font-weight)
//style.fontWeight = "bold";
// フォントの斜体(font-style)
//style.fontStyle = "italic";
// フォントの種類(font-family)
style.fontFamily = "'メイリオ','Meiryo'";
// 行の高さ(line-height)
//style.lineHeight = "1.4";
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// エレメント置換定義「展開アシスト(アンカー内画像用)」
// ------------------------------
function PresetScript_ReplacementToElement_AssistImageInAnchor(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var result = (function(){
// イメージ要素
if(element.tagName == "IMG"){
return true;
}
// バックグラウンドイメージを含む
var style = ElementGetComputedStyle(element,null);
if(style){
if(style.backgroundImage.indexOf("url(") == 0){
return true;
}
}
return false;
})();
if(result){
while(element){
if(element.tagName == "A"){
response({url:element.href});
return true;
}
element = element.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// エレメント置換定義「展開アシスト(画像検索用)」
// ------------------------------
function PresetScript_ReplacementToElement_AssistImageSearch(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
if(element.tagName == "A"){
// NAVER 画像検索
var org_src = element.getAttribute("src");
if(org_src){
if(org_src.indexOf(".search.naver.jp/") >= 0){
response({url:org_src});
return true;
}
}
// BIGLOBE 画像検索
var org_imgsrc = element.getAttribute("org_imgsrc");
if(org_imgsrc){
response({url:org_imgsrc});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// エレメント置換定義「展開アシスト(ツイッター用)」
// ------------------------------
function PresetScript_ReplacementToElement_AssistTwitter(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var resolved_url = element.getAttribute("data-resolved-url-large");
if(resolved_url){
response({url:resolved_url});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// エレメント置換定義「展開アシスト(deviantART 用)」
// ------------------------------
function PresetScript_ReplacementToElement_AssistDeviantArt(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var result = (function(){
// イメージ要素
if(element.tagName == "IMG"){
return true;
}
// 縦長サムネイル
if(element.className == "tt-bookendh"){
return true;
}
// 小サムネイル
if(element.className.search(new RegExp("tinythumb","i")) >= 0){
return true;
}
return false;
})();
if(result){
while(element){
if(element.tagName == "A"){
response({url:element.href});
return true;
}
element = element.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// エレメント置換定義「展開アシスト(ピクシブ用)」
// ------------------------------
function PresetScript_ReplacementToElement_AssistPixiv(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
if(element.tagName != "LI") return false;
var url = document.URL;
if(url.indexOf("mode=manga") < 0) return false;
var query = StringGetQuery(url);
if(!(query.illust_id)) return false;
var pos = element.getAttribute("data-position");
if(!pos) return false;
var tooltip = element.getAttribute("data-tooltip");
if(!tooltip) return false;
if(!tooltip.match(/^[0-9]+$/)) return false;
response({url:"http://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=" + query.illust_id + "&page=" + pos});
return true;
}.toString() +
",\n\n\t" +
function(info,response){
var element = info.element;
var result = (function(){
// DIV 要素
if(element.tagName != "DIV"){
return false;
}
if(element.className != "_layout-thumbnail"){
return false;
}
return true;
})();
if(result){
while(element){
if(element.tagName == "A"){
response({url:element.href});
return true;
}
element = element.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var element = info.element;
var result = (function(){
if(element.className.indexOf("user-icon") >= 0) return false;
// イメージ要素
if(element.tagName == "IMG"){
return true;
}
// バックグラウンドイメージを含む
var style = ElementGetComputedStyle(element,null);
if(style){
if(style.backgroundImage.indexOf("url(") == 0){
return true;
}
}
return false;
})();
if(result){
while(element){
if(element.className == "_layout-thumbnail") break;
if(element.tagName == "A"){
response({url:element.href});
return true;
}
element = element.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// エレメント置換定義「展開アシスト(ニコニコ静画用)」
// ------------------------------
function PresetScript_ReplacementToElement_AssistNicoSeiga(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var result = (function(){
// イメージ要素
if(element.tagName == "IMG"){
return true;
}
// トップアイテム
if(element.className == "item_info_container"){
return true;
}
return false;
})();
if(result){
while(element){
if(element.tagName == "A"){
response({url:element.href});
return true;
}
element = element.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// テキスト置換定義「英数字記号を半角、カタカナを全角に変更」
// ------------------------------
function PresetScript_ReplacementToText_AlphanumericHalf(){
return "" +
"[\n\t" +
function(info,response){
var text_node = info.text_node;
// 文字列を取得
var str = DomNodeGetNodeValue(text_node);
if(!str){
return false;
}
// 小文字化
//str = str.toLowerCase();
// 大文字化
//str = str.toUpperCase();
// 全角アルファベットから半角アルファベットに変換
str = StringConvertFromAlphabeticFullToAlphabeticHalf(str);
// 半角アルファベットから全角アルファベットに変換
//str = StringConvertFromAlphabeticHalfToAlphabeticFull(str);
// 全角数字から半角数字に変換
str = StringConvertFromNumericFullToNumericHalf(str);
// 半角英数字から全角英数字に変換
//str = StringConvertFromNumericHalfToNumericFull(str);
// 全角記号から半角記号に変換
str = StringConvertFromSignFullToSignHalf(str);
// 半角記号から全角記号に変換
//str = StringConvertFromSignHalfToSignFull(str);
// 全角スペースから半角スペースに変換
//str = StringConvertFromSpaceFullToSpaceHalf(str);
// 半角スペースから全角スペースに変換
//str = StringConvertFromSpaceHalfToSpaceFull(str);
// 半角カタカナから全角カタカナに変換
str = StringConvertFromKatakanaFullToKatakanaHalf(str);
// 全角カタカナから半角カタカナに変換
//str = StringConvertFromKatakanaHalfToKatakanaFull(str);
// ひらがなからカタカナに変換
//str = StringConvertFromHiraganaToKatakana(str);
// カタカナからひらがなに変換
//str = StringConvertFromKatakanaToHiragana(str);
// 文字列をセット
DomNodeSetNodeValue(text_node,str);
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// テキスト置換定義「空白とタブを可視化」
// ------------------------------
function PresetScript_ReplacementToText_VisualizeSpaceAndTab(){
return "" +
"[\n\t" +
function(info,response){
var text_node = info.text_node;
// 透明度
var alpha = 0.1;
while(text_node){
// テキストを取得
var str = DomNodeGetNodeValue(text_node);
if(!str){
return false;
}
if(str.match(/^( | |\t|\n|\r)+$/)){
break;
}
// 空白を調べる
var r = new RegExp("( | |\t)","i");
var match = str.match(r);
if(match){
// 左側のテキスト
DomNodeSetNodeValue(text_node,RegExp.leftContext);
// pre 作成
var element = DocumentCreateElement('pre');
element.style.display = "inline";
switch(match[1]){
case " ": element.style.backgroundColor = "#f00"; break;
case " ": element.style.backgroundColor = "#0f0"; break;
case "\t": element.style.backgroundColor = "#00f"; break;
}
element.style.opacity = alpha;
DomNodeInsertAfter(element,text_node);
// テキスト作成
var text = DocumentCreateText(match[1]);
DomNodeSetCompletedReplacementToText(text);
element.appendChild(text);
// 右側のテキスト
var text = DocumentCreateText('text');
DomNodeSetNodeValue(text,RegExp.rightContext);
DomNodeInsertAfter(text,element);
text_node = text;
continue;
}
break;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「自動ダウンロード(すべて)」
// ------------------------------
function PresetScript_ReplacementToAnchor_AutoDownloadAll(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
if(url.search("^(http|https|data):") >= 0){
// Downloader オブジェクトを作成
var downloader = new Downloader();
// ダウンロード設定
downloader.setURL(url);
downloader.setFileName(url);
downloader.setSaveAs(false);
// ダウンロード開始
downloader.start();
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「自動ダウンロード(画像のみ)」
// ------------------------------
function PresetScript_ReplacementToAnchor_AutoDownloadImage(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
if(url.search(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i")) >= 0){
// Downloader オブジェクトを作成
var downloader = new Downloader();
// ダウンロード設定
downloader.setURL(url);
downloader.setFileName(url);
downloader.setSaveAs(false);
// ダウンロード開始
downloader.start();
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「ダウンロードリストに登録(すべて)」
// ------------------------------
function PresetScript_ReplacementToAnchor_AddDownloadListAll(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
if(url.search("^(http|https|data):") >= 0){
// ユーザーリストからアイテムを作成
var item = download_list_user.createItem();
// ダウンロード設定
item.setURL(url);
item.setFileName(url);
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「ダウンロードリストに登録(画像のみ)」
// ------------------------------
function PresetScript_ReplacementToAnchor_AddDownloadListImage(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
if(url.search(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i")) >= 0){
// ユーザーリストからアイテムを作成
var item = download_list_user.createItem();
// ダウンロード設定
item.setURL(url);
item.setFileName(url);
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「ポップアップを無効化(イメージ検索用)」
// ------------------------------
function PresetScript_ReplacementToAnchor_DisablePopupImageSearch(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// Google 画像検索
var url = anchor_element.href;
var r = new RegExp("^(http|https)://.*?\\.google\\.(at|be|ca|ch|de|es|fr|it|nl|no|pl|ru|se|co\\.(id|in|jp|th|uk|za)|com|com\\.(ar|au|br|mx|sa|tr|tw))/imgres[?].*","i");
if(url.match(r)){
// ポップアップ要素を外す
var node = anchor_element;
while(true){
if(!node) break;
if(node.id == "rg_h"){
DomNodeRemove(node);
response({});
return true;
}
node = node.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// Yahoo Image Search
var url = anchor_element.href;
var r = new RegExp("(image|images)\\.search\\.yahoo\\.com/images/view;.*","i");
if(url.match(r)){
// ポップアップ要素を非表示
var node = anchor_element;
while(true){
if(!node) break;
if(node.id == "ihover-node-cont"){
node.style.display = "none";
response({});
return true;
}
node = node.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// Bing 画像検索
var url = anchor_element.href;
var r = new RegExp("^(http|https)://www\\.bing\\.com/images/search[?].*","i");
if(url.match(r)){
// ポップアップ要素を非表示
var node = anchor_element;
while(true){
if(!node) break;
if(node.id == "sg_hid"){
node.style.display = "none";
response({});
return true;
}
node = node.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// AOL Image Search
var url = anchor_element.href;
var r = new RegExp("^http://search\\.aol\\..+?/aol/imageDetails[?].*","i");
if(url.match(r)){
// ポップアップ要素を非表示
var node = anchor_element;
while(true){
if(!node) break;
if(node.className == "hover"){
node.style.display = "none";
response({});
return true;
}
node = node.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// Baidu Image Search
var url = anchor_element.href;
var r = new RegExp("^http://image\\.baidu\\.com/i[?].*","i");
if(url.match(r)){
// ポップアップ要素を外す
var node = anchor_element;
while(true){
if(!node) break;
if(node.id == "imgDetail"){
DomNodeRemove(node);
response({});
return true;
}
node = node.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// NAVER Image Search
var url = anchor_element.href;
var r = new RegExp("http://imagesearch\\.naver\\.com/search.naver[?]","i");
if(url.match(r)){
// ポップアップ要素を外す
var node = anchor_element;
while(true){
if(!node) break;
if(node.className == "zoom_imsch _infolayer"){
DomNodeRemove(node);
response({});
return true;
}
node = node.parentNode;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「イベントを無効化(フェイスブック用)」
// ------------------------------
function PresetScript_ReplacementToAnchor_DisableEventFacebook(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var parent = anchor_element.parentNode;
if(parent){
var m = parent.className.match(new RegExp("(^| )userContent( |$)","i"));
if(m){
anchor_element.removeAttribute("onmouseover");
anchor_element.removeAttribute("onclick");
anchor_element.onmouseover = null;
anchor_element.onclick = null;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「直リンクに変更(ツイッター用)」
// ------------------------------
function PresetScript_ReplacementToAnchor_DirectLinkTwitter(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var expanded_url = anchor_element.getAttribute("data-expanded-url");
if(expanded_url){
if(StringUrlMatchAsteriskWord(anchor_element.href,"*://t.co/*")){
anchor_element.href = expanded_url;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「直リンクに変更(フェイスブック用)」
// ------------------------------
function PresetScript_ReplacementToAnchor_DirectLinkFacebook(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var m = url.match(new RegExp("^(http|https)://[^\\.]+\\.facebook\\.com/l\\.php?","i"));
if(m){
var query = StringGetQuery(url);
if(query["u"]){
anchor_element.href = unescape(query["u"]);
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「直リンクに変更(リアルタイム検索用)」
// ------------------------------
function PresetScript_ReplacementToAnchor_DirectLinkRealtimeSearch(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// Yahoo! JAPAN リアルタイム検索
var url = anchor_element.href;
var r = new RegExp("^(http|https)://ord\\.yahoo\\.co\\.jp/o/realtime/.*/([*][-]|[*][*])(.*)$","i");
if(url.match(r)){
anchor_element.href = unescape(RegExp.$3);
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「直リンクに変更(検索用)」
// ------------------------------
function PresetScript_ReplacementToAnchor_DirectLinkSearch(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var r;
// Google 検索
if(anchor_element.onmousedown){
if(anchor_element.onmousedown.toString().match(/return rwt\(this,/)){
anchor_element.onmousedown = null;
}
}
// Yahoo! JAPAN
if(anchor_element.onmousedown){
if(anchor_element.onmousedown.toString().match(/return lswap\(this/)){
anchor_element.onmousedown = null;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// Google 検索
var url = anchor_element.href;
var r = new RegExp("^(http|https)://www\\.google\\.(com|co\\.jp)/url[?].*","i");
if(url.match(r)){
// クエリを取得
var query = StringGetQuery(url);
if(query.url){
anchor_element.href = unescape(query.url);
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// Yahoo! JAPAN 検索
var url = anchor_element.href;
var r = new RegExp("^(http|https)://wrs\\.search\\.yahoo\\.co\\.jp/_ylt=.*[/][*][*](.*)$","i");
if(url.match(r)){
anchor_element.href = unescape(RegExp.$2);
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「直リンクに変更(スレッド掲示板用)」
// ------------------------------
function PresetScript_ReplacementToAnchor_DirectLinkBbs(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var r;
// リンク先を取得
var url = anchor_element.href;
var list = [
// 2ちゃんねる
{search:"^http://ime\\.nu/",replace:"http://"},
{search:"^http://jump\\.2ch\\.net/[?]",replace:"http://"},
{search:"^http://2ch\\.io/",replace:"http://"},
// まちBBS
{search:"^http://machi\\.to/bbs/link\\.cgi[?]URL=",replace:""},
// PINKちゃんねる
{search:"^http://pinktower\\.com/",replace:"http://"},
// したらば掲示板
{search:"^http://jbbs\\.shitaraba\\.net/bbs/link\\.cgi[?]url=",replace:"",decode_uri:true},
// ログ速
{search:"^http://l\\.moapi\\.net/",replace:""},
// かきこ
{search:"^http://fast\\.io/",replace:"http://"},
// あっとちゃんねるず
{search:"^http://z4c\\.in/",replace:"http://"},
{search:"^http://www[0-9]+\\.atchs\\.jp/j/",replace:"http://"}
];
var i;
var num = list.length;
for(i=0;i<num;i++){
var item = list[i];
r = new RegExp(item.search,"i");
if(url.match(r)){
url = url.replace(r,item.replace);
if(item.decode_uri) url = decodeURIComponent(url);
anchor_element.href = url;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「ツールチップにリンク先を表示」
// ------------------------------
function PresetScript_ReplacementToAnchor_DisplayUrlInTooltip(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var event_dispatcher = info.event_dispatcher;
// 開放時に実行される関数
function release(){
if(event_handler_change){
event_handler_change.release();
event_handler_change = null;
}
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
}
// 変更時に実行される関数
function change(){
// ツールチップを設定
anchor_element.title = anchor_element.href;
}
// 開放時に実行されるイベント
var event_handler_release = event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(release);
// 変更時に実行されるイベント
var event_handler_change = event_dispatcher.createEventHandler("anchor_href_change");
event_handler_change.setFunction(change);
change();
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「ソーシャルサービスのカウント数を表示」
// ------------------------------
function PresetScript_ReplacementToAnchor_AttachSnsCounter(){
return "" +
"[\n\t" +
function(info,response){
// Twitterボタンを追加
var anchor_element = info.anchor_element;
var url = anchor_element.href;
// キュー
var result = new Array();
var queue = [
// Twitter
function(){
var loader = new Loader();
loader.onerror = error;
loader.onload = function(v){
try{
var param = JsonParse(v);
var count = param.count;
if(count){
result.push(createItem({
label:"t",
value:count,
tooltip:"twitter Retweet",
color:"#fff",
background:"#33CCFF",
borderColor:"#33CCFF"
}));
}
}catch(e){}
execute();
};
loader.setURL("http://urls.api.twitter.com/1/urls/count.json?url=" + url);
loader.loadText();
},
// Facebook
function(){
var loader = new Loader();
loader.onerror = error;
loader.onload = function(v){
try{
var param = JsonParse(v);
var count = param[0].total_count;
if(count){
result.push(createItem({
label:"f",
value:count,
tooltip:"Facebook Like",
color:"#fff",
background:"#3B5999",
borderColor:"#233774"
}));
}
}catch(e){}
execute();
};
var fql = "SELECT total_count FROM link_stat WHERE url=\"" + url + "\"";
fql = encodeURIComponent(fql).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
loader.setURL("https://api.facebook.com/method/fql.query?format=json&query=" + fql);
loader.loadText();
},
// Google +1
function(){
var loader = new Loader();
loader.onerror = error;
loader.onload = function(v){
if(v.match(/window\.__SSR = [{]c: ([0-9]+)/i)){
var count = parseInt(RegExp.$1);
if(count){
result.push(createItem({
label:"g+",
value:count,
tooltip:"Google +1",
color:"#fff",
background:"#CD4131",
borderColor:"#A5281A"
}));
}
}
execute();
};
loader.setURL("https://plusone.google.com/u/0/_/+1/fastbutton?count=true&url=" + url);
loader.loadText();
},
// はてなブックマーク
function(){
var loader = new Loader();
loader.onerror = error;
loader.onload = function(v){
try{
if(v){
result.push(createItem({
label:"B!",
value:v,
tooltip:"Hatena Bookmark",
color:"#fff",
background:"#2B65A9",
borderColor:"#2B65A9"
}));
}
}catch(e){}
execute();
};
loader.setURL("http://api.b.st-hatena.com/entry.count?url=" + escape(url));
loader.loadText();
},
// Pinterest
function(){
var loader = new Loader();
loader.onerror = error;
loader.onload = function(v){
try{
var param = JsonParse(v.match(/\((.*)\)/i)[1]);
var count = param.count;
if(count){
result.push(createItem({
label:"Pi",
value:count,
tooltip:"Pinterest Pin Count",
color:"#fff",
background:"#DF2532",
borderColor:"#8C1B22"
}));
}
}catch(e){}
execute();
};
loader.setURL("http://widgets.pinterest.com/v1/urls/count.json?source=6&url=" + encodeURIComponent(url));
loader.loadText();
},
// reddit score
function(){
var loader = new Loader();
loader.onerror = error;
loader.onload = function(v){
try{
var param = JsonParse(v);
var score = param.data.children[0].data.score;
if(score){
result.push(createItem({
label:"r",
value:score,
tooltip:"reddit Score",
color:"#30659A",
background:"#C7DEF7",
borderColor:"#C7DEF7"
}));
}
}catch(e){}
execute();
};
loader.setURL("http://buttons.reddit.com/button_info.json?url=" + encodeURIComponent(url));
loader.loadText();
},
// StumbleUpon views
function(){
var loader = new Loader();
loader.onerror = error;
loader.onload = function(v){
try{
var param = JsonParse(v);
var views = param.result.views;
if(views){
result.push(createItem({
label:"SU",
value:views,
tooltip:"StumbleUpon Views",
color:"#fff",
background:"#E6492E",
borderColor:"#E6492E"
}));
}
}catch(e){}
execute();
};
loader.setURL("http://www.stumbleupon.com/services/1.01/badge.getinfo?url=" + encodeURIComponent(url));
loader.loadText();
},
// 出力
function(){
var num = result.length;
if(num){
// span を生成
var span = DocumentCreateElement("span");
ElementSetStyle(span,"all:initial; line-height:1.0;");
var i;
for(i=0;i<num;i++){
span.appendChild(result[i]);
}
var click_func = function(e){
DomNodeRemove(span);
};
if(span.addEventListener){
span.addEventListener("click",click_func,true);
}else if(span.attachEvent){
span.attachEvent("onclick",click_func);
}
// 直後に登録
DomNodeInsertAfter(span,anchor_element);
}
}
];
// 実行
function execute(){
var f = queue.shift();
if(f){
f();
}
}
// エラー
function error(){
execute();
}
// アイテム作成
function createItem(param){
var table = DocumentCreateElement("table");
var tbody = DocumentCreateElement("tbody");
table.appendChild(tbody);
var tr = DocumentCreateElement("tr");
var td0 = DocumentCreateElement("td");
var td1 = DocumentCreateElement("td");
tbody.appendChild(tr);
tr.appendChild(td0);
tr.appendChild(td1);
td0.appendChild(DocumentCreateText(param.label));
td1.appendChild(DocumentCreateText(param.value));
table.cellspacing = "0";
var style = table.style;
style.cssText = "border:1px solid #888; border-spacing:0; margin;0; margin-right:2px; padding:0; line-height:1.0; border-radius:2px; display:inline-block; font-size:14px; width:auto; heigh:auto;";
if(param.tooltip){
table.title = param.tooltip;
}
if(param.borderColor){
style.borderColor = param.borderColor;
}
var style = tr.style;
style.cssText = "margin:0; padding:0; width:auto; height:auto;";
var style = td0.style;
style.cssText = "margin:0; padding:1px 2px; background:#fff; text-align:center; width:auto; height:auto; color:#000;";
if(param.color){
style.color = param.color;
}
if(param.background){
style.background = param.background;
}
var style = td1.style;
style.cssText = "padding:1px 2px; background:#fff; text-align:center; width:auto; height:auto;";
return table;
}
// 初回実行開始
if(url.match(new RegExp("^(http|https)://","i"))){
execute();
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// アンカー置換定義「ノーリファラ属性を追加」
// ------------------------------
function PresetScript_ReplacementToAnchor_NoReferrer(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// "noreferrer" が含まれない場合
if(!(anchor_element.rel.match(/noreferrer/i))){
// "noreferrer" を追加
if(anchor_element.rel){
anchor_element.rel += " noreferrer";
}else{
anchor_element.rel = "noreferrer";
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「OGP "og:image"」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_OgpOgImage(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"og:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m){
response({result:true,url:m[1],content_type:["image"]});
return;
}
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「OGP "twitter:*"」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_OgpTwitter(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
// twitter:card
if(str.match(new RegExp("<meta[ \n\r\t]+?name[ \n\r\t]*?=[ \n\r\t]*?\"twitter:card\"[ \n\r\t]+?content[ \n\r\t]*?=[ \n\r\t]*?\"([^\"]+?)\"","i"))){
switch(RegExp.$1){
case "player":
if(str.match(new RegExp("<meta[ \n\r\t]+?name[ \n\r\t]*?=[ \n\r\t]*?\"twitter:player\"[ \n\r\t]+?content[ \n\r\t]*?=[ \n\r\t]*?\"([^\"]+?)\"","i"))){
var video_url = RegExp.$1.replace(/&/g, "&");
video_url = video_url.replace(/&/g, "&");
response({result:true,url:video_url});
return;
}
case "photo":
case "summary":
if(str.match(new RegExp("<meta[ \n\r\t]+?name[ \n\r\t]*?=[ \n\r\t]*?\"twitter:image\"[ \n\r\t]+?content[ \n\r\t]*?=[ \n\r\t]*?\"([^\"]+?)\"","i"))){
var image_url = RegExp.$1.replace(/&/g, "&");
image_url = image_url.replace(/&/g, "&");
response({result:true,url:image_url,content_type:["image"]});
return;
}
}
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Twitpic」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_Twitpic(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(str.match(new RegExp("<img[^>]+?src=\"((http|https)://[^/]+/photos/(large|full)/[^\"]+)\"","i"))){
response({result:true,url:RegExp.$1});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Twitter Photo」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_TwitterPhoto(){
return "" +
"[\n\t" +
function (info,response){
var anchor_element = info.anchor_element;
// # があれば終了
if(anchor_element.href.indexOf("#") >= 0){
response({result:false});
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
// 高解像度
if(!image_url){
var m = str.match(new RegExp('<a[^>]+data[-]resolved[-]url[-]large[ \n\r\t]*=[ \n\r\t]*"(https://pbs\\.twimg\\.com/media/[^"]+)"',"i"));
if(m) image_url = m[1];
}
// 低解像度
if(!image_url){
var m = str.match(new RegExp('<img[^>]+src[ \n\r\t]*=[ \n\r\t]*"(https://pbs\\.twimg\\.com/media/[^"]+)"',"i"));
if(m) image_url = m[1];
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Facebook Photo」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_FacebookPhoto(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
// 高解像度
if(!image_url){
var m = str.match(new RegExp("<a[^>]+?class=\"fbPhotosPhotoActionsItem\"[^>]+?href=\"([^\"]+?[?][^\"]*dl=1)\"[^>]+?rel=\"ignore\"","i"));
if(m) image_url = m[1].replace(/&/g, "&");
}
// 中解像度
if(!image_url){
var m = str.match(new RegExp("<img.+?id=\"fbPhotoImage\".+?src=\"([^\"]+?)\"","i"));
if(m) image_url = m[1].replace(/&/g, "&");
}
if(image_url){
response({result:true,url:image_url});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Google+ Photo」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_GooglePlusPhoto(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
if(!image_url){
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"og:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
}
if(!image_url){
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"twitter:image:src\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
}
if(image_url){
var m = image_url.match(new RegExp("(.*)/(s[0-9]+)(|-[^/]+)/(.*?)$","i"))
if(m){
image_url = m[1] + "/s9999/" + m[4];
}
var m = image_url.match(new RegExp("(.*)/(w[0-9]+[-]h[0-9]+)(|-[^/]+)/(.*?)$","i"))
if(m){
image_url = m[1] + "/s9999/" + m[4];
}
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Picasa Photo」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_PicasaPhoto(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
if(anchor_element.href.match("^(http|https)://picasaweb\\.google\\.com/lh/photo/[0-9a-zA-Z]+(|[?].*)$","i")){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(str.match(new RegExp("<link.*?rel.*?=.*?\'image_src\'.*?href.*?=.*?\"(.*?)\"","i"))){
var image_url = RegExp.$1;
if(image_url.match(new RegExp("(.*)/(s[0-9]{1,3})(|-c)/(.*?)$","i"))){
image_url = RegExp.$1 + "/s9999/" + RegExp.$4;
}
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var anchor_element = info.anchor_element;
if(anchor_element.href.match("^(http|https)://picasaweb\\.google\\.com/[0-9]+/[0-9a-zA-Z]+(|[?].*)#([0-9]+)$","i")){
var photo_id = RegExp.$3;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var pos = str.indexOf(photo_id);
if(pos >= 0){
if(str.substring(pos).match(new RegExp("\"thumbnail\":[[][{]\"url\":\"(.*?)\"","i"))){
var image_url = RegExp.$1;
if(image_url.match(new RegExp("(.*)/(s[0-9]{1,3})(|-c)/(.*?)$","i"))){
image_url = RegExp.$1 + "/s9999/" + RegExp.$4;
}
response({result:true,url:image_url,content_type:["image"]});
return;
}
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}
return false;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Tumblr」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_Tumblr(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
// photo
if(str.match(new RegExp("<meta[ \n\r\t]+?property[ \n\r\t]*?=[ \n\r\t]*?\"og:image\"[ \n\r\t]+?content[ \n\r\t]*?=[ \n\r\t]*?\"([^\"]+?)\"","i"))){
var m = RegExp.$1.match(new RegExp("^.*\/(tumblr_.*)_[0-9]+\\..*?$","i"));
if(m){
var file_name = RegExp.$1;
var image_url;
var size = 0;
str.replace(new RegExp("\"(http:\/\/[^\"]*?\/" + file_name + "_)([0-9]+)(\\..*?)\"","gi"),function(str, p1, p2) {
var s = parseInt(RegExp.$2);
if(s > size){
size = s;
image_url = RegExp.$1 + RegExp.$2 + RegExp.$3;
}
});
response({result:true,url:image_url,content_type:["image"]});
return;
}
}
// player
if(str.match(new RegExp("<meta[ \n\r\t]+?name[ \n\r\t]*?=[ \n\r\t]*?\"twitter:player\"[ \n\r\t]+?content[ \n\r\t]*?=[ \n\r\t]*?\"([^\"]+?)\"","i"))){
var video_url = RegExp.$1.replace(/&/g, "&");
video_url = video_url.replace(/&/g, "&");
response({result:true,url:video_url});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Flickr」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_Flickr(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
// 高解像度
if(!image_url){
var m = str.match(new RegExp('<img[^>]+class="[^"]*main-photo[^"]*"',"i"));
if(m){
m = m[0].match(new RegExp("src[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
}
// 低解像度
if(!image_url){
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"og:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「yfrog.com」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_Yfrog(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
// 高解像度
if(!image_url){
var m = str.match(new RegExp('<img[^>]+id="main_image"[^>]*>',"i"));
if(m){
m = m[0].match(new RegExp("src[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
var url = anchor_element.href;
var m = url.match(new RegExp("yfrog\\.com/(.*)([?]|#|$)","i"));
if(m){
url = "https://twitter.yfrog.com/" + m[1] + "?sa=0";
}
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(url);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Giphy」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_Giphy(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
var m = str.match(new RegExp("<meta[^>]+?(itemprop)[ \n\r\t]*=[ \n\r\t]*\"image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Gyazo」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_Gyazo(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
var m = str.match(new RegExp("<meta[^>]+?name[ \n\r\t]*=[ \n\r\t]*\"twitter:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Photozou Photo」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_PhotozouPhoto(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(str.match(new RegExp("<meta.*?property.*?=.*?\"og:image\".*?content.*?=.*?\"(.*?)\"","i"))){
var image_url = RegExp.$1;
var m = image_url.match(new RegExp("_[0-9]+\\.v","i"));
if(m){
image_url = RegExp.leftContext + "_org.v" + RegExp.rightContext;
}
response({result:true,url:image_url});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「ついっぷる」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_Twipple(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"og:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
if(image_url){
var m = image_url.match(new RegExp("(thumb|large)","i"));
if(m){
image_url = RegExp.leftContext + "orig" + RegExp.rightContext;
}
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「ついっぷる (直リンク)」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_TwippleDirectLink(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var m = anchor_element.href.match(new RegExp("^(http|https)(://p.twpl.jp/show/)(orig|large|thumb)(/[0-9a-zA-Z]{4,}$)","i"));
if(m){
response({result:true,url:m[1]+m[2]+"orig"+m[4],content_type:["image"]});
}else{
response({result:false});
}
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「blog.fc2.com」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_BlogFc2Com(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
if(anchor_element.href.match("^(http|https)://[a-z0-9]+?\\.blog\\.fc2\\.com/img/.+?./$","i")){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
var m = str.match(new RegExp('<a[^>]+?class[ \n\r\t]*=[ \n\r\t]*"[^"]*thickbox[^"]*"[^>]*>',"i"));
if(m){
m = m[0].match(new RegExp("href[ \n\r\t]*=[ \n\r\t]*\"(http://blog[-]imgs[-][0-9]+?\\.fc2\\.com/./././[a-z0-9_]+?/.+?)\"","i"));
if(m) image_url = m[1];
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}
return false;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「deviantART」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_DeviantArt(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"og:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
if(image_url){
m = image_url.match(new RegExp("^(.*)/PRE/(.*)$","i"));
if(m){
image_url = m[1] + "/" + m[2];
}
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「ニコニコ静画 イラスト」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_NicoSeigaIllust(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
// 低解像度画像を取得
function getOgImage(){
var image_url;
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"og:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
}
// 非ログイン
if(str.search(new RegExp('class[ \n\r\t]*=[ \n\r\t]*"siteHeaderLogin"',"i")) >= 0){
getOgImage();
return;
}
// 高解像度リンク
var image_id = "";
if(anchor_element.href.match(new RegExp("im([0-9]+)","i"))){
image_id = RegExp.$1;
}
if(anchor_element.href.match(new RegExp("id=([0-9]+)","i"))){
image_id = RegExp.$1;
}
var source_url = "http://seiga.nicovideo.jp/image/source/" + image_id;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url = str;
var m = image_url.match(new RegExp("(http://lohas\\.nicoseiga\\.jp/)o(/[a-z0-9]+/[0-9]+/[0-9]+)","i"));
if(m){
// 高解像度画像
var image_url = m[1] + "priv" + m[2];
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
getOgImage();
};
// 失敗
loader.onerror = function(){
getOgImage();
};
// 最終リダイレクト先を取得
loader.setMethod("GET");
loader.setURL(source_url);
loader.loadFinalURL();
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「ニコニコ静画 イラスト (直リンク)」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_NicoSeigaIllustDirectLink(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url = str;
var m = image_url.match(new RegExp("(http://lohas\\.nicoseiga\\.jp/)o(/[a-z0-9]+/[0-9]+/[0-9]+)","i"));
if(m){
// 高解像度画像
image_url = m[1] + "priv" + m[2];
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// 最終リダイレクト先を取得
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadFinalURL();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「ニコニコ静画 漫画」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_NicoSeigaManga(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
// ログイン済み
if(!image_url){
var m = str.match(new RegExp('data-original[ \n\r\t]*=[ \n\r\t]*"(http://lohas.nicoseiga.jp/thumb/[^"]*)"',"i"));
if(m) image_url = m[1];
}
// 未ログイン
if(!image_url){
var m = str.match(new RegExp("<img[^>]+?class[ \n\r\t]*=[ \n\r\t]*\"thumb\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("src[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「pixiv.net」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_PixivNet(){
return "" +
"[\n\t" +
function (info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var query = StringGetQuery(url);
// PC用ドメインに変更
var m = url.match(new RegExp("(http|https)(://)([^\\.]+)(\\.pixiv\\.net/.*)","i"));
if(m){
url = m[1] + m[2] + "www" + m[4];
}
// ローダーオブジェクトを作成
var loader = new Loader();
// マンガの取得
if((query["mode"] == "manga_big") && (query["page"])){
// 成功
loader.onload = function(str){
// ログイン時
var m = str.match(new RegExp("<body><img[^>]+src=\"([^\"]+)\"","i"));
if(m){
response({result:true,url:m[1],content_type:["image"]});
return;
}
// 非ログイン時
var m = str.match(new RegExp("pixiv\\.context\\.images\\[" + query["page"] + "\\] = '([^']+)';","i"));
if(m){
m = m[1].match("(.*)(_p[0-9]+\\.[a-z]+)$","i");
if(m){
response({result:true,url:m[1] + "_big" + m[2],content_type:["image"]});
return;
}
}
response({result:false});
};
}else{
// モードを medium に変更
var m = url.match(new RegExp("mode=([a-z]+)","i"));
if(m){
url = RegExp.leftContext + "mode=medium" + RegExp.rightContext;
}
// 成功
loader.onload = function(str){
var image_url;
// 高解像度画像
if(!image_url){
var m = str.match(new RegExp("<div class=\"(img-container|front-centered|works_display)\">.*","i"));
if(m){
m = m[0].match(new RegExp('<a[^>]+href="([^"]+)".*</a>',"i"));
if(m){
var link_url = m[1];
m = m[0].match(new RegExp('<img src="((http|https)://i[0-9]+\\.pixiv\\.net[^"]*)"',"i"));
if(m){
image_url = m[1];
// マンガ以外
if(link_url.indexOf("mode=manga") == -1){
// 2014/10/01 以前
var m = image_url.match(new RegExp("^(.*)_m(\\.[a-z]+)$","i"));
if(m){
image_url = m[1] + m[2];
}
// 2014/10/01 以降
var m = image_url.match(new RegExp("^(http://[^/]+/).*(/img/.*)_master1200(\\.[a-z]+)$","i"));
if(m){
var path = m[1] + "img-original" + m[2] + ".";
(function(){
var ext_list = [
"gif",
"png",
"jpg"
];
var success = function(url){
response({result:true,url:url,content_type:["image"]});
};
var failure = function(){
response({result:false});
};
var load = function(){
var ext = ext_list.pop();
if(!ext){
success(image_url);
return;
}
var url = path + ext;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(header){
var content_type = header["Content-Type"];
if(!content_type) content_type = "";
if(content_type.match("image")){
success(url);
}else{
load();
}
};
// 失敗
loader.onerror = function(){
load();
};
// レスポンスヘッダを読み込み
loader.setMethod("GET");
loader.setURL(url);
loader.loadResponseHeader();
};
load();
})();
return;
}
}
}
}
}
}
// うごイラ用 高解像度サムネイル
/*if(!image_url){
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"og:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1].replace(new RegExp("^(.*)_s\\.(.*)$"),"$1_master1200.jpg");
}
}*/
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
}
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(url);
loader.loadText();
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「直リンク(汎用)」「Miiverse」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkGeneric_Miiverse(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_url;
if(!image_url){
var m = str.match(new RegExp('<img[^>]+class[ \n\r\t]*=[ \n\r\t]*"[^"]*post-memo[^"]*"[^>]*>',"i"));
if(m){
m = m[0].match(new RegExp('<img[^>]+src[ \n\r\t]*=[ \n\r\t]*"([^"]+?)"',"i"));
if(m) image_url = m[1];
}
}
if(!image_url){
var m = str.match(new RegExp('<div[^>]+class[ \n\r\t]*=[ \n\r\t]*"[^"]*screenshot-container[^"]*"><img[^>]+>',"i"));
if(m){
m = m[0].match(new RegExp('<img[^>]+src[ \n\r\t]*=[ \n\r\t]*"([^"]+?)"',"i"));
if(m) image_url = m[1];
}
}
if(!image_url){
var m = str.match(new RegExp("<meta[^>]+?(property|name)[ \n\r\t]*=[ \n\r\t]*\"og:image\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) image_url = m[1];
}
}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return false;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「Google 画像検索」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_Google(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var r = new RegExp("^(http|https)://.*?\\.google\\.(at|be|ca|ch|de|es|fr|it|nl|no|pl|ru|se|co\\.(id|in|jp|th|uk|za)|com|com\\.(ar|au|br|mx|sa|tr|tw))/imgres[?].*","i");
if(url.match(r)){
// クエリを取得
var query = StringGetQuery(url);
if(query.imgurl){
response({result:true,url:unescape(unescape(query.imgurl)),content_type:["image"]});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「Yahoo Image Search」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_YahooImageSearch(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var r = new RegExp("(image|images)\\.search\\.yahoo\\.com/images/view;.*","i");
if(url.match(r)){
// クエリを取得
var query = StringGetQuery(url);
if(query.imgurl){
response({result:true,url:"http://" + unescape(query.imgurl),content_type:["image"]});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「Yahoo! JAPAN 画像検索」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_YahooJapan(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var r = new RegExp("^(http|https)://ord\\.yahoo\\.co\\.jp/o/image/.*/[*][-](.*)$","i");
if(url.match(r)){
response({result:true,url:decodeURIComponent(RegExp.$2),content_type:["image"]});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「Bing 画像検索」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_Bing(){
return "" +
"[\n\t" +
function (info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var r = new RegExp("^(http|https)://www\\.bing\\.com/images/search[?].*","i");
if(url.match(r)){
// 画像を取得
var images = ElementGetElementsByTagName(anchor_element,"img");
if(images.length){
var image_url;
try{
// クエリを取得
var query = StringGetQuery(images[0].src);
if(query.url){
image_url = unescape(query.url);
}
}catch(e){}
try{
// m 属性を取得
var span = anchor_element.parentNode.parentNode;
var m = span.getAttribute("m");
if(!m) m = span.getAttribute("_pageexpand_m");
if(m.match(new RegExp("imgurl:\"(.*?)\"","i"))){
image_url = RegExp.$1;
}
}catch(e){}
try{
// m 属性を取得
var m = anchor_element.getAttribute("m");
if(!m) m = span.getAttribute("_pageexpand_m");
if(m.match(new RegExp("oi:\"(.*?)\"","i"))){
image_url = RegExp.$1;
}
}catch(e){}
if(image_url){
response({result:true,url:image_url,content_type:["image"]});
return true;
}
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var anchor_element = info.anchor_element;
var div = anchor_element.parentNode;
if(div.className != "dg_u"){
return false;
}
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(str.match(new RegExp("<a[ ]+?id=\"m_fsi\"[ ]+?href=\"(.*?)\"","i"))){
response({result:true,url:RegExp.$1,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
return true;
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「Ask 画像検索」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_Ask(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// クエリを取得
var query = StringGetQuery(anchor_element.href);
if(query.ftURI){
query = StringGetQuery(decodeURIComponent(query.ftURI));
if(query.imagesrc){
response({result:true,url:unescape(decodeURIComponent(query.imagesrc)),content_type:["image"]});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「AOL 画像検索」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_Aol(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// クエリを取得
var query = StringGetQuery(anchor_element.href);
if(query.img){
response({result:true,url:unescape(query.img),content_type:["image"]});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「Yandex 画像検索」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_Yandex(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
var r = new RegExp("yandex\\.(com|ru)/images/search[?]","i");
if(url.match(r)){
// クエリを取得
var query = StringGetQuery(url);
if(query.img_url){
var image_url = decodeURIComponent(query.img_url);
if(image_url.indexOf("http") != 0){
image_url = "http://" + image_url;
}
response({result:true,url:image_url,content_type:["image"]});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「goo 画像検索」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_Goo(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// クエリを取得
var query = StringGetQuery(anchor_element.href);
if(query.DOC_ID){
response({result:true,url:"http://" + decodeURIComponent(query.DOC_ID).replace(/%2f/ig,"/"),content_type:["image"]});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「百度」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_Baidu(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// 画像を取得
var images = ElementGetElementsByTagName(anchor_element,"img");
if(images.length == 1){
var image = images[0];
var str = anchor_element.getAttribute("data-clickstr");
if(!str){
str = anchor_element.getAttribute("onclick");
}
if(str){
if(str.match(new RegExp("u:\'(.*?)\'","i"))){
if(RegExp.$1.indexOf("http") == 0){
response({result:true,url:RegExp.$1,content_type:["image"]});
return true;
}
}
}
var str = image.getAttribute("obj_url");
if(str){
response({result:true,url:str,content_type:["image"]});
return true;
}
var str = image.getAttribute("data-origin");
if(str){
try{
var uncompile = function (i) {
var g = {
w:"a",k:"b",v:"c","1":"d",j:"e",u:"f","2":"g",i:"h",t:"i","3":"j",
h:"k",s:"l","4":"m",g:"n","5":"o",r:"p",q:"q","6":"r",f:"s",p:"t",
"7":"u",e:"v",o:"w","8":"1",d:"2",n:"3","9":"4",c:"5",m:"6","0":"7",
b:"8",l:"9",a:"0","_z2C$q":":","_z&e3B":".",AzdH3F:"/"};
var e = /([a-w\d])/g;
var b = /(_z2C\$q|_z&e3B|AzdH3F)/g;
if (!i || i.indexOf("http") === 0) {
return i;
}
var h = i.replace(b, function (k, j) {
return g[j];
});
return h.replace(e, function (k, j) {
return g[j];
});
};
str = uncompile(str);
response({result:true,url:str,content_type:["image"]});
return true;
}catch(e){}
}
}
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「NAVER 画像検索」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_Naver(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// 画像を取得
var images = ElementGetElementsByTagName(anchor_element,"img");
if(images.length == 1){
var image = images[0];
if(image.src.match(new RegExp("search\\.naver\\.net/ugc[?]","i"))){
// クエリを取得
var query = StringGetQuery(image.src);
if(query.q){
response({result:true,url:query.q,content_type:["image"]});
return true;
}
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「イメージ検索用」「naver.jp」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkImageSearch_NaverJp(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// クエリを取得
var query = StringGetQuery(anchor_element.href);
if(query.q){
response({result:true,url:query.q,content_type:["image"]});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「ウィキペディア用」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkWikipedia(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var ext_list = [
"jpg",
"jpeg",
"png",
"gif",
"svg",
"ogg"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
if(anchor_element.href.match(new RegExp("^.*/.+:.+\\." + ext_list[i] + "($|&|[?])","i"))){
break;
}
}
if(i != num){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
// audio
if(str.match(new RegExp("<div[ ]class=\"fullImageLink\".*?<audio[ ].*?<source.*?src=\"(.*?)\"","i"))){
response({result:true,url:RegExp.$1});
return;
}
// svg
if(str.match(new RegExp("<div[ ]class=\"fullImageLink\".*?<a href=\".*?\\.svg\".*?<img.*?src=\"(.*?)\"","i"))){
response({result:true,url:RegExp.$1,content_type:["image"]});
return;
}
// 高解像度画像
if(str.match(new RegExp("<div[ ]class=\"fullImageLink\".*?<a href=\"(.*?)\"","i"))){
response({result:true,url:RegExp.$1,content_type:["image"]});
return;
}
response({result:false});
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(anchor_element.href);
loader.loadText();
}
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク置換定義「HTML 内の画像を検索」「最大バイトの画像」
// ------------------------------
function PresetScript_ReplacementToLink_DirectLinkFindImageInHTML_ImageOfTheLargestByte(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = anchor_element.href;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(header){
if((function(){
if(!header["Content-Type"]) return false;
if(!header["Content-Type"].match("text")) return false;
return true;
})()){
}else{
response({result:false});
}
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var image_link_list = new Array();
// ベース
var base;
var m = str.match(new RegExp("<base[^>]+href[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m) base = m[0];
// 画像要素
str.replace(new RegExp("<img[^>]+src[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","ig"),function (m,p1,index,str){
image_link_list.push(StringUrl_To_Absolute(p1,url,base));
});
// 画像直リンク
var re_image = new RegExp("\\.(bmp|gif|jpg|jpe|jpeg|png)([#?]|$)","i");
str.replace(new RegExp("<a[^>]+href[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","ig"),function (m,p1,index,str){
if(p1.match(re_image)){
image_link_list.push(StringUrl_To_Absolute(p1,url,base));
}
});
var image_list = new Array();
(function callee(){
var image_url = image_link_list.pop();
if(!image_url){
var byte_size_max = 0;
var image_item;
var i;
var num = image_list.length;
for(i=0;i<num;i++){
var item = image_list[i];
if(item.byte_size > byte_size_max){
byte_size_max = item.byte_size;
image_item = item;
}
}
if(image_item){
response({result:true,url:image_item.url,content_type:["image"]});
}else{
response({result:false});
}
return;
}
if(!image_url.match(new RegExp("^(http|https)://","i"))){
callee();
return;
}
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(header){
if((function(){
if(!header["Content-Type"]) return false;
if(!header["Content-Length"]) return false;
if(!header["Content-Type"].match("image")) return false;
return true;
})()){
image_list.push({
url:image_url,
byte_size:parseInt(header["Content-Length"])
});
}
callee();
};
// 失敗
loader.onerror = function(){
callee();
};
// レスポンスヘッダを読み込み
loader.setURL(image_url);
loader.loadResponseHeader();
})();
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(url);
loader.loadText();
};
// 失敗
loader.onerror = function(){
response({result:false});
};
// レスポンスヘッダを読み込み
loader.setURL(url);
loader.loadResponseHeader();
return true;
}.toString() +
",\n\n\t" +
function(info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク化定義「簡易」
// ------------------------------
function PresetScript_MakeLinkToText_Simple(){
return "" +
"[\n\t" +
function(info,response){
var text_node = info.text_node;
// 対応URIスキーム
var scheme_list = [
["https://","https://"],
["http://","http://"],
["ftp://","ftp://"]
];
// 辞書を作成
var i;
var num = scheme_list.length;
var str = "(";
var scheme_dictionary = new Object();
for(i=0;i<num;i++){
var scheme = scheme_list[i];
scheme_dictionary[scheme[0]] = scheme[1];
str += scheme[0];
if(i < num - 1){
str += "|";
}
}
str += ")";
var ignore_dictionary = {"WBR":1};
var inline_dictionary = {"SPAN":1,"FONT":1,"TT":1,"EM":1,"B":1,"S":1,"I":1,"BIG":1,"SMALL":1};
// 正規表現を作成
var char = "[-a-zA-Z0-9#%_.!~*';/?:@&=+$,]";
var search_regexp = new RegExp(str + "(" + char + "*)","ig");
var char_regexp = new RegExp("^(" + char + "*)","i");
var url_regexp = new RegExp("^(http|https|ftp)://(" + char + "{4,})$","");
var omit_regexp = new RegExp("\\.\\.\\.$","");
// テキストを取得
var base = DomNodeGetNodeValue(text_node);
var p = 0;
var b = 0;
var m;
var l1;
var l2;
var size = base.length;
base.replace(search_regexp, function(str,p1,p2,o,s){
p = o;
l1 = p1.length;
l2 = p2.length;
var url = scheme_dictionary[p1] + base.substr(p+l1,l2);
if(size > p + l1 + l2){
// 有効
if(url.match(url_regexp) && !url.match(omit_regexp)){
// 元のテキストノード
text_node.nodeValue = base.substring(b,p);
// アンカーを作成
var anchor_element = DocumentCreateElement('a');
anchor_element.href = url;
ElementSetTextContent(anchor_element,p1 + p2);
DomNode_InsertAfter(text_node,anchor_element);
p += l1 + l2;
b = p;
// 右側のテキストノードを作成
text_node = DocumentCreateText(base.substring(p));
DomNode_InsertAfter(anchor_element,text_node);
}
}else{
var nodes = new Array();
// 元のテキスト
var prev_text = base.substring(b,p);
// アンカーテキスト
nodes.push(DocumentCreateText(p1 + p2));
var next_node = text_node.nextSibling;
while(next_node){
if(next_node.nodeType == 1){
var result = false;
var tag_name = next_node.tagName;
// 無視するタグ
if(ignore_dictionary[tag_name]){
nodes.push(next_node);
result = true;
// テキストとして取得を試みるタグ
}else if(inline_dictionary[tag_name]){
var children = next_node.childNodes;
num = children.length;
for(i=0;i<num;i++){
var node = children[i];
if(node.nodeType == 3) continue;
if(node.nodeType == 1){
if(ignore_dictionary[node.tagName]){
continue;
}
}
break;
}
if(i >= num){
base = ElementGetTextContent(next_node);
m = base.match(char_regexp);
if(m){
if(!RegExp.rightContext){
url += base.substr(0,m[1].length);
nodes.push(next_node);
result = true;
}
}
}
}
if(!result){
break;
}
}else if(next_node.nodeType == 3){
base = DomNodeGetNodeValue(next_node);
m = base.match(char_regexp);
if(m){
url += base.substr(0,m[1].length);
if(RegExp.rightContext){
// 有効
if(url.match(url_regexp) && !url.match(omit_regexp)){
// 元のテキストノード
next_node.nodeValue = base.substr(0,m[1].length);
nodes.push(next_node);
// 右側のテキストノードを作成
var node = DocumentCreateText(base.substring(m[1].length));
DomNode_InsertAfter(next_node,node);
}
break;
}else{
nodes.push(next_node);
}
}
}
next_node = next_node.nextSibling;
}
// 有効
if(url.match(url_regexp) && !url.match(omit_regexp)){
// 元のテキストノード
text_node.nodeValue = prev_text;
// アンカーを作成
var anchor_element = DocumentCreateElement('a');
anchor_element.href = url;
DomNode_InsertAfter(text_node,anchor_element);
num = nodes.length;
for(i=0;i<num;i++){
if(nodes[i]){
anchor_element.appendChild(nodes[i]);
}
}
}
}
});
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ハイパーリンク化定義「詳細」
// ------------------------------
function PresetScript_MakeLinkToText_Detail(){
return "" +
"[\n\t" +
function(info,response){
var text_node = info.text_node;
// 対応URIスキーム
var scheme_list = [
["https://","https://"],
["http://","http://"],
["ttps://","https://"],
["ttp://","http://"],
["ftp://","ftp://"],
["tps://","https://"]
];
// 辞書を作成
var i;
var num = scheme_list.length;
var str = "(";
var scheme_dictionary = new Object();
for(i=0;i<num;i++){
var scheme = scheme_list[i];
scheme_dictionary[scheme[0]] = scheme[1];
str += scheme[0];
if(i < num - 1){
str += "|";
}
}
str += ")";
var ignore_dictionary = {"WBR":1};
var inline_dictionary = {"SPAN":1,"FONT":1,"TT":1,"EM":1,"B":1,"S":1,"I":1,"BIG":1,"SMALL":1};
// 正規表現を作成
var char = "[-a-zA-Z0-9#%_.!~*';/?:@&=+$,]";
var search_regexp = new RegExp(str + "(" + char + "*)","ig");
var char_regexp = new RegExp("^(" + char + "*)","i");
var url_regexp = new RegExp("^(http|https|ftp)://(" + char + "{4,})$","");
var omit_regexp = new RegExp("\\.\\.\\.$","");
// テキストを取得
var base = DomNodeGetNodeValue(text_node);
var half = StringConvertFromAlphabeticFullToAlphabeticHalf(base);
half = StringConvertFromNumericFullToNumericHalf(half);
half = StringConvertFromSignFullToSignHalf(half);
var p = 0;
var b = 0;
var m;
var l1;
var l2;
var size = half.length;
half.replace(search_regexp, function(str,p1,p2,o,s){
p = o;
l1 = p1.length;
l2 = p2.length;
var url = scheme_dictionary[p1] + half.substr(p+l1,l2);
if(size > p + l1 + l2){
// 有効
if(url.match(url_regexp) && !url.match(omit_regexp)){
// 元のテキストノード
text_node.nodeValue = base.substring(b,p);
// アンカーを作成
var anchor_element = DocumentCreateElement('a');
anchor_element.href = url;
ElementSetTextContent(anchor_element,base.substr(p,l1+l2));
DomNode_InsertAfter(text_node,anchor_element);
p += l1 + l2;
b = p;
// 右側のテキストノードを作成
text_node = DocumentCreateText(base.substring(p));
DomNode_InsertAfter(anchor_element,text_node);
}
}else{
var nodes = new Array();
// 元のテキスト
var prev_text = base.substring(b,p);
// アンカーテキスト
nodes.push(DocumentCreateText(base.substr(p,l1+l2)));
var next_node = text_node.nextSibling;
while(next_node){
if(next_node.nodeType == 1){
var result = false;
var tag_name = next_node.tagName;
// 無視するタグ
if(ignore_dictionary[tag_name]){
nodes.push(next_node);
result = true;
// テキストとして取得を試みるタグ
}else if(inline_dictionary[tag_name]){
var children = next_node.childNodes;
num = children.length;
for(i=0;i<num;i++){
var node = children[i];
if(node.nodeType == 3) continue;
if(node.nodeType == 1){
if(ignore_dictionary[node.tagName]){
continue;
}
}
break;
}
if(i >= num){
base = ElementGetTextContent(next_node);
half = StringConvertFromAlphabeticFullToAlphabeticHalf(base);
half = StringConvertFromNumericFullToNumericHalf(half);
half = StringConvertFromSignFullToSignHalf(half);
m = half.match(char_regexp);
if(m){
if(!RegExp.rightContext){
url += half.substr(0,m[1].length);
nodes.push(next_node);
result = true;
}
}
}
}
if(!result){
break;
}
}else if(next_node.nodeType == 3){
base = DomNodeGetNodeValue(next_node);
half = StringConvertFromAlphabeticFullToAlphabeticHalf(base);
half = StringConvertFromNumericFullToNumericHalf(half);
half = StringConvertFromSignFullToSignHalf(half);
m = half.match(char_regexp);
if(m){
url += half.substr(0,m[1].length);
if(RegExp.rightContext){
// 有効
if(url.match(url_regexp) && !url.match(omit_regexp)){
// 元のテキストノード
next_node.nodeValue = base.substr(0,m[1].length);
nodes.push(next_node);
// 右側のテキストノードを作成
var node = DocumentCreateText(base.substring(m[1].length));
DomNode_InsertAfter(next_node,node);
}
break;
}else{
nodes.push(next_node);
}
}
}
next_node = next_node.nextSibling;
}
// 有効
if(url.match(url_regexp) && !url.match(omit_regexp)){
// 元のテキストノード
text_node.nodeValue = prev_text;
// アンカーを作成
var anchor_element = DocumentCreateElement('a');
anchor_element.href = url;
DomNode_InsertAfter(text_node,anchor_element);
num = nodes.length;
for(i=0;i<num;i++){
if(nodes[i]){
anchor_element.appendChild(nodes[i]);
}
}
}
}
});
return false;
}.toString() +
",\n\n\t" +
function(info,response){
response({});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// テキスト展開定義「インライン表示」
// ------------------------------
function PresetScript_ExpandText_InlineScriptAllow_Inline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var parent = anchor_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合インライン表示しない
if(width < 50){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = info.url;
var ext_list = [
"txt"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// テキストの拡張子である場合、インライン表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// インライン表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// テキスト展開定義「インライン表示」
// ------------------------------
function PresetScript_ExpandText_InlineScriptInsert_Inline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var textarea = info.textarea_element;
var event_dispatcher = info.event_dispatcher;
var style = textarea.style;
// ピクセル値によるサイズ指定
var width = 400;
// スクロール補正
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeAttachElementBefore(textarea);
// 改行用
var div_prev = DocumentCreateElement("div");
var analyze_div_prev = new ElementAnalyzeManager(div_prev,true);
ElementSetStyle(div_prev,"height:0px;");
DomNode_InsertAfter(anchor_element,div_prev);
// テキストエリアを挿入
DomNode_InsertAfter(div_prev,textarea);
// 改行用
var div_next = DocumentCreateElement("div");
var analyze_div_next = new ElementAnalyzeManager(div_next,true);
ElementSetStyle(div_next,"height:0px;");
DomNode_InsertAfter(textarea,div_next);
// 高さを取得
var bounding_size = ElementGetBoundingClientRect(textarea);
var height = bounding_size.bottom - bounding_size.top;
// スタイルのサイズを取得
style.width = "0px";
style.height = "0px";
bounding_size = ElementGetBoundingClientRect(textarea);
var style_w = bounding_size.right - bounding_size.left;
var style_h = bounding_size.bottom - bounding_size.top;
// 親の幅を取得
var width_max = ElementGetClientWidth(textarea.parentNode);
// エレメントのサイズ
width -= style_w;
// 最大幅補正
var w = width_max - style_w;
if(w < width){
width = w;
}
// サイズをセット
style.width = width + "px";
style.height = (height - style_h) + "px";
// スクロール補正
revise_scroll.executeAttachElementAfter(textarea);
// 開放時に実行されるイベント
var event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(function (result){
if(analyze_div_prev){
analyze_div_prev.release();
analyze_div_prev = null;
}
if(analyze_div_next){
analyze_div_next.release();
analyze_div_next = null;
}
if(event_handler){
event_handler.release();
event_handler = null;
}
});
response();
return false;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「サムネイル挿入」
// ------------------------------
function PresetScript_ExpandImage_ThumbnailScriptInsert(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
var image = info.image_element;
var event_dispatcher = info.event_dispatcher;
var style = image.style;
var width;
var height;
// 開放時に実行される関数
function release(){
DomNodeRemove(image);
if(analyze_div_prev){
analyze_div_prev.release();
analyze_div_prev = null;
}
if(analyze_div_next){
analyze_div_next.release();
analyze_div_next = null;
}
if(event_handler){
event_handler.release();
event_handler = null;
}
}
// スクロール補正
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeAttachElementBefore(image);
// デフォルトの画像サイズを取得
var natural_size = ImageGetNaturalSize(image);
// サムネイルの最小サイズ
var width_min = 50;
var height_min = 50;
// サムネイルの最大サイズ
var width_max = 300;
var height_max = 300;
// ピクセル値によるサイズ指定
//width = 200;
//height = 200;
// パーセントによるサイズ指定
var percent = 20;
width = natural_size.width / 100 * percent;
height = natural_size.height / 100 * percent;
// 改行を作成
var div_prev = DocumentCreateElement("div");
var analyze_div_prev = new ElementAnalyzeManager(div_prev,true);
ElementSetStyle(div_prev,"height:0px;");
DomNode_InsertAfter(current_element,div_prev);
// イメージを挿入
DomNode_InsertAfter(div_prev,image);
// 改行を作成
var div_next = DocumentCreateElement("div");
var analyze_div_next = new ElementAnalyzeManager(div_next,true);
ElementSetStyle(div_next,"height:0px");
DomNode_InsertAfter(image,div_next);
// スタイルのサイズを取得
style.width = "0px";
style.height = "0px";
var bounding_size = ElementGetBoundingClientRect(image);
var style_w = bounding_size.right - bounding_size.left;
var style_h = bounding_size.bottom - bounding_size.top;
// 親の幅を取得
var parent_width = ElementGetClientWidth(image.parentNode);
if(width_max > parent_width) width_max = parent_width;
// エレメントのサイズ
width -= style_w;
height -= style_h;
// 最小幅補正
var w = width_min - style_w;
if(w > width){
height *= w / width;
width = w;
}
// 最小高補正
var h = height_min - style_h;
if(h > height){
width *= h / height;
height = h;
}
// 最大幅補正
w = width_max - style_w;
if(w < width){
height *= w / width;
width = w;
}
// 最大高補正
h = height_max - style_h;
if(h < height){
width *= h / height;
height = h;
}
// サイズをセット
style.width = width + "px";
style.height = height + "px";
// スクロール補正
revise_scroll.executeAttachElementAfter(image);
// クリック時に実行されるイベント
function click_func(e){
if(e.ctrlKey){
// Ctrl + クリックで等倍配置
style.width = natural_size.width + "px";
style.height = natural_size.height + "px";
}else{
release();
}
}
if(image.addEventListener){
image.addEventListener("click",click_func,true);
}else if(image.attachEvent){
image.attachEvent("onclick",click_func);
}
// 開放時に実行されるイベント
var event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(release);
response();
return false;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「ポップアップ表示(すべてのリンク)」
// ------------------------------
function PresetScript_ExpandImage_ThumbnailScriptAllow_PopupAll(){
return "" +
"[\n\t" +
function(info,response){
// サムネイル表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「ポップアップ表示(すべてのリンク)」
// ------------------------------
function PresetScript_ExpandImage_PopupScriptAllow_PopupAll(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、ポップアップ表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// ポップアップ表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「ポップアップ表示(画像を含むリンク)」
// ------------------------------
function PresetScript_ExpandImage_ThumbnailScriptAllow_PopupIncludeImage(){
return "" +
"[\n\t" +
function(info,response){
// サムネイル表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「ポップアップ表示(画像を含むリンク)」
// ------------------------------
function PresetScript_ExpandImage_PopupScriptAllow_PopupIncludeImage(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
var result = (function(){
// イメージ要素を含む
var nodes = ElementGetElementsByTagName(current_element,"img");
if(nodes.length){
return true;
}
// バックグラウンドイメージを含む
var nodes = ElementGetElementsByTagName(current_element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var style = ElementGetComputedStyle(nodes[i],null);
if(style){
if(style.backgroundImage != "none"){
return true;
}
}
}
return false;
})();
if(result) return false;
response({result:false});
return true;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、ポップアップ表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// ポップアップ表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「ポップアップ表示(アシスト要素のみ)」
// ------------------------------
function PresetScript_ExpandImage_ThumbnailScriptAllow_PopupImageInAnchor(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
if(current_element.tagName == "A"){
response({result:false});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var parent = current_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合サムネイル化しない
if(width < 50){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、サムネイル表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// サムネイル表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「ポップアップ表示(アシスト要素のみ)」
// ------------------------------
function PresetScript_ExpandImage_PopupScriptAllow_PopupImageInAnchor(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
if(current_element.tagName == "A"){
response({result:false});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、ポップアップ表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// ポップアップ表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「サムネイル表示(すべてのリンク)」
// ------------------------------
function PresetScript_ExpandImage_ThumbnailScriptAllow_ThumbnailAll(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
var parent = current_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合サムネイル化しない
if(width < 50){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、サムネイル表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// サムネイル表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「サムネイル表示(すべてのリンク)」
// ------------------------------
function PresetScript_ExpandImage_PopupScriptAllow_ThumbnailAll(){
return "" +
"[\n\t" +
function(info,response){
// ポップアップ表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「サムネイル表示(画像を含まないリンク)」
// ------------------------------
function PresetScript_ExpandImage_ThumbnailScriptAllow_ThumbnailNotIncludeImage(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
var parent = current_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合サムネイル化しない
if(width < 50){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var result = (function(){
// イメージ要素を含む
var nodes = ElementGetElementsByTagName(current_element,"img");
if(nodes.length){
return false;
}
// バックグラウンドイメージを含む
var nodes = ElementGetElementsByTagName(current_element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var style = ElementGetComputedStyle(nodes[i],null);
if(style){
if(style.backgroundImage != "none"){
return false;
}
}
}
// 子が無い
if(!(current_element.childNodes.length)){
return false;
}
return true;
})();
if(!result){
response({result:false});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、サムネイル表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// サムネイル表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「サムネイル表示(画像を含まないリンク)」
// ------------------------------
function PresetScript_ExpandImage_PopupScriptAllow_ThumbnailNotIncludeImage(){
return "" +
"[\n\t" +
function(info,response){
// ポップアップ表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「画像掲示板用」
// ------------------------------
function PresetScript_ExpandImage_ThumbnailScriptAllow_ImageBbs(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// 本文中のみ許可
var node = anchor_element.parentNode;
if(node){
if(node.tagName == "BLOCKQUOTE"){
return false;
}
if(node.className == "body"){
return false;
}
}
response({result:false});
return true;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var parent = anchor_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合サムネイル化しない
if(width < 50){
response({result:false});
return true;
}
}
// 子にイメージが含まれる場合サムネイル化しない
var nodes = ElementGetElementsByTagName(anchor_element,"img");
if(nodes.length > 0){
response({result:false});
return true;
}
// 子が無い
var nodes = anchor_element.childNodes;
if(nodes.length == 0){
response({result:false});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、サムネイル表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// サムネイル表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「画像掲示板用」
// ------------------------------
function PresetScript_ExpandImage_PopupScriptAllow_ImageBbs(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
// イメージが1つだけ含まれる場合許可
var nodes = ElementGetElementsByTagName(anchor_element,"IMG");
if(nodes.length == 1){
var node = nodes[0];
// 拡張ボタンは除外
if(node.className == "extButton"){
}else{
return false;
}
}
response({result:false});
return true;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、ポップアップ表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// ポップアップ表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「ツイッター用」
// ------------------------------
function PresetScript_ExpandImage_ThumbnailScriptAllow_Twitter(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var result = (function(){
var node = current_element.parentNode;
if(!node) return false;
if(node.tagName != "P") return false;
var m = node.className.match(new RegExp("(^| )tweet-text( |$)","i"));
if(!m) return false;
var anchor_count = 0;
var nodes = ElementGetElementsByTagName(node,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
if(nodes[i].getAttribute("data-expanded-url")){
anchor_count ++;
if(anchor_count > 1) return true;
}
}
node = node.nextSibling;
while(node){
if(node.nodeType == 1){
var m = node.className.match(new RegExp("(^| )(cards-media-container|permalink-footer)( |$)","i"));
if(m){
var nodes = ElementGetElementsByTagName(node,"img");
if(nodes.length){
return false;
}
}
}
node = node.nextSibling;
}
return true;
})();
if(result) return false;
response({result:false});
return true;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var parent = current_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合サムネイル化しない
if(width < 50){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var result = (function(){
// イメージ要素を含む
var nodes = ElementGetElementsByTagName(current_element,"img");
if(nodes.length){
return false;
}
// バックグラウンドイメージを含む
var nodes = ElementGetElementsByTagName(current_element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var style = ElementGetComputedStyle(nodes[i],null);
if(style){
if(style.backgroundImage != "none"){
return false;
}
}
}
// 子が無い
if(!(current_element.childNodes.length)){
return false;
}
return true;
})();
if(!result){
response({result:false});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、サムネイル表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// サムネイル表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// イメージ展開定義「ツイッター用」
// ------------------------------
function PresetScript_ExpandImage_PopupScriptAllow_Twitter(){
return "" +
"[\n\t" +
function(info,response){
var current_element = info.current_element;
var result = (function(){
var node = current_element.parentNode;
while(node){
if(!(node.className)) break;
var m = node.className.match(new RegExp("(^| )stream-media-grid-items( |$)","i"));
if(m){
return true;
}
// イメージ要素を含む
var nodes = ElementGetElementsByTagName(current_element,"img");
if(nodes.length){
return true;
}
// バックグラウンドイメージを含む
var nodes = ElementGetElementsByTagName(current_element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var style = ElementGetComputedStyle(nodes[i],null);
if(style){
if(style.backgroundImage != "none"){
return true;
}
}
}
node = node.parentNode;
}
return false;
})();
if(result){
return false;
}
response({result:false});
return true;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var url = info.url;
var ext_list = [
"bmp",
"gif",
"jpg",
"jpe",
"jpeg",
"png"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が画像の拡張子である場合、ポップアップ表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var current_element = info.current_element;
var content_type = info.content_type;
// コンテンツタイプに "image" が含まれる
if(content_type.join(",").match(/image/i)){
response({result:true});
return true;
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// ポップアップ表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// サウンド展開定義「インライン表示」
// ------------------------------
function PresetScript_ExpandSound_InlineScriptAllow_Inline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var parent = anchor_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合インライン表示しない
if(width < 150){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// インライン表示する
response({result:true});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// サウンド展開定義「インライン表示」
// ------------------------------
function PresetScript_ExpandSound_InlineScriptInsert_Inline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var audio = info.element;
var event_dispatcher = info.event_dispatcher;
var style = audio.style;
var width;
var height;
// スクロール補正
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeAttachElementBefore(audio);
// 改行用
var div_prev = DocumentCreateElement("div");
var analyze_div_prev = new ElementAnalyzeManager(div_prev,true);
ElementSetStyle(div_prev,"height:0px;");
DomNode_InsertAfter(anchor_element,div_prev);
// オーディオを挿入
DomNode_InsertAfter(div_prev,audio);
// 改行用
var div_next = DocumentCreateElement("div");
var analyze_div_next = new ElementAnalyzeManager(div_next,true);
ElementSetStyle(div_next,"height:0px;");
DomNode_InsertAfter(audio,div_next);
// サイズを取得
var bounding_size = ElementGetBoundingClientRect(audio);
var width = bounding_size.right - bounding_size.left;
var height = bounding_size.bottom - bounding_size.top;
// スタイルのサイズを取得
style.width = "0px";
style.height = "0px";
bounding_size = ElementGetBoundingClientRect(audio);
var style_w = bounding_size.right - bounding_size.left;
var style_h = bounding_size.bottom - bounding_size.top;
// 親の幅を取得
var width_max = ElementGetClientWidth(audio.parentNode);
// エレメントのサイズ
width -= style_w;
height -= style_h;
// 最大幅補正
var w = width_max - style_w;
if(w < width){
width = w;
}
// サイズをセット
style.width = width + "px";
style.height = height + "px";
// スクロール補正
revise_scroll.executeAttachElementAfter(audio);
// 開放時に実行されるイベント
var event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(function (result){
if(analyze_div_prev){
analyze_div_prev.release();
analyze_div_prev = null;
}
if(analyze_div_next){
analyze_div_next.release();
analyze_div_next = null;
}
if(event_handler){
event_handler.release();
event_handler = null;
}
});
response();
return false;
}.toString() +
"\n]";
}
// ------------------------------
// サウンド展開定義「インライン表示」
// ------------------------------
function PresetScript_ExpandSound_AudioElementScriptAllow_Inline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = info.url;
var ext_list = [
"mp3",
"wav",
"ogg",
"m4a",
"aac",
"midi",
"mid"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL がサウンドの拡張子である場合、インライン表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// インライン表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ビデオ展開定義「インライン表示」
// ------------------------------
function PresetScript_ExpandVideo_InlineScriptAllow_Inline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var parent = anchor_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合インライン表示しない
if(width < 150){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// インライン表示する
response({result:true});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// ビデオ展開定義「インライン表示」
// ------------------------------
function PresetScript_ExpandVideo_InlineScriptInsert_Inline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var video = info.element;
var event_dispatcher = info.event_dispatcher;
var style = video.style;
var width;
var height;
// スクロール補正
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeAttachElementBefore(video);
// 改行用
var div_prev = DocumentCreateElement("div");
var analyze_div_prev = new ElementAnalyzeManager(div_prev,true);
ElementSetStyle(div_prev,"height:0px;");
DomNode_InsertAfter(anchor_element,div_prev);
// ビデオを挿入
DomNode_InsertAfter(div_prev,video);
// 改行用
var div_next = DocumentCreateElement("div");
var analyze_div_next = new ElementAnalyzeManager(div_next,true);
ElementSetStyle(div_next,"height:0px;");
DomNode_InsertAfter(video,div_next);
// サイズを取得
var bounding_size = ElementGetBoundingClientRect(video);
var width = bounding_size.right - bounding_size.left;
var height = bounding_size.bottom - bounding_size.top;
// スタイルのサイズを取得
style.width = "0px";
style.height = "0px";
bounding_size = ElementGetBoundingClientRect(video);
var style_w = bounding_size.right - bounding_size.left;
var style_h = bounding_size.bottom - bounding_size.top;
// 親の幅を取得
var width_max = ElementGetClientWidth(video.parentNode);
// エレメントのサイズ
width -= style_w;
height -= style_h;
// 最大幅補正
var w = width_max - style_w;
if(w < width){
height *= w / width;
width = w;
}
// サイズをセット
style.width = width + "px";
style.height = height + "px";
// スクロール補正
revise_scroll.executeAttachElementAfter(video);
// 開放時に実行されるイベント
var event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(function (result){
if(analyze_div_prev){
analyze_div_prev.release();
analyze_div_prev = null;
}
if(analyze_div_next){
analyze_div_next.release();
analyze_div_next = null;
}
if(event_handler){
event_handler.release();
event_handler = null;
}
});
response();
return false;
}.toString() +
"\n]";
}
// ------------------------------
// ビデオ展開定義「インライン表示」
// ------------------------------
function PresetScript_ExpandVideo_VideoElementScriptAllow_Inline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = info.url;
var ext_list = [
"mp4",
"webm",
"avi",
"m4v",
"ogv",
"mpg",
"mpeg"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// URL が動画の拡張子である場合、インライン表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// インライン表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// インラインフレーム展開定義「PDF のインライン表示」
// ------------------------------
function PresetScript_ExpandIframe_InlineScriptAllow_ExpandPdfInline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var parent = anchor_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合インライン表示しない
if(width < 50){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = info.url;
var ext_list = [
"pdf"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// PDF の拡張子である場合、インライン表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// インライン表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// インラインフレーム展開定義「PDF のインライン表示」
// ------------------------------
function PresetScript_ExpandIframe_InlineScriptInsert_ExpandPdfInline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var iframe = info.iframe_element;
var event_dispatcher = info.event_dispatcher;
// ピクセル値によるサイズ指定
var width = 597;
var height = 844;
// スクロール補正
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeAttachElementBefore(iframe);
// 改行を作成
var div_prev = DocumentCreateElement("div");
var analyze_div_prev = new ElementAnalyzeManager(div_prev,true);
ElementSetStyle(div_prev,"height:0px;");
DomNode_InsertAfter(anchor_element,div_prev);
// iframe を挿入
DomNode_InsertAfter(div_prev,iframe);
// 改行を作成
var div_next = DocumentCreateElement("div");
var analyze_div_next = new ElementAnalyzeManager(div_next,true);
ElementSetStyle(div_next,"height:0px");
DomNode_InsertAfter(iframe,div_next);
// スタイルのサイズを取得
iframe.style.width = "0px";
iframe.style.height = "0px";
var bounding_size = ElementGetBoundingClientRect(iframe);
var style_w = bounding_size.right - bounding_size.left;
var style_h = bounding_size.bottom - bounding_size.top;
// 親の幅を取得
var width_max = ElementGetClientWidth(iframe.parentNode);
// エレメントのサイズ
width -= style_w;
height -= style_h;
// 最大幅補正
var w = width_max - style_w;
if(w < width){
width = w;
}
// サイズをセット
iframe.style.width = width + "px";
iframe.style.height = height + "px";
// スクロール補正
revise_scroll.executeAttachElementAfter(iframe);
// 開放時に実行されるイベント
var event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(function (result){
if(analyze_div_prev){
analyze_div_prev.release();
analyze_div_prev = null;
}
if(analyze_div_next){
analyze_div_next.release();
analyze_div_next = null;
}
if(event_handler){
event_handler.release();
event_handler = null;
}
});
response();
return false;
}.toString() +
"\n]";
}
// ------------------------------
// インラインフレーム展開定義「Flash のインライン表示」
// ------------------------------
function PresetScript_ExpandIframe_InlineScriptAllow_ExpandFlashInline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var parent = anchor_element.parentNode;
if(parent){
var width = ElementGetClientWidth(parent);
// 親の幅が小さすぎる場合インライン表示しない
if(width < 50){
response({result:false});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var url = info.url;
var ext_list = [
"swf"
];
var i;
var num = ext_list.length;
for(i=0;i<num;i++){
// Flash の拡張子である場合、インライン表示を試みる
if(url.match(new RegExp("^.*/.+\\." + ext_list[i] + "($|[#?:].*$)","i"))){
response({result:true});
return true;
}
}
return false;
}.toString() +
",\n\n\t" +
function(info,response){
// インライン表示しない
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// インラインフレーム展開定義「Flash のインライン表示」
// ------------------------------
function PresetScript_ExpandIframe_InlineScriptInsert_ExpandFlashInline(){
return "" +
"[\n\t" +
function(info,response){
var anchor_element = info.anchor_element;
var iframe = info.iframe_element;
var event_dispatcher = info.event_dispatcher;
// ピクセル値によるサイズ指定
var width = 640;
var height = 480;
// スクロール補正
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeAttachElementBefore(iframe);
// div_dummy を作成
var div_dummy = DocumentCreateElement("div");
var analyze_div_dummy = new ElementAnalyzeManager(div_dummy,true);
ElementSetStyle(div_dummy,ElementGetStyle(iframe));
DomNode_InsertAfter(anchor_element,div_dummy);
// 改行を作成
var div_prev = DocumentCreateElement("div");
var analyze_div_prev = new ElementAnalyzeManager(div_prev,true);
ElementSetStyle(div_prev,"height:0px;");
DomNode_InsertAfter(anchor_element,div_prev);
// div を挿入
DomNode_InsertAfter(div_prev,div_dummy);
// 改行を作成
var div_next = DocumentCreateElement("div");
var analyze_div_next = new ElementAnalyzeManager(div_next,true);
ElementSetStyle(div_next,"height:0px");
DomNode_InsertAfter(div_dummy,div_next);
// スタイルのサイズを取得
div_dummy.style.width = "0px";
div_dummy.style.height = "0px";
var bounding_size = ElementGetBoundingClientRect(div_dummy);
var style_w = bounding_size.right - bounding_size.left;
var style_h = bounding_size.bottom - bounding_size.top;
// 親の幅を取得
var width_max = ElementGetClientWidth(div_dummy.parentNode);
// エレメントのサイズ
width -= style_w;
height -= style_h;
// 最大幅補正
var w = width_max - style_w;
if(w < width){
height *= w / width;
width = w;
}
// サイズをセット
div_dummy.style.width = width + "px";
div_dummy.style.height = height + "px";
iframe.style.width = width + "px";
iframe.style.height = height + "px";
// スクロール補正
revise_scroll.executeAttachElementAfter(iframe);
// クリック時に実行されるイベント
function click_func(e){
// iframe を挿入
DomNode_InsertAfter(div_dummy,iframe);
// div_dummy を解放
if(analyze_div_dummy){
analyze_div_dummy.release();
analyze_div_dummy = null;
}
}
if(div_dummy.addEventListener){
div_dummy.addEventListener("click",click_func,true);
}else if(div_dummy.attachEvent){
div_dummy.attachEvent("onclick",click_func);
}
// 開放時に実行されるイベント
var event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(function (result){
if(analyze_div_dummy){
analyze_div_dummy.release();
analyze_div_dummy = null;
}
if(analyze_div_prev){
analyze_div_prev.release();
analyze_div_prev = null;
}
if(analyze_div_next){
analyze_div_next.release();
analyze_div_next = null;
}
if(event_handler){
event_handler.release();
event_handler = null;
}
});
response();
return false;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「初期化」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
response({result:true});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「ニコニコ大百科」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize_NicovideoDictionary(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
// ------------------------------
// 基本URL抽出
// ------------------------------
var url = document.URL;
var bbs_list = [
{url:"(http://dic\\.nicovideo\\.jp/b/(a|c|i|l|u|v)/[^/#?]+)",replace:"$1/",name:"nicopedia"},
{url:"(http://dic\\.nicovideo\\.jp)/(a|c|i|l|u|v)/([^/#?]+)",replace:"$1/b/$2/$3/",name:"nicopedia"}
];
var i;
var num = bbs_list.length;
for(i=0;i<num;i++){
var bbs = bbs_list[i];
var re = new RegExp(bbs.url,"i");
var m = url.match(re);
if(m){
work.base_url = m[0].replace(re,bbs.replace);
work.bbs_name = bbs.name;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var work = info.work;
if(!(work.bbs_name)){
return false;
}
var load_separate = 1000;
var load_dose = 30;
var load_offset = 1;
var first_id = 1;
var last_id = 1;
var load_shadow_id = 1;
var load_more_id = 1;
var dictionary_id = new Array();
var element_parent = null;
var read_more_button = null;
var element_form = null;
var base_url = work.base_url;
var resource_url_shadow = base_url;
var resource_url_more = base_url;
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
work.createResponseAnchorNumbers = function (str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 0x7fffffff) min = 0x7fffffff;
if(max > 0x7fffffff) max = 0x7fffffff;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
if(max - min > 10000) max = min + 10000;
p += m[0].length;
numbers.addNumbers(min,max);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
};
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor = function (target){
if(BbsControlResponseAnchorExist(target)) return;
var re_simple = new RegExp("^(>>|<<|>)[-,0-90-9]+$","i");
var re_detail = new RegExp("(>>|<<|>>|<<|>|>|》|≫|>>)(([0-90-9]+[-][0-90-9]+|[0-90-9]+),)*([0-90-9]+[-][0-90-9]+|[0-90-9]+)","i");
var re_range = new RegExp("([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("([0-90-9]+)","i");
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(re_simple);
if(m){
var text_node = DocumentCreateText(m[0]);
DomNode_InsertBefore(node,text_node);
DomNodeRemove(node);
}
}
// テキストノードを統合
target.normalize();
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(re_detail);
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var element = DocumentCreateElement("a");
ElementSetTextContent(element,m[0]);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element,node);
var query = "";
m = ElementGetTextContent(element).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 0x7fffffff) min = 0x7fffffff;
if(max > 0x7fffffff) max = 0x7fffffff;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
query = min;
}else{
// 番号
m = ElementGetTextContent(element).match(re_number);
if(m){
query = parseInt(StringConvertFromNumericFullToNumericHalf(m[0]));
if(query < 1) query = 1;
if(query > 0x7fffffff) query = 0x7fffffff;
}
}
element.href = work.base_url + (Math.floor(query / 30) * 30 + 1) + "-#" + query;
}
}
}
};
// ------------------------------
// 継ぎ足し読み込み
// ------------------------------
function readMore(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("<a name=\"([0-9]+)\"","i");
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<dt class=\"reshead\">",p);
if(p < 0) throw 0;
var e = str.indexOf("</dd>",p);
if(e >= 0) e += 5;
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if(last_id < id){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var nodes = StringHtmlCreateDomNodesSafe(s);
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
last_id = id;
resource_url_more = base_url + (last_id) + "-";
}
}
if(p < e){
p = e;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
var reload = false;
(function(){
if(((last_id + 1) % load_dose) != load_offset){
return;
}
var p = Math.floor(load_more_id / load_dose);
var n = Math.floor(last_id / load_dose);
if(p >= n){
return;
}
var p = Math.floor(load_more_id / load_separate);
var n = Math.floor(last_id / load_separate);
if(p < n){
return;
}
reload = true;
})();
var next_id = Math.floor(last_id / load_dose) * load_dose + load_offset;
resource_url_more = base_url + next_id + "-";
if(reload){
readMore();
}else{
read_more_button.init();
}
}
load_more_id = last_id;
execute_queue.attachFirst(f,null);
};
// 失敗
loader.onerror = function(){
read_more_button.init();
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_more);
loader.loadText();
}
// ------------------------------
// レスポンス親要素
// ------------------------------
(function(){
var element_bbs = document.getElementById("bbs");
if(element_bbs){
var i;
var nodes = ElementGetElementsByTagName(element_bbs,"dl");
var num = nodes.length;
for(i=0;i<num;i++){
element_parent = nodes[i];
break;
}
}
})();
if(!element_parent) return false;
// ------------------------------
// 最後尾 ID
// ------------------------------
var nodes = ElementGetElementsByTagName(element_parent,"dt");
var i;
var node_num = nodes.length;
for(i=0;i<node_num;i++){
var node = nodes[i];
var m = ElementGetTextContent(node).match(new RegExp("([0-9]+)[ ]","i"));
if(m){
first_id = parseInt(m[1]);
dictionary_id[first_id] = true;
if(first_id != 1){
break;
}
}
}
for(i=node_num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(new RegExp("([0-9]+)[ ]","i"));
if(m){
last_id = parseInt(m[1]);
dictionary_id[last_id] = true;
break;
}
}
// ------------------------------
// アクセス先 URL
// ------------------------------
var next_id = Math.floor(last_id / load_dose) * load_dose + load_offset;
resource_url_shadow = base_url + "1-";
resource_url_more = base_url + next_id + "-";
// ------------------------------
// BbsControlReadMoreButton 作成
// ------------------------------
read_more_button = new BbsControlReadMoreButton();
read_more_button.setWaitTime(2 * 1000);
read_more_button.onclick = readMore;
DomNode_InsertAfter(element_parent,read_more_button.getElement());
// ------------------------------
// シャドウロード
// ------------------------------
function loadShadow(){
var load_shadow_last_id = load_shadow_id;
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("<a name=\"([0-9]+)\"","i");
var re_id = new RegExp("ID:[ ]([a-zA-Z0-9+/.]{8,10})","i");
var re_name = new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i");
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<dt class=\"reshead\">",p);
if(p < 0) throw 0;
var e = str.indexOf("</dd>",p);
if(e >= 0) e += 5;
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = load_shadow_last_id = parseInt(m[1]);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var nodes = StringHtmlCreateDomNodesSafe(s);
var dt = nodes[0];
var dd = nodes[2];
try{
if(dt.tagName != "DT") throw 0;
if(dd.tagName != "DD") throw 0;
}catch(e){
throw 0;
}
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
if(dt_text.match(re_id)){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(re_name)){
response.setName(RegExp.$1);
}
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
if(p < e){
p = e;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
var reload = false;
(function(){
if(((load_shadow_last_id + 1) % load_dose) != load_offset){
return;
}
var p = Math.floor(load_shadow_id / load_dose);
var n = Math.floor(load_shadow_last_id / load_dose);
if(p >= n){
return;
}
if(load_shadow_last_id > first_id){
return;
}
reload = true;
})();
var next_id = Math.floor(load_shadow_last_id / load_dose) * load_dose + load_offset;
resource_url_shadow = base_url + next_id + "-";
if(reload){
load_shadow_id = load_shadow_last_id;
loadShadow();
}
}
execute_queue.attachFirst(f,null);
};
// 失敗
loader.onerror = function(){
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_shadow);
loader.loadText();
}
loadShadow();
response({result:true});
return true;
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「ニコニコ大百科」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_NicovideoDictionary(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var work = info.work;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:[ ]([a-zA-Z0-9+/.]{8,10})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
var nodes = ElementGetElementsByTagName(target,"br");
if(nodes.length){
DomNode_InsertBefore(nodes[0],element_follower);
}else{
target.appendChild(element_follower);
}
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.dt){
forResponseAnchor(node.dt);
forId(node.dt);
forName(node.dt);
forFollower(node.dt);
}
if(node.dd){
forResponseAnchor(node.dd);
forId(node.dd);
forName(node.dd);
}
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var dt = element;
var dd;
try{
if(dt.tagName != "DT") return false;
}catch(e){
return false;
}
dd = dt.nextSibling;
try{
dd = dd.nextSibling;
if(dd.tagName != "DD") return false;
}catch(e){
return false;
}
try{
var dl = dt.parentNode;
if(dl.tagName != "DL") return false;
var div = dl.parentNode;
if(div.tagName != "DIV") return false;
if(div.className != "content") return false;
}catch(e){
return false;
}
// document に未登録
if(!DomNodeGetAttachedDocument(dt)) return false;
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor(dd);
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanup(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:[ ]([a-zA-Z0-9+/.]{8,10})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(◆[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
return null;
});
}
if(dt){
cleanup(dt);
}
if(dd){
cleanup(dd);
}
})();
// ナンバーを取得
var dt_text = ElementGetTextContent(dt);
if(!(dt_text.match(new RegExp("([0-9]+)[ ]","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
// IDの取得
if(dt_text.match(new RegExp("ID:[ ]([a-zA-Z0-9+/.]{8,10})","i"))){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i"))){
response.setName(RegExp.$1);
}
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
// オリジナルエレメントを外す
var i;
var num = original.length;
for(i=0;i<num;i++){
var revise_scroll = new DocumentReviseScroll();
var node = original[i].element;
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
};
response.setAnalyzed();
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
dt:dt,
dd:dd,
parent:dt.parentNode
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「8chan.co」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_8chan(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = StringCreateResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
_window.className = "post reply";
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var container = DocumentCreateElement("table");
container.style.margin = "0px 0px 20px";
_window.appendChild(container);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
container.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
// 名前欄
if(node.tagName == "SPAN"){
if(node.className == "poster_id"){
var m = ElementGetTextContent(node).match(new RegExp("^([a-zA-Z0-9+/.]{6,8})$","i"));
if(m){
// BbsControlId を生成
var control_id = new BbsControlId(node,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
DomNode_InsertAfter(node,element_id);
}
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:(|[ ])([a-zA-Z0-9+/.]{6,8})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[2]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count > 1){
StyleDeclarationSetProperty(style,"margin-right","5px");
}else{
StyleDeclarationRemoveProperty(style,"margin-right");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
_window.className = "post reply";
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var container = DocumentCreateElement("table");
container.style.margin = "0px 0px 20px";
_window.appendChild(container);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
container.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(!|!!)([a-zA-Z0-9+/.]{10})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
_window.className = "post reply";
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var container = DocumentCreateElement("table");
container.style.margin = "0px 0px 20px";
_window.appendChild(container);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
container.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
target.appendChild(element_follower);
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
_window.className = "post reply";
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var container = DocumentCreateElement("table");
container.style.margin = "0px 0px 20px";
_window.appendChild(container);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
container.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.post_intro){
forResponseAnchor(node.post_intro);
forId(node.post_intro);
forName(node.post_intro);
forFollower(node.post_intro);
}
if(node.post_body){
forResponseAnchor(node.post_body);
forId(node.post_body);
forName(node.post_body);
}
}
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
function StringCreateResponseAnchorNumbers(str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 0x7fffffff) min = 0x7fffffff;
if(max > 0x7fffffff) max = 0x7fffffff;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
if(max - min > 10000) max = min + 10000;
p += m[0].length;
numbers.addNumbers(min,max);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var post_container = element;
var post_intro;
var post_files;
var post_body;
try{
if(post_container.tagName != "DIV") return false;
if(!(post_container.className.match(new RegExp("^post","i")))) return false;
}catch(e){
return false;
}
try{
var node = post_container.previousSibling.previousSibling;
if(node.tagName == "DIV"){
if(node.className == "files"){
post_files = node;
}
}
}catch(e){
}
try{
var nodes = post_container.childNodes;
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
switch(node.className){
case "intro":
post_intro = node;
break;
case "files":
post_files = node;
break;
case "body":
post_body = node;
break;
}
}
}catch(e){
}
try{
if(!post_intro) return false;
if(!post_body) return false;
}catch(e){
}
// document に未登録
if(!DomNodeGetAttachedDocument(post_intro)) return false;
// ポップアップを除外
var board = false;
var node = post_intro;
while(node){
if(node.id.match(new RegExp("^thread","i"))){
board = true;
break;
}
node = node.parentNode;
}
if(!board) return false;
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanupInfo(target){
var nodes = ElementGetElementsByTagName(post_intro,"span");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
if(node.className == "postertrip"){
// トリップ
var m = ElementGetTextContent(element).match(new RegExp("(!|!!)([a-zA-Z0-9+/.]{10})","i"));
if(m){
ElementSetTextContent(node,m[0]);
}
break;
}
}
}
function cleanupMessage(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:(|[ ])([a-zA-Z0-9+/.]{6,8})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(!|!!)([a-zA-Z0-9+/.]{10})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
return null;
});
}
function cleanupAnchor(target){
var p;
var n;
var q;
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(node.tagName == "A"){
var clone = node.cloneNode(true);
DomNode_InsertAfter(node,clone);
DomNodeRemove(node);
}else{
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
}
}
}
function removeResponseAnchor(target){
var re_search = new RegExp("^(>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var p;
var n;
var q;
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(node.tagName == "A"){
var text = ElementGetTextContent(node);
if(text.match(re_search)){
DomNodeRemove(node);
}
}else{
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
}
}
}
if(post_intro){
cleanupInfo(post_intro);
removeResponseAnchor(post_intro);
}
if(post_body){
cleanupMessage(post_body);
cleanupAnchor(post_body);
}
})();
// ナンバーを取得
var info_text = ElementGetTextContent(post_intro);
if(!(info_text.match(new RegExp("No\\.([0-9]+)","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
// IDの取得
if(info_text.match(new RegExp("ID:(|[ ])([a-zA-Z0-9+/.]+)","i"))){
response.setId(RegExp.$2);
}
// 名前の取得
(function(){
var nodes = ElementGetElementsByTagName(post_intro,"span");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
if(node.className == "trip"){
response.setName(ElementGetTextContent(node));
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(post_body,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = StringCreateResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(post_intro) response.addOriginalElements("post_intro",post_intro);
if(post_files) response.addOriginalElements("post_files",post_files);
if(post_body) response.addOriginalElements("post_body",post_body);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
if(original.length){
var node = original[0].element;
while(node){
if(node.className.match(new RegExp("^post","i"))){
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeRemoveElementBefore(node);
node.style.display = "none";
revise_scroll.executeRemoveElementAfter(node);
break;
}
node = node.parentNode;
}
}
};
response.setAnalyzed();
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
post_intro:post_intro,
post_body:post_body,
parent:document.body
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「4chan.org」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_4chan(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = StringCreateResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
_window.className = "reply";
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var container = DocumentCreateElement("table");
container.style.margin = "0px 0px 10px";
_window.appendChild(container);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
container.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
// 名前欄
if(node.tagName == "SPAN"){
if(node.className == "hand"){
var m = ElementGetTextContent(node).match(new RegExp("^([a-zA-Z0-9+/.]{8})$","i"));
if(m){
// BbsControlId を生成
var control_id = new BbsControlId(null,true);
control_id.setId(m[1]);
var element_id = control_id.getElement();
DomNode_InsertAfter(node,element_id);
}
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:(|[ ])([a-zA-Z0-9+/.]{8})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[2]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"[" + count + "]");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count > 1){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 4px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
_window.className = "reply";
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var container = DocumentCreateElement("table");
container.style.margin = "0px 0px 10px";
_window.appendChild(container);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
container.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(!|!!)([a-zA-Z0-9+/.]{10})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
_window.className = "reply";
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var container = DocumentCreateElement("table");
container.style.margin = "0px 0px 10px";
_window.appendChild(container);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
container.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
target.appendChild(element_follower);
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
_window.className = "reply";
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var container = DocumentCreateElement("table");
container.style.margin = "0px 0px 10px";
_window.appendChild(container);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
container.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.post_info){
forResponseAnchor(node.post_info);
forId(node.post_info);
forName(node.post_info);
forFollower(node.post_info);
}
if(node.post_message){
forResponseAnchor(node.post_message);
forId(node.post_message);
forName(node.post_message);
}
}
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
function StringCreateResponseAnchorNumbers(str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 0x7fffffff) min = 0x7fffffff;
if(max > 0x7fffffff) max = 0x7fffffff;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
if(max - min > 10000) max = min + 10000;
p += m[0].length;
numbers.addNumbers(min,max);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var post_info = element;
var post_file;
var post_message;
try{
if(post_info.tagName != "DIV") return false;
if(!(post_info.className.match(new RegExp("^postInfo","i")))) return false;
}catch(e){
return false;
}
try{
post_message = post_info.nextSibling;
if(post_message.tagName == "DIV"){
if(post_message.className == "file"){
post_file = post_message;
post_message = post_file.nextSibling;
}
}
}catch(e){
}
try{
if(post_message.tagName != "BLOCKQUOTE") return false;
if(post_message.className != "postMessage") return false;
}catch(e){
return false;
}
if(!post_file){
try{
var node = post_info.previousSibling;
if(node.tagName == "DIV"){
if(node.className == "file"){
post_file = node;
}
}
}catch(e){
}
}
// document に未登録
if(!DomNodeGetAttachedDocument(post_info)) return false;
// ポップアップを除外
var board = false;
var node = post_info;
while(node){
if(node.className == "board"){
board = true;
break;
}
node = node.parentNode;
}
if(!board) return false;
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanupInfo(target){
var nodes = ElementGetElementsByTagName(post_info,"span");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
if(node.className == "postertrip"){
// トリップ
var m = ElementGetTextContent(element).match(new RegExp("(!|!!)([a-zA-Z0-9+/.]{10})","i"));
if(m){
ElementSetTextContent(node,m[0]);
}
break;
}
}
}
function cleanupMessage(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:(|[ ])([a-zA-Z0-9+/.]{8})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(!|!!)([a-zA-Z0-9+/.]{10})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
return null;
});
}
if(post_info){
cleanupInfo(post_info);
}
if(post_message){
cleanupMessage(post_message);
}
})();
// ナンバーを取得
var info_text = ElementGetTextContent(post_info);
if(!(info_text.match(new RegExp("No\\.([0-9]+)","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
// IDの取得
if(info_text.match(new RegExp("\\(ID:[ ]([a-zA-Z0-9+/.]+)\\)","i"))){
response.setId(RegExp.$1);
}
// 名前の取得
(function(){
var nodes = ElementGetElementsByTagName(post_info,"span");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
if(node.className == "postertrip"){
response.setName(ElementGetTextContent(node));
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(post_message,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = StringCreateResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(post_info) response.addOriginalElements("post_info",post_info);
if(post_file) response.addOriginalElements("post_file",post_file);
if(post_message) response.addOriginalElements("post_message",post_message);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
if(original.length){
var node = original[0].element;
while(node){
if(node.className.match(new RegExp("^postContainer","i"))){
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
break;
}
node = node.parentNode;
}
}
};
response.setAnalyzed();
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
post_info:post_info,
post_file:post_file,
post_message:post_message,
parent:document.body
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「ふたば☆ちゃんねる」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize_2chan(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
// ------------------------------
// 基本URL抽出
// ------------------------------
var url = document.URL;
var bbs_list = [
{url:"^http://[^.]+\\.2chan\\.net/[^/]+/res/[0-9]+.htm",name:"2chan"}
];
var i;
var num = bbs_list.length;
for(i=0;i<num;i++){
var m = url.match(new RegExp(bbs_list[i].url,"i"));
if(m){
work.base_url = m[0];
work.bbs_name = bbs_list[i].name;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var work = info.work;
if(!(work.bbs_name)){
return false;
}
var last_id = 1;
var element_parent = null;
var read_more_button = null;
var element_form = null;
var base_url = work.base_url;
var resource_url = base_url;
// ------------------------------
// 双葉辞書
// ------------------------------
function FutabaDictionary(){
var _this = this;
// ------------------------------
// レスポンス生成
// ------------------------------
function createResponse(number){
var _response = new Object();
// ------------------------------
// 開放
// ------------------------------
_response.release = function(obj){
var _prev = _response._prev;
var _next = _response._next;
_prev._next = _next;
_next._prev = _prev;
_response._prev = _response;
_response._next = _response;
delete _number_dictionary[_image_id];
delete _image_id_dictionary[_image_id];
_response._text_dictionary = new Object();
};
// ------------------------------
// 番号を取得
// ------------------------------
_response.getNumber = function(){
return number;
};
// ------------------------------
// テキストを登録
// ------------------------------
_response.attachText = function(str){
var m = str.match(new RegExp("([ ]*)([>>]*)([ ]*)(.+?)([ ]*)$"));
if(!m) return;
if(!m[4]) return;
_response._text_dictionary[m[4]] = {
depth:m[2].length
};
};
// ------------------------------
// テキストからレスポンスを取得
// ------------------------------
_response.getResponsesFromText = function(str){
var ary = new Array();
var m = str.match(new RegExp("^([ ]*)([>>]*)([ ]*)(.+?)([ ]*)$","i"));
if(!m) return;
if(!m[4]) return;
var depth = m[2].length;
str = m[4];
var str_num = str.length;
if(str_num < 1) return ary;
if(depth < 1) return ary;
// 完全一致
var list = _response._prev;
while(_response_list != list){
var p = list._text_dictionary[str];
if(p){
if(p.depth < depth){
ary.push(list);
}
}
list = list._prev;
}
if(ary.length) return ary;
// 部分一致
var list = _response._prev;
while(_response_list != list){
var k;
var d = list._text_dictionary;
for(k in d){
var p = d[k];
if(p.depth < depth){
if(k.indexOf(str) >= 0){
ary.push(list);
break;
}
}
}
list = list._prev;
}
return ary;
};
// ------------------------------
// イメージ ID を登録
// ------------------------------
_response.setImageId = function(id){
_image_id = id;
_image_id_dictionary[_image_id] = _response;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _image_id;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_response._prev = _response;
_response._next = _response;
_response._text_dictionary = new Object();
var list = _response_list._prev;
while(_response_list != list){
if(list.getNumber() >= number){
break;
}
list = list._prev;
}
var _next = list;
var _prev = _next._prev;
_prev._next = _response;
_next._prev = _response;
_response._prev = _prev;
_response._next = _next;
_number_dictionary[number] = _response;
})();
return _response;
}
// ------------------------------
// 番号からレスポンスを生成
// ------------------------------
_this.createResponse = function(number){
var response = _number_dictionary[number];
if(!response){
response = createResponse(number);
_number_dictionary[number] = response;
}
return response;
};
// ------------------------------
// 番号からレスポンスを取得
// ------------------------------
_this.getResponse = function(number){
return _number_dictionary[number];
};
// ------------------------------
// 画像 ID からレスポンスを取得
// ------------------------------
_this.getResponseFromImageId = function(id){
return _image_id_dictionary[id];
};
// ------------------------------
// プライベート変数
// ------------------------------
var _number_dictionary;
var _image_id_dictionary;
var _response_list;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_number_dictionary = new Object();
_image_id_dictionary = new Object();
_response_list = new Object();
_response_list._prev = _response_list;
_response_list._next = _response_list;
})();
}
// ------------------------------
// テーブル解析
// ------------------------------
work.analyzeTable = function(table){
var re_number = new RegExp("No\\.([0-9]+)","i");
var re_image = new RegExp(".*/([0-9]+)\\.(bmp|gif|jpeg|jpe|jpg|png)","i");
// ナンバーを取得
var info_text = ElementGetTextContent(table);
var m = info_text.match(re_number);
if(m){
var id = parseInt(m[1]);
if(work.futaba_dictionary.getResponse(id)) return;
var response = work.futaba_dictionary.createResponse(id);
try{
var blockquote = ElementGetElementsByTagName(table,"BLOCKQUOTE")[0];
// 画像 ID
var anchor = blockquote.previousSibling;
while(anchor){
if(anchor.tagName == "A"){
if(anchor.href.match(re_image)){
response.setImageId(RegExp.$1);
break;
}
}
anchor = anchor.previousSibling;
}
// 本文
var nodes = blockquote.childNodes;
var node_num = nodes.length;
var i;
var s = "";
for(i=0;i<node_num;i++){
var node = nodes[i];
switch(node.nodeType){
case 1:
if(node.tagName == "BR"){
if(s){
response.attachText(s);
}
s = "";
}else{
s += ElementGetTextContent(node);
}
break;
case 3:
s += node.nodeValue;
break;
}
}
if(s){
response.attachText(s);
}
}catch(e){
}
}
};
// ------------------------------
// フォーム位置補正
// ------------------------------
function revisePositionForm(){
try{
var ftbl = document.getElementById("ftbl");
var ufm = document.getElementById("ufm");
if(ftbl.style.position == "absolute"){
var p = DocumentGetScrollPos();
var r = ufm.getBoundingClientRect();
ftbl.style.top = (p.y + r.top) + "px";
}
}catch(e){}
}
// ------------------------------
// 継ぎ足し読み込み
// ------------------------------
function readMore(){
var element_result = document.getElementById("contdisp");
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("Name[ ].*?No\\.([0-9]+)","i");
var re_result = new RegExp("<span id=\"contdisp\">(.*?)<\\\\/span>","i");
var element_last;
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<table border=0>",p);
if(p < 0) throw 0;
var e = str.indexOf("</td>",p);
if(e >= 0){
e = str.indexOf("</tr>",e + 5);
if(e >= 0){
e = str.indexOf("</table>",e + 5);
if(e >= 0) e += 8;
}
}
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if(last_id < id){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var nodes = StringHtmlCreateDomNodesSafe(s);
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
DomNode_InsertAfter(element_last,nodes[j]);
element_last = nodes[j];
}
// フォーム位置補正
revisePositionForm();
last_id = id;
}
}
if(p < e){
p = e;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
if(element_result){
var m = str.match(re_result);
if(m){
ElementSetTextContent(element_result,m[1]);
}else{
ElementSetTextContent(element_result,"not found!");
}
}
// フォーム位置補正
revisePositionForm();
read_more_button.init();
}
var nodes = ElementGetElementsByTagName(element_parent,"table");
if(nodes.length){
element_last = nodes[nodes.length-1];
}
execute_queue.attachFirst(f,null);
};
// 失敗
loader.onerror = function(){
if(element_result){
ElementSetTextContent(element_result,"not found!");
}
read_more_button.init();
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url);
loader.overrideMimeType("text/plain; charset=Shift_JIS");
loader.loadText();
}
// ------------------------------
// レスポンス親要素
// ------------------------------
var i;
var nodes = ElementGetElementsByTagName(document.body,"form");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
if(node.action.indexOf("futaba.php") != -1){
if(ElementGetElementsByTagName(node,"blockquote").length){
element_parent = node;
break;
}
}
}
if(!element_parent) return false;
// ------------------------------
// 最後尾 ID
// ------------------------------
var nodes = ElementGetElementsByTagName(element_parent,"table");
var i;
var node_num = nodes.length;
for(i=node_num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(new RegExp("No\\.([0-9]+)","i"));
if(m){
last_id = parseInt(m[1]);
break;
}
}
// ------------------------------
// アクセス先 URL
// ------------------------------
resource_url = base_url;
// ------------------------------
// BbsControlReadMoreButton 作成
// ------------------------------
read_more_button = new BbsControlReadMoreButton();
read_more_button.setWaitTime(2 * 1000);
read_more_button.onclick = readMore;
var nodes = ElementGetElementsByTagName(element_parent,"hr");
if(nodes.length){
DomNode_InsertBefore(nodes[nodes.length-1],read_more_button.getElement());
}
// ------------------------------
// 書き込みをポップアップ化
// ------------------------------
(function(){
var element_form;
var input_submit;
var element_textarea;
var event_handler_release;
var task;
(function(){
// フォーム
var node = document.getElementById("ftbl");
while(node){
if(node.tagName == "FORM"){
element_form = node;
break;
}
node = node.parentNode;
}
// サブミットボタン
if(element_form){
var nodes = ElementGetElementsByTagName(element_form,"input");
for(i=0;i<nodes.length;i++){
if(nodes[i].type.toLowerCase() == "submit"){
input_submit = nodes[i];
break;
}
}
var nodes = ElementGetElementsByTagName(element_form,"textarea");
if(nodes.length){
element_textarea = nodes[0];
}
}
})();
// 開放
function release(){
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
removeEvent();
if(task){
task.release();
}
}
// クリア
function clear(){
var ary = new Array();
var i;
var num = element_form.length;
for(i=0;i<num;i++){
ary.push({e:element_form[i],v:element_form[i].value});
}
element_form.reset();
for(i=0;i<num;i++){
try{
var item = ary[i];
item.e.value = item.v;
}catch(e){}
}
element_textarea.value = "";
}
// 有効セット
function setEnable(type){
input_submit.disabled = !(type);
}
// イベント追加
function addEvent(){
if(window.addEventListener){
input_submit.addEventListener("click",EventClickButton);
element_form.addEventListener("submit",EventSubmitForm);
}else if(window.attachEvent){
input_submit.attachEvent("onclick",EventClickButton);
element_form.attachEvent("onsubmit",EventSubmitForm);
}
}
// イベント除外
function removeEvent(){
if(window.removeEventListener){
input_submit.removeEventListener("click",EventClickButton);
element_form.removeEventListener("submit",EventSubmitForm);
}else if(window.detachEvent){
input_submit.detachEvent("onclick",EventClickButton);
element_form.detachEvent("onsubmit",EventSubmitForm);
}
}
// サブミット直前に実行されるイベント
function EventSubmitForm(e){
setEnable(false);
}
// クリック時に実行されるイベント
function EventClickButton(e){
var w = 600;
var h = 400;
var window_name = "_pageexpand_" + Math.floor(Math.random() * 0x7FFFFFFF);
var popup_iframe = new BbsControlPopupIframe(window_name);
popup_iframe.setWindowSize(w,h);
popup_iframe.onclose = function(){
setEnable(true);
};
var element_iframe = popup_iframe.getIFrameElement();
var window_obj = element_iframe.contentWindow;
element_form.target = window_name;
(function(){
var closed = false;
var timer = null;
// タスク生成
task = task_container.createTask();
task.setDestructorFunc(function(){
task = null;
});
task.setExecuteFunc(function(){
try{
var href = "";
if(window_obj.document){
href = window_obj.document.URL;
}
if(href.indexOf("http://") == 0){
if(href.indexOf("/res/") >= 0){
closed = true;
}else if(href.indexOf("/futaba.php") == -1){
closed = true;
}else{
var body = window_obj.document.body;
if(body){
if(ElementGetTextContent(body).indexOf("切り替えます") != -1){
if(!timer){
timer = (new Date()).getTime();
}
}
}
}
}
if(timer){
if((new Date()).getTime() - timer > 1000 * 1.0){
closed = true;
}
}
}catch(e){
closed = true;
}
if(closed){
if(task){
task.release();
}
popup_iframe.close();
setEnable(true);
if(timer){
readMore();
clear();
}
}
});
})();
}
(function(){
if(!element_form) return;
if(!input_submit) return;
if(!element_textarea) return;
addEvent();
event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
release();
});
})();
})();
// ------------------------------
// 完了後フォーム位置補正
// ------------------------------
execute_queue.attachLast(function(){
revisePositionForm();
},null);
// ------------------------------
// 双葉辞書を生成
// ------------------------------
(function(){
work.futaba_dictionary = new FutabaDictionary();
var nodes = ElementGetElementsByTagName(element_parent,"table");
var node_num = nodes.length;
var p = 0;
(function(){
var post_message = ElementGetElementsByTagName(document.body,"blockquote")[0];
var post_container = post_message.parentNode;
if(post_container.tagName == "FORM"){
work.analyzeTable(post_container);
}
})();
function f(){
try{
var node = nodes[p];
if(!node) throw 0;
work.analyzeTable(node);
}catch(e){
}
if(p < node_num){
p += 1;
execute_queue.attachFirst(f,null);
return;
}
response({result:true});
}
execute_queue.attachFirst(f,null);
return true;
})();
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「ふたば☆ちゃんねる」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_2chan(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var work = info.work;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
var br_add_dictionary = {"post_info":1,"post_file_info":1};
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = StringCreateResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var table = DocumentCreateElement("table");
var tr = DocumentCreateElement("tr");
var td = DocumentCreateElement("td");
table.style.margin = "0px 0px 10px";
_window.appendChild(table);
table.appendChild(tr);
tr.appendChild(td);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
td.appendChild(obj.element);
// 改行追加
if(br_add_dictionary[obj.name]){
td.appendChild(DocumentCreateElement("br"));
}
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// 引用
// ------------------------------
function forQuote(target){
if(BbsControlQuoteExist(target)) return;
// ------------------------------
// BbsControlQuote を生成
// ------------------------------
(function(){
function NumberListEqual(a,b){
var i;
var n = a.length;
if(n != b.length) return false;
for(i=0;i<n;i++){
if(a[i] != b[i]) return false;
}
return true;
}
var numbers_old = null;
var numbers_new = null;
var i;
var nodes = target.childNodes;
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
if(node.tagName == "FONT"){
var numbers = QuoteStringCreateResponseAnchorNumbers(response.getNumber(),ElementGetTextContent(node));
if(numbers.getCount()){
numbers_new = numbers.getNumberList();
var abbreviate = false;
if(numbers_old){
if(NumberListEqual(numbers_old,numbers_new)){
abbreviate = true;
}
}
if(!abbreviate){
var control_quote = new BbsControlQuote(null,true);
var element_quote = control_quote.getElement();
element_quote.style.cssText = "font-size:small; text-decoration:underline; margin-left:10px;";
var textnode_quote = DocumentCreateText(" >>" + numbers_new.join(","));
element_quote.appendChild(textnode_quote);
DomNode_InsertLastChild(node,element_quote);
control_quote.setResponseAnchorNumbers(numbers);
numbers_old = numbers_new;
}
}
}
}
})();
// ------------------------------
// BbsControlQuote を検索
// ------------------------------
BbsControlQuoteSearch(target,function(control_quote){
var element_res_anchor = control_quote.getElement();
var numbers = control_quote.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var table = DocumentCreateElement("table");
var tr = DocumentCreateElement("tr");
var td = DocumentCreateElement("td");
table.style.margin = "0px 0px 10px";
_window.appendChild(table);
table.appendChild(tr);
tr.appendChild(td);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
td.appendChild(obj.element);
// 改行追加
if(br_add_dictionary[obj.name]){
td.appendChild(DocumentCreateElement("br"));
}
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var table = DocumentCreateElement("table");
var tr = DocumentCreateElement("tr");
var td = DocumentCreateElement("td");
table.style.margin = "0px 0px 10px";
_window.appendChild(table);
table.appendChild(tr);
tr.appendChild(td);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
td.appendChild(obj.element);
// 改行追加
if(br_add_dictionary[obj.name]){
td.appendChild(DocumentCreateElement("br"));
}
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var table = DocumentCreateElement("table");
var tr = DocumentCreateElement("tr");
var td = DocumentCreateElement("td");
table.style.margin = "0px 0px 10px";
_window.appendChild(table);
table.appendChild(tr);
tr.appendChild(td);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
td.appendChild(obj.element);
// 改行追加
if(br_add_dictionary[obj.name]){
td.appendChild(DocumentCreateElement("br"));
}
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ホスト
// ------------------------------
function forHost(target){
if(BbsControlHostExist(target)) return;
// ------------------------------
// BbsControlHost を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var text_value = DomNodeGetNodeValue(node);
var m = text_value.match(new RegExp("(IP:)([0-9]{1,3}\\.[0-9]{1,3}\\.[*][(][-.a-zA-Z0-9]+[)])","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
break;
}
break;
}
}
})();
// ------------------------------
// BbsControlHost を検索
// ------------------------------
BbsControlHostSearch(target,function(control_host){
control_host.setResponse(response);
var host = control_host.getHost();
var element_host = control_host.getElement();
var textnode_host = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_host.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_host,"[" + count + "]");
}else{
DomNodeSetNodeValue(textnode_host,"");
}
var style = element_host.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","80%");
}
};
control_host.update();
element_host.appendChild(textnode_host);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "host"){
if(response.getHost() == host) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_host);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromHost(host);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_host = responses[i];
var clone = response_host.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var table = DocumentCreateElement("table");
var tr = DocumentCreateElement("tr");
var td = DocumentCreateElement("td");
table.style.margin = "0px 0px 10px";
_window.appendChild(table);
table.appendChild(tr);
tr.appendChild(td);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
td.appendChild(obj.element);
// 改行追加
if(br_add_dictionary[obj.name]){
td.appendChild(DocumentCreateElement("br"));
}
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_host,param,response_dialog,"host");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#707070");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
var nodes = ElementGetElementsByTagName(target,"br");
if(nodes.length){
DomNode_InsertBefore(nodes[0],element_follower);
}else{
target.appendChild(element_follower);
}
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var table = DocumentCreateElement("table");
var tr = DocumentCreateElement("tr");
var td = DocumentCreateElement("td");
table.style.margin = "0px 0px 10px";
_window.appendChild(table);
table.appendChild(tr);
tr.appendChild(td);
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
td.appendChild(obj.element);
// 改行追加
if(br_add_dictionary[obj.name]){
td.appendChild(DocumentCreateElement("br"));
}
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.post_info){
forId(node.post_info);
forName(node.post_info);
forHost(node.post_info);
forFollower(node.post_info);
}
if(node.post_message){
forResponseAnchor(node.post_message);
forQuote(node.post_message);
forId(node.post_message);
forName(node.post_message);
}
}
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
function StringCreateResponseAnchorNumbers(str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(No\\.|>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var re_image = new RegExp("([0-90-9]+)\\.(bmp|gif|jpeg|jpe|jpg|png)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var response = null;
var id = StringConvertFromNumericFullToNumericHalf(m[1]);
if(!response) response = work.futaba_dictionary.getResponseFromImageId(id);
id = parseInt(id);
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
if(!response) response = work.futaba_dictionary.getResponse(id);
if(response){
id = response.getNumber();
}
numbers.addNumber(id);
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
var m = str.match(re_image);
if(m){
var id = StringConvertFromNumericFullToNumericHalf(m[1]);
var response = work.futaba_dictionary.getResponseFromImageId(id);
if(response){
numbers.addNumber(response.getNumber());
}
}
return numbers;
}
// ------------------------------
// 引用文字列からレスポンス番号を取得
// ------------------------------
function QuoteStringCreateResponseAnchorNumbers(id,str){
var numbers = new ResponseAnchorNumbers();
var response = work.futaba_dictionary.getResponse(id);
if(!response) return numbers;
var responses = response.getResponsesFromText(str);
var num = responses.length;
var i;
for(i=0;i<num;i++){
numbers.addNumber(responses[i].getNumber());
}
return numbers;
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var post_container;
var post_info;
var post_file;
var post_file_info;
var post_message = element;
try{
if(post_message.tagName != "BLOCKQUOTE") return false;
}catch(e){
return false;
}
// コンテナ取得
try{
post_container = post_message.parentNode;
if(post_container.tagName == "FORM"){
}else if(post_container.tagName == "TD"){
while(post_container){
if(post_container.tagName == "TABLE"){
break;
}
post_container = post_container.parentNode;
}
if(!post_container){
return false;
}
}else{
return false;
}
}catch(e){
return false;
}
// 画像取得
try{
var anchor = post_message.previousSibling;
while(anchor){
if(anchor.tagName == "A"){
var images = ElementGetElementsByTagName(anchor,"img");
if(images.length == 1){
post_file = anchor;
break;
}
}
anchor = anchor.previousSibling;
}
}catch(e){
}
// document に未登録
if(!DomNodeGetAttachedDocument(post_message)) return;
// ファイル情報をグループ化
try{
var node = post_file.previousSibling;
if(node.tagName == "BR"){
node = node.previousSibling;
if(node.tagName == "SPAN"){
post_file_info = node;
}else{
post_file_info = DocumentCreateElement("span");
DomNode_InsertAfter(node,post_file_info);
var node = post_file_info.previousSibling;
while(node){
var prev = node.previousSibling;
if(node.tagName == "BR") break;
DomNode_InsertFirstChild(post_file_info,node);
node = prev;
}
}
}
}catch(e){
}
// 名前情報をグループ化
try{
var input;
var nodes = ElementGetElementsByTagName(post_container,"input");
if(nodes.length){
input = nodes[0];
}
if(input){
var node = input.parentNode;
if(node.tagName == "SPAN"){
post_info = node;
}else{
post_info = DocumentCreateElement("span");
DomNode_InsertBefore(input,post_info);
node = input;
var dic = {"DIV":1,"SMALL":1,"BLOCKQUOTE":1,"BR":1};
while(node){
var next = node.nextSibling;
if(dic[node.tagName]) break;
post_info.appendChild(node);
node = next;
}
}
}
}catch(e){
}
if(post_container.tagName == "TABLE"){
try{
var selector_result = ElementMatchesSelector(post_container,"body > form > table");
if(selector_result === undefined){
var form = post_container.parentNode;
if(form.tagName != "FORM") return false;
if(form.parentNode != document.body) return false;
}else if(!selector_result){
return false;
}
}catch(e){
return false;
}
}else if(post_container.tagName == "FORM"){
try{
var nodeTest = function (node){
while(node){
if(node.tagName == "TABLE"){
return false;
}
if(node == post_container){
return true;
}
node = node.parentNode;
}
return false;
}
if(!nodeTest(post_info)){
return false;
}
if(!nodeTest(post_file_info)){
return false;
}
}catch(e){
}
try{
if(post_container.parentNode != document.body) return false;
}catch(e){
return false;
}
}
// 双葉辞書追加
work.analyzeTable(post_container);
// ------------------------------
// レスアンカー拡張
// ------------------------------
(function(target){
if(BbsControlResponseAnchorExist(target)) return;
if(BbsControlQuoteExist(target)) return;
var re_simple = new RegExp("^(No\\.|>>|<<|>)[-,0-90-9]+$","i");
var re_image = new RegExp("([0-90-9]+)\\.(bmp|gif|jpeg|jpe|jpg|png)","i");
var re_detail = new RegExp("(No\\.|>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+,)*[0-90-9]+","i");
var re_number = new RegExp("([0-90-9]+)","i");
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(re_simple);
if(m){
var text_node = DocumentCreateText(m[0]);
DomNode_InsertBefore(node,text_node);
DomNodeRemove(node);
}
}
// テキストノードを統合
target.normalize();
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(re_image);
if(m){
var response = work.futaba_dictionary.getResponseFromImageId(m[1]);
if(response){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var element = DocumentCreateElement("a");
ElementSetTextContent(element,m[0]);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
element.href = work.base_url + "#" + response.getNumber();
DomNode_InsertAfter(element,node);
continue;
}
}
var m = DomNodeGetNodeValue(node).match(re_detail);
if(!m) break;
var text_left = RegExp.leftContext;
var text_match = m[0];
var text_right = RegExp.rightContext;
var query = 0;
m = text_match.match(re_number);
while(m){
var v = parseInt(StringConvertFromNumericFullToNumericHalf(m[0]));
if(v < 1) v = 1;
if(v > 0x7fffffff) v = 0x7fffffff;
var response = null;
if(!response) response = work.futaba_dictionary.getResponse(v);
if(!response) response = work.futaba_dictionary.getResponseFromImageId(v);
if(response){
query = v;
break;
}
m = RegExp.rightContext.match(re_number);
}
if(!query) break;
// 元のテキストノード
DomNodeSetNodeValue(node,text_left);
// BbsControlName を生成
var element = DocumentCreateElement("a");
ElementSetTextContent(element,text_match);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(text_right);
element.href = work.base_url + "#" + query;
DomNode_InsertAfter(element,node);
}
}
}
})(post_message);
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanup(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// ホスト名
var m = node.nodeValue.match(new RegExp("^([0-9]{1,3}\\.[0-9]{1,3}\\.[*][(][-.a-zA-Z0-9]+[)])","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
return null;
});
}
if(post_info){
cleanup(post_info);
}
if(post_message){
cleanup(post_message);
}
})();
// ナンバーを取得
var info_text = ElementGetTextContent(post_info);
if(!(info_text.match(new RegExp("No\\.([0-9]+)","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// アンカー追加
try{
var node = post_container.previousSibling;
if(node.tagName != "A"){
var anchor = DocumentCreateElement("a");
anchor.name = "" + RegExp.$1;
DomNode_InsertBefore(post_container,anchor);
}
}catch(e){
}
// レスポンス解析
if(!response.getAnalyzed()){
// IDの取得
if(info_text.match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"))){
response.setId(RegExp.$1);
}
// 名前の取得
if(info_text.match(new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"))){
response.setName(RegExp.$1);
}
// ホスト名の取得
if(info_text.match(new RegExp("IP:([0-9]{1,3}\\.[0-9]{1,3}\\.[*][(][-.a-zA-Z0-9]+[)])","i"))){
response.setHost(RegExp.$1);
}
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(post_message,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = StringCreateResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
var nodes = post_message.childNodes;
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
if(node.tagName == "FONT"){
var numbers = QuoteStringCreateResponseAnchorNumbers(response.getNumber(),ElementGetTextContent(node));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
}
})();
// オリジナルエレメントをセット
if(post_info) response.addOriginalElements("post_info",post_info);
if(post_file_info) response.addOriginalElements("post_file_info",post_file_info);
if(post_file) response.addOriginalElements("post_file",post_file);
if(post_message) response.addOriginalElements("post_message",post_message);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
var node;
if(original.length){
node = original[original.length-1].element;
while(node){
if(node.tagName == "TABLE") break;
node = node.parentNode;
}
}
if(node){
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
// オリジナルエレメントを外す
var i;
var num = original.length;
for(i=0;i<num;i++){
var revise_scroll = new DocumentReviseScroll();
var node = original[i].element;
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
};
response.setAnalyzed();
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
post_info:post_info,
post_file_info:post_file_info,
post_file:post_file,
post_message:post_message,
parent:document.body
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「chaika」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize_Chaika(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
// ------------------------------
// 基本URL抽出
// ------------------------------
var url = document.URL;
var bbs_list = [
{url:"(http://[^.]+\\.2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"2ch"},
{url:"(http://[^.]+\\.bbspink\\.com/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"pink"},
{url:"(http://jbbs\\.shitaraba\\.net/bbs/read.cgi/[^/]+/[0-9]+/[0-9]+)",replace:"$1/",name:"shitaraba"}
];
var i;
var num = bbs_list.length;
for(i=0;i<num;i++){
var bbs = bbs_list[i];
var re = new RegExp(bbs.url,"i");
var m = url.match(re);
if(m){
work.base_url = m[1].replace(re,bbs.replace);
work.bbs_name = bbs.name;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var work = info.work;
if(!(work.bbs_name)){
return false;
}
var first_id = 1;
var last_id = 1;
var dictionary_id = new Array();
var load_shadow_func = null;
var load_more_func = null;
var element_parent = null;
var element_last = null;
var element_footer = null;
var read_more_button = null;
var element_form = null;
var base_url = work.base_url;
var resource_url_shadow;
var resource_url_more;
var generate_html_func = null;
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
work.createResponseAnchorNumbers = function (str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var id0 = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var id1 = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(id0 < 1) id0 = 1;
if(id1 < 1) id1 = 1;
if(id0 > 10000) id0 = 10000;
if(id1 > 10000) id1 = 10000;
p += m[0].length;
numbers.addNumbers(id0,id1);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
};
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor = function (target){
if(BbsControlResponseAnchorExist(target)) return;
var re_simple = new RegExp("^(>>|<<|>)[-,0-90-9]+$","i");
var re_detail = new RegExp("(>>|<<|>>|<<|>|>|》|≫|>>)(([0-90-9]+[-][0-90-9]+|[0-90-9]+),)*([0-90-9]+[-][0-90-9]+|[0-90-9]+)","i");
var re_range = new RegExp("([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("([0-90-9]+)","i");
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(re_simple);
if(m){
var text_node = DocumentCreateText(m[0]);
DomNode_InsertBefore(node,text_node);
DomNodeRemove(node);
}
}
// テキストノードを統合
target.normalize();
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(re_detail);
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var element = DocumentCreateElement("a");
ElementSetTextContent(element,m[0]);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element,node);
var query = "";
m = ElementGetTextContent(element).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 10000) min = 10000;
if(max > 10000) max = 10000;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
query = min + "-" + max;
}else{
// 番号
m = ElementGetTextContent(element).match(re_number);
if(m){
query = parseInt(StringConvertFromNumericFullToNumericHalf(m[0]));
if(query < 1) query = 1;
if(query > 0x7fffffff) query = 0x7fffffff;
}
}
element.href = work.base_url + query;
}
}
}
};
// ------------------------------
// HTML 文書をシャドウ読み込み
// ------------------------------
function loadShadowFromHTML(str){
var re_search;
var re_number;
var re_name = new RegExp("<b>(.*?)</b>","i");
var re_mail = new RegExp("<a href=\"mailto:(.*)\">","i");
var re_date;
var re_id;
var re_be;
var re_gen_id0 = new RegExp("ID:([-a-zA-Z0-9+/.]+)[●!]{0,2}","i");
var re_gen_id1 = new RegExp("([-a-zA-Z0-9+/.]+)[●!]{0,2}","i");
var re_gen_name = new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i");
switch(work.bbs_name){
case "2ch":
case "pink":
re_search = new RegExp("([0-9]+) :(.*?)<dd> (.*)","i");
re_number = new RegExp("([0-9]+)","i");
re_date = new RegExp("([0-9]+/[0-9]+/[0-9]+.* [0-9]+:[0-9]+:[0-9]+.*?)($| ID:|<)","i");
re_id = new RegExp("(ID):([^ ]+)","i");
re_be = new RegExp("<a href=\"javascript:be\\(([0-9]+)\\);\">[?](.*?)</a>","i");
break;
case "shitaraba":
re_search = new RegExp("<a href=\".*?\">([0-9]+)</a> :(.*?)<dd> (.*)","i");
re_number = new RegExp("<a href=\".*?\">([0-9]+)</a> :","i");
re_date = new RegExp("([0-9]+/[0-9]+/[0-9]+.* [0-9]+:[0-9]+:[0-9]+.*?)($| ID:| HOST:|<)","i");
re_id = new RegExp("(ID|HOST):([^ ]+)","i");
break;
}
var p = 0;
var n = str.length;
function f(){
if(p >= n) return;
p = str.indexOf("<dt>",p);
if(p < 0) return;
var e = str.indexOf("\n",p);
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var m = s.match(re_search);
if(m){
var obj = new Object();
obj.number = id;
obj.name = "";
obj.mail = "";
obj.date = "";
obj.id = "";
obj.be = "";
obj.message = m[3];
if(m[2].match(re_date)){
obj.date = RegExp.$1;
}
if(m[2].match(re_name)){
obj.name = RegExp.$1;
}
if(m[2].match(re_id)){
obj.id = RegExp.$2;
}
if(m[2].match(re_mail)){
obj.mail = RegExp.$1;
}
if(re_be){
if(m[2].match(re_be)){
obj.be = RegExp.$1 + "-" + RegExp.$2;
}
}
var nodes = StringHtmlCreateDomNodesSafe(generate_html_func(obj));
var dt = ElementGetElementsByClassName(nodes[0],"resHeader")[0];
var dd = ElementGetElementsByClassName(nodes[0],"resBody")[0];
if(!dt) return;
if(!dd) return;
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
var nodes = ElementGetElementsByClassName(dt,"resID");
if(nodes.length){
if(ElementGetTextContent(nodes[0]).match(re_gen_id1)){
response.setId(RegExp.$1);
}
}else{
if(dt_text.match(re_gen_id0)){
response.setId(RegExp.$1);
}
}
// 名前の取得
if(dt_text.match(re_gen_name)){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(|\\n) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
}
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// HTML 文書を継ぎ足し読み込み
// ------------------------------
function loadMoreFromHTML(str){
var re_search;
var re_number;
var re_name = new RegExp("<b>(.*?)</b>","i");
var re_mail = new RegExp("<a href=\"mailto:(.*)\">","i");
var re_date;
var re_id;
var re_be;
switch(work.bbs_name){
case "2ch":
case "pink":
re_search = new RegExp("([0-9]+) :(.*?)<dd> (.*)","i");
re_number = new RegExp("([0-9]+)","i");
re_date = new RegExp("([0-9]+/[0-9]+/[0-9]+.* [0-9]+:[0-9]+:[0-9]+.*?)($| ID:|<)","i");
re_id = new RegExp("(ID):([^ ]+)","i");
re_be = new RegExp("<a href=\"javascript:be\\(([0-9]+)\\);\">[?](.*?)</a>","i");
break;
case "shitaraba":
re_search = new RegExp("<a href=\".*?\">([0-9]+)</a> :(.*?)<dd> (.*)","i");
re_number = new RegExp("<a href=\".*?\">([0-9]+)</a> :","i");
re_date = new RegExp("([0-9]+/[0-9]+/[0-9]+.* [0-9]+:[0-9]+:[0-9]+.*?)($| ID:| HOST:|<)","i");
re_id = new RegExp("(ID|HOST):([^ ]+)","i");
break;
}
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<dt>",p);
if(p < 0) throw 0;
var e = str.indexOf("\n",p);
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if(last_id < id){
var m = s.match(re_search);
if(m){
var obj = new Object();
obj.number = id;
obj.name = "";
obj.mail = "";
obj.date = "";
obj.id = "";
obj.be = "";
obj.message = m[3];
if(m[2].match(re_date)){
obj.date = RegExp.$1;
}
if(m[2].match(re_name)){
obj.name = RegExp.$1;
}
if(m[2].match(re_id)){
obj.id = RegExp.$2;
}
if(m[2].match(re_mail)){
obj.mail = RegExp.$1;
}
if(re_be){
if(m[2].match(re_be)){
obj.be = RegExp.$1 + "-" + RegExp.$2;
}
}
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var nodes = StringHtmlCreateDomNodesSafe(generate_html_func(obj));
var j;
var node_num = nodes.length;
if(element_last){
for(j=0;j<node_num;j++){
DomNode_InsertAfter(element_last,nodes[j]);
element_last = nodes[j];
}
}
if(element_parent){
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
}
last_id = id;
resource_url_more = base_url + (last_id) + "-";
}
}
}
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
read_more_button.init();
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// DAT 文書をシャドウ読み込み
// ------------------------------
function loadShadowFromDAT(str){
var re_search = new RegExp("(.*?)<>(.*?)<>(.*?)<> (.*?) <>","i");
var re_date = new RegExp("([0-9]+/[0-9]+/[0-9]+.* [0-9]+:[0-9]+:[0-9]+.*?)($| ID:| BE:)","i");
var re_id = new RegExp("ID:([^ ]+)","i");
var re_be = new RegExp("BE:([^ ]+)","i");
var re_icon = new RegExp("^sssp://img.2ch.net/ico/(.*?)( <br> .*)$","i");
var re_gen_id0 = new RegExp("ID:([-a-zA-Z0-9+/.]+)[●!]{0,2}","i");
var re_gen_id1 = new RegExp("([-a-zA-Z0-9+/.]+)[●!]{0,2}","i");
var re_gen_name = new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i");
var p = 0;
var n = str.length;
var id = 1;
function f(){
if(p >= n) return;
var e = str.indexOf("\n",p);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var m = str.substring(p,e).match(re_search);
if(m){
var obj = new Object();
obj.number = id;
obj.name = m[1];
obj.mail = m[2];
obj.date = "";
obj.id = "";
obj.be = "";
obj.message = m[4];
if(m[3].match(re_date)){
obj.date = RegExp.$1;
}
if(m[3].match(re_id)){
obj.id = RegExp.$1;
}
if(m[3].match(re_be)){
obj.be = RegExp.$1;
}
if(obj.message.match(re_icon)){
obj.message = "<img src=\"http://img.2ch.net/ico/" + RegExp.$1 + "\">" + RegExp.$2;
}
var nodes = StringHtmlCreateDomNodesSafe(generate_html_func(obj));
var dt = ElementGetElementsByClassName(nodes[0],"resHeader")[0];
var dd = ElementGetElementsByClassName(nodes[0],"resBody")[0];
if(!dt) return;
if(!dd) return;
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
var nodes = ElementGetElementsByClassName(dt,"resID");
if(nodes.length){
if(ElementGetTextContent(nodes[0]).match(re_gen_id1)){
response.setId(RegExp.$1);
}
}else{
if(dt_text.match(re_gen_id0)){
response.setId(RegExp.$1);
}
}
// 名前の取得
if(dt_text.match(re_gen_name)){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(|\\n) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
id += 1;
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// DAT 文書を継ぎ足し読み込み
// ------------------------------
function loadMoreFromDAT(str){
var re_search = new RegExp("(.*?)<>(.*?)<>(.*?)<> (.*?) <>","i");
var re_date = new RegExp("([0-9]+/[0-9]+/[0-9]+.* [0-9]+:[0-9]+:[0-9]+.*?)($| ID:| BE:)","i");
var re_id = new RegExp("ID:([^ ]+)","i");
var re_be = new RegExp("BE:([^ ]+)","i");
var re_icon = new RegExp("^sssp://img.2ch.net/ico/(.*?)( <br> .*)$","i");
var p = 0;
var n = str.length;
var id = 1;
function f(){
try{
if(p >= n) throw 0;
var e = str.indexOf("\n",p);
if(last_id < id){
var m = str.substring(p,e).match(re_search);
if(m){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var obj = new Object();
obj.number = id;
obj.name = m[1];
obj.mail = m[2];
obj.date = "";
obj.id = "";
obj.be = "";
obj.message = m[4];
if(m[3].match(re_date)){
obj.date = RegExp.$1;
}
if(m[3].match(re_id)){
obj.id = RegExp.$1;
}
if(m[3].match(re_be)){
obj.be = RegExp.$1;
}
if(obj.message.match(re_icon)){
obj.message = "<img src=\"http://img.2ch.net/ico/" + RegExp.$1 + "\">" + RegExp.$2;
}
var nodes = StringHtmlCreateDomNodesSafe(generate_html_func(obj));
var j;
var node_num = nodes.length;
if(element_last){
for(j=0;j<node_num;j++){
DomNode_InsertAfter(element_last,nodes[j]);
element_last = nodes[j];
}
}
if(element_parent){
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
}
last_id = id;
}
}
id += 1;
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
read_more_button.init();
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// 継ぎ足し読み込み
// ------------------------------
function readMore(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(load_more_func){
load_more_func(str);
}
};
// 失敗
loader.onerror = function(){
read_more_button.init();
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_more);
switch(work.bbs_name){
case "2ch":
case "pink":
loader.overrideMimeType("text/plain; charset=Shift_JIS");
break;
case "shitaraba":
loader.overrideMimeType("text/plain; charset=EUC-JP");
break;
}
loader.loadText();
}
// ------------------------------
// フッダ要素
// ------------------------------
if(!element_footer){
var nodes = document.getElementsByTagName("footer");
if(nodes.length){
element_footer = nodes[nodes.length - 1];
}
}
if(!element_footer){
element_footer = document.getElementById("footer");
}
// ------------------------------
// Default スタイル
// ------------------------------
if(!generate_html_func){
(function(){
var nodes = ElementGetElementsByClassName(document.body,"resNumber");
var node_num = nodes.length;
var i;
// ------------------------------
// 範囲取得
// ------------------------------
var re_number = new RegExp("([0-9]+)","i");
for(i=node_num-1;i>=0;i--){
var node = nodes[i];
if(ElementGetTextContent(node).match(re_number)){
last_id = parseInt(RegExp.$1);
dictionary_id[last_id] = true;
element_last = node;
break;
}
}
var rg_id = new RegExp("^res[0-9]+$","i");
while(element_last){
if(element_last.id.match(rg_id)){
break;
}
element_last = element_last.parentNode;
}
if(!element_last) return;
for(i=0;i<node_num;i++){
var node = nodes[i];
if(ElementGetTextContent(node).match(re_number)){
first_id = parseInt(RegExp.$1);
dictionary_id[first_id] = true;
if(first_id != 1){
break;
}
}
}
// ------------------------------
// コード生成コールバック
// ------------------------------
if(element_last.tagName.toUpperCase() == "ARTICLE"){
generate_html_func = function(param){
return '<article id="res' + param.number + '" class="resContainer" data-id="' + param.id + ' 0" data-number="' + param.number + '" data-aboned="false">' +
' <h2 class="resHeader">' +
' <span class="resNumber">' + param.number + '</span>' +
' <span class="resHeaderContent">' +
' <span class="resName">' + param.name + '</span>' +
' <span class="resMail">' + param.mail + '</span>' +
' <span class="resDate">' + param.date + '</span>' +
' <span class="resID" data-id="' + param.id + '">' + param.id + '</span><span style="color: rgb(136, 136, 136); font-size: small;"></span>' +
' <span class="resIP" data-id=""></span>' +
' <span class="resHost" data-id=""></span>' +
' <span class="resBeID" data-id="0">' + param.be + '</span>' +
' </span>' +
' <span class="resHeaderAboneContent"></span>' +
' <span style="color: rgb(136, 136, 136); font-size: small;"></span></h2>' +
' <p class="resBody"> ' + param.message + ' </p></article>';
}
work.skin_type = "default";
}else{
generate_html_func = function(param){
return '<dl id="res' + param.number + '" class="resContainer" resid="' + param.id + '" collapsed="false" isabone="false">' +
'<dt class="resHeader">' +
'<span class="resNumber">' + param.number + ' </span>' +
'<span class="resHeaderContent">' +
'<span class="resName"><span class="resSystem">' + param.name + '</span></span> ' +
'[<span class="resMail">' + param.mail + '</span>] ' +
'<span class="resDate">' + param.date + ' </span> ' +
((param.id) ? ('ID:' + param.id + ' ') : ('')) +
((param.be) ? ('Be:<span class="resBeID">' + param.be + '</span>') : ('')) +
'</span>' +
'<span class="resHeaderAboneContent"></span>' +
'<span style="color: rgb(136, 136, 136); font-size: small;"></span>' +
'</dt>' +
'<dd class="resBody"> ' + param.message + ' </dd>' +
'</dl>';
}
work.skin_type = "default";
}
})();
}
if(!generate_html_func) return false;
// ------------------------------
// 読み込み方式
// ------------------------------
load_shadow_func = loadShadowFromHTML;
load_more_func = loadMoreFromHTML;
if(work.bbs_name == "2ch"){
// DAT ファイル
load_shadow_func = loadShadowFromDAT;
load_more_func = loadMoreFromDAT;
}
// ------------------------------
// アクセス先 URL
// ------------------------------
if(load_more_func == loadMoreFromHTML){
resource_url_shadow = base_url;
resource_url_more = base_url + last_id + "-";
}else{
if(base_url.match(new RegExp("http://([^.]+\\.2ch\\.net)/test/read\\.cgi/([^/]+)/([0-9]+)/","i"))){
resource_url_shadow = resource_url_more = "http://" + RegExp.$1 + "/" + RegExp.$2 + "/dat/" + RegExp.$3 + ".dat";
}
}
// ------------------------------
// BbsControlReadMoreButton 作成
// ------------------------------
read_more_button = new BbsControlReadMoreButton();
read_more_button.setWaitTime(2 * 1000);
read_more_button.onclick = readMore;
if(element_footer){
DomNode_InsertBefore(element_footer,read_more_button.getElement());
}else{
document.body.appendChild(read_more_button.getElement());
}
// ------------------------------
// シャドウロード
// ------------------------------
(function(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(load_shadow_func){
load_shadow_func(str);
}
};
// 失敗
loader.onerror = function(){
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_shadow);
switch(work.bbs_name){
case "2ch":
case "pink":
loader.overrideMimeType("text/plain; charset=Shift_JIS");
break;
case "shitaraba":
loader.overrideMimeType("text/plain; charset=EUC-JP");
break;
}
loader.loadText();
})();
// ------------------------------
// 擬似要素無効化
// ------------------------------
(function(){
var element = DocumentCreateElement("style");
document.body.appendChild(element);
var style_sheet = ElementGetStyleSheet(element);
CSSStyleSheetInsertRule(style_sheet,"[data-id-posts-all]:after","content: none !important;",0);
CSSStyleSheetInsertRule(style_sheet,".resNumber[data-referred]:after","content: none !important;",1);
})();
response({result:true});
return true;
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「chaika」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_Chaika(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var work = info.work;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
// 名前欄
if(node.className == "resID"){
var m = ElementGetTextContent(node).match(new RegExp("(ID:|)([-a-zA-Z0-9+/.]+)[●!]{0,2}$","i"));
if(m){
// BbsControlId を生成
var control_id = new BbsControlId(null,true);
control_id.setId(m[2]);
var element_id = control_id.getElement();
DomNode_InsertAfter(node,element_id);
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
control_id.setTextNode(textnode_id);
}
}else if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:([-a-zA-Z0-9+/.]+)[●!]{0,2}","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
control_id.setTextNode(textnode_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = control_id.getTextNode();
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ホスト
// ------------------------------
function forHost(target){
if(BbsControlHostExist(target)) return;
// ------------------------------
// BbsControlHost を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var text_value = DomNodeGetNodeValue(node);
var m = text_value.match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})((|\\n) \\])","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText("\n ]" + RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
break;
}
break;
}
}
})();
// ------------------------------
// BbsControlHost を検索
// ------------------------------
BbsControlHostSearch(target,function(control_host){
control_host.setResponse(response);
var host = control_host.getHost();
var element_host = control_host.getElement();
var textnode_host = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_host.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_host,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_host,"");
}
var style = element_host.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","80%");
}
};
control_host.update();
element_host.appendChild(textnode_host);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "host"){
if(response.getHost() == host) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_host);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromHost(host);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_host = responses[i];
var clone = response_host.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_host,param,response_dialog,"host");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
var nodes = ElementGetElementsByTagName(target,"br");
if(nodes.length){
DomNode_InsertBefore(nodes[0],element_follower);
}else{
target.appendChild(element_follower);
}
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.dt){
forResponseAnchor(node.dt);
forId(node.dt);
forName(node.dt);
forHost(node.dt);
forFollower(node.dt);
}
if(node.dd){
forResponseAnchor(node.dd);
forId(node.dd);
forName(node.dd);
}
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var dt = element;
var dd;
try{
var i;
var nodes = dt.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
if(nodes[i].className == "resNumber") break;
}
if(i >= num) return false;
}catch(e){
return false;
}
try{
dd = DomNodeGetNextElementSibling(dt);
if(!dd) return false;
}catch(e){
return false;
}
try{
var dl = dt.parentNode;
if(!dl.id.match(new RegExp("^res[0-9]+$","i"))) return false;
if(!DomNodeGetAttachedDocument(dl)) return false;
}catch(e){
return false;
}
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor(dd);
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanupHeader(target){
var p;
var n;
var q;
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(node.className == "resID"){
var prev = node.previousSibling;
if(prev){
if((prev.nodeType == 3) && (DomNodeGetNodeValue(prev).indexOf("ID:") >= 0)){
if(!(node.childNodes.length)){
DomNodeRemove(prev);
DomNodeRemove(node);
}else{
DomNodeSetNodeValue(prev,DomNodeGetNodeValue(prev) + ElementGetTextContent(node));
DomNodeRemove(node);
}
}
}
}else if(node.className == "resBeID"){
var prev = node.previousSibling;
if(prev){
if((prev.nodeType == 3) && (DomNodeGetNodeValue(prev).indexOf("Be:") >= 0)){
if(!(node.childNodes.length)){
DomNodeRemove(prev);
DomNodeRemove(node);
}
}
}
}else{
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
}
}
}
function cleanup(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:([-a-zA-Z0-9+/.]+)[●!]{0,2}","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(◆[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// ホスト名
var m = node.nodeValue.match(new RegExp("^([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
var m = node.nodeValue.match(new RegExp("^([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
return null;
});
}
if(dt){
cleanupHeader(dt);
cleanup(dt);
}
if(dd){
cleanup(dd);
}
})();
// ナンバーを取得
var dt_text = ElementGetTextContent(dt);
if(!(dt_text.match(new RegExp("([0-9]+)","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
// IDの取得
var nodes = ElementGetElementsByClassName(dt,"resID");
if(nodes.length){
if(ElementGetTextContent(nodes[0]).match(new RegExp("(ID:|)([-a-zA-Z0-9+/.]+)[●!]{0,2}","i"))){
response.setId(RegExp.$2);
}
}else{
if(dt_text.match(new RegExp("ID:([-a-zA-Z0-9+/.]+)[●!]{0,2}","i"))){
response.setId(RegExp.$1);
}
}
// 名前の取得
if(dt_text.match(new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i"))){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(|\\n) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
// オリジナルエレメントを外す
var i;
var num = original.length;
for(i=0;i<num;i++){
var revise_scroll = new DocumentReviseScroll();
var node = original[i].element;
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
};
response.setAnalyzed();
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
dt:dt,
dd:dd,
parent:dt.parentNode
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「おーぷん2ちゃんねる」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize_Open2ch(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
// ------------------------------
// 基本URL抽出
// ------------------------------
var url = document.URL;
var bbs_list = [
{url:"(http://[^.]+\\.open2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"open2ch"},
{url:"(http://open2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"open2ch"}
];
var i;
var num = bbs_list.length;
for(i=0;i<num;i++){
var bbs = bbs_list[i];
var re = new RegExp(bbs.url,"i");
var m = url.match(re);
if(m){
work.base_url = m[1].replace(re,bbs.replace);
work.bbs_name = bbs.name;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var work = info.work;
if(!(work.bbs_name)){
return false;
}
var first_id = 1;
var last_id = 1;
var dictionary_id = new Array();
var load_shadow_func = null;
var load_more_func = null;
var element_parent = null;
var read_more_button = null;
var element_form = null;
var base_url = work.base_url;
var resource_url_shadow;
var resource_url_more;
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
work.createResponseAnchorNumbers = function (str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var id0 = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var id1 = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(id0 < 1) id0 = 1;
if(id1 < 1) id1 = 1;
if(id0 > 10000) id0 = 10000;
if(id1 > 10000) id1 = 10000;
p += m[0].length;
numbers.addNumbers(id0,id1);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
};
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor = function (target){
if(BbsControlResponseAnchorExist(target)) return;
var re_simple = new RegExp("^(>>|<<|>)[-,0-90-9]+$","i");
var re_detail = new RegExp("(>>|<<|>>|<<|>|>|》|≫|>>)(([0-90-9]+[-][0-90-9]+|[0-90-9]+),)*([0-90-9]+[-][0-90-9]+|[0-90-9]+)","i");
var re_range = new RegExp("([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("([0-90-9]+)","i");
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(re_simple);
if(m){
var text_node = DocumentCreateText(m[0]);
DomNode_InsertBefore(node,text_node);
DomNodeRemove(node);
}
}
// テキストノードを統合
target.normalize();
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(re_detail);
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var element = DocumentCreateElement("a");
var span = DocumentCreateElement("span");
element.appendChild(span);
ElementSetTextContent(span,m[0]);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element,node);
var query = "";
m = ElementGetTextContent(element).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 10000) min = 10000;
if(max > 10000) max = 10000;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
query = min + "-" + max;
}else{
// 番号
m = ElementGetTextContent(element).match(re_number);
if(m){
query = parseInt(StringConvertFromNumericFullToNumericHalf(m[0]));
if(query < 1) query = 1;
if(query > 0x7fffffff) query = 0x7fffffff;
}
}
element.href = work.base_url + query;
}
}
}
};
// ------------------------------
// HTML 文書をシャドウ読み込み
// ------------------------------
function loadShadowFromHTML(str){
var re_number;
var re_id = new RegExp("ID:([-a-zA-Z0-9+/.]+)[●!]{0,2}","i");
var re_name = new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i");
switch(work.bbs_name){
case "open2ch":
re_number = new RegExp("([0-9]+)","i");
break;
}
var p = 0;
var n = str.length;
function f(){
if(p >= n) return;
p = str.indexOf("<dt>",p);
if(p < 0) return;
var e = str.indexOf("</dt>",p);
var s = str.substring(p,e) + "\n" + "<br>";
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
var nodes = StringHtmlCreateDomNodesSafe(s);
var dt = nodes[0];
var dd = nodes[1];
var br = nodes[3];
try{
if(dt.tagName != "DT") return;
if(dd.tagName != "DD") return;
if(br.tagName != "BR") return;
}catch(e){
return;
}
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
if(dt_text.match(re_id)){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(re_name)){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(|\\n) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
if(br) response.addOriginalElements("br",br);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// HTML 文書を継ぎ足し読み込み
// ------------------------------
function loadMoreFromHTML(str){
var re_number;
switch(work.bbs_name){
case "open2ch":
re_number = new RegExp("([0-9]+)","i");
break;
}
// 最後尾 ID 更新
var last_number = 0;
var nodes = ElementGetElementsByTagName(element_parent,"dt");
var node_num = nodes.length;
if(node_num){
var re_id = new RegExp("^([0-9]+)","i");
if(ElementGetTextContent(nodes[node_num-1]).match(re_id)){
last_number = parseInt(RegExp.$1);
}
}
var i = last_number;
while(i > last_id){
dictionary_id[i] = true;
i --;
}
last_id = last_number;
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<dt>",p);
if(p < 0) throw 0;
var e = str.indexOf("</dt>",p);
var s = str.substring(p,e) + "\n<BR>";
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if(last_id < id){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var nodes = StringHtmlCreateDomNodesSafe(s);
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
last_id = id;
resource_url_more = base_url + (last_id) + "-";
}
}
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
read_more_button.init();
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// 継ぎ足し読み込み
// ------------------------------
function readMore(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(load_more_func){
load_more_func(str);
}
};
// 失敗
loader.onerror = function(){
read_more_button.init();
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_more);
loader.loadText();
}
// ------------------------------
// レスポンス親要素
// ------------------------------
var i;
var nodes = ElementGetElementsByTagName(document.body,"dl");
var num = nodes.length;
for(i=0;i<num;i++){
element_parent = nodes[i];
break;
}
if(!element_parent) return false;
// ------------------------------
// フォーム位置修正
// ------------------------------
switch(work.bbs_name){
case "machi":
var nodes = ElementGetElementsByTagName(element_parent,"dt");
if(nodes.length){
var dt = nodes[nodes.length - 1];
var node = dt.firstChild;
while(node){
var next = node.nextSibling;
DomNode_InsertAfter(element_parent,node);
node = next;
}
DomNodeRemove(dt);
}
var nodes = ElementGetElementsByTagName(element_parent,"dd");
if(nodes.length){
nodes = ElementGetElementsByTagName(nodes[nodes.length - 1],"br");
if(nodes.length){
var node = nodes[nodes.length - 1];
node = node.nextSibling;
while(node){
var next = node.nextSibling;
DomNode_InsertAfter(element_parent,node);
node = next;
}
}
}
break;
}
// ------------------------------
// 範囲取得
// ------------------------------
var nodes = ElementGetElementsByTagName(element_parent,"dt");
var node_num = nodes.length;
if(node_num){
var re_id = new RegExp("^([0-9]+)","i");
if(ElementGetTextContent(nodes[0]).match(re_id)){
first_id = parseInt(RegExp.$1);
dictionary_id[0] = true;
}
if((first_id == 1) && (node_num > 1)){
if(ElementGetTextContent(nodes[1]).match(re_id)){
first_id = parseInt(RegExp.$1);
dictionary_id[first_id] = true;
if(first_id <= 2) first_id = 1;
}
}
if(ElementGetTextContent(nodes[node_num-1]).match(re_id)){
last_id = parseInt(RegExp.$1);
dictionary_id[last_id] = true;
}
}
// ------------------------------
// 読み込み方式
// ------------------------------
load_shadow_func = loadShadowFromHTML;
load_more_func = loadMoreFromHTML;
// ------------------------------
// アクセス先 URL
// ------------------------------
if(load_more_func == loadMoreFromHTML){
resource_url_more = base_url + last_id + "-";
}else{
if(base_url.match(new RegExp("http://(([^/]+)/test/read\\.cgi/([^/]+)/([0-9]+)/","i"))){
resource_url_more = "http://" + RegExp.$1 + "/" + RegExp.$3 + "/dat/" + RegExp.$4 + ".dat";
}
}
if(load_shadow_func == loadShadowFromHTML){
resource_url_shadow = base_url;
}else{
if(base_url.match(new RegExp("http://(([^/])/test/read\\.cgi/([^/]+)/([0-9]+)/","i"))){
resource_url_shadow = "http://" + RegExp.$1 + "/" + RegExp.$3 + "/dat/" + RegExp.$4 + ".dat";
}
}
// ------------------------------
// BbsControlReadMoreButton 作成
// ------------------------------
read_more_button = new BbsControlReadMoreButton();
read_more_button.setWaitTime(2 * 1000);
read_more_button.onclick = readMore;
DomNode_InsertAfter(element_parent,read_more_button.getElement());
// ------------------------------
// シャドウロード
// ------------------------------
(function(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(load_shadow_func){
load_shadow_func(str);
}
};
// 失敗
loader.onerror = function(){
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_shadow);
loader.loadText();
})();
response({result:true});
return true;
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「おーぷん2ちゃんねる」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_Open2ch(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var work = info.work;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
// 名前欄
if(node.tagName == "A"){
var m = node.href.match(new RegExp("[?]ID=([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(m){
// BbsControlId を生成
var control_id = new BbsControlId(null,true);
control_id.setId(m[1]);
var element_id = control_id.getElement();
DomNode_InsertAfter(node,element_id);
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
control_id.setTextNode(textnode_id);
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
control_id.setTextNode(textnode_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = control_id.getTextNode();
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
continue;
}
// 名前欄
var m = DomNodeGetNodeValue(node).match(new RegExp("◆$","i"));
if(m){
try{
var b = node.parentNode.nextSibling;
var m = ElementGetTextContent(b).match(new RegExp("^([a-zA-Z0-9+/.]{10,12})$","i"));
if(m){
// BbsControlName を生成
var control_name = new BbsControlName(null,true);
control_name.setName("◆" + m[0]);
var element_name = control_name.getElement();
DomNode_InsertAfter(b,element_name);
}
}catch(e){
}
}
break;
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ホスト
// ------------------------------
function forHost(target){
if(BbsControlHostExist(target)) return;
// ------------------------------
// BbsControlHost を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var text_value = DomNodeGetNodeValue(node);
var m = text_value.match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})((|\\n) \\])","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText("\n ]" + RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
break;
}
break;
}
}
})();
// ------------------------------
// BbsControlHost を検索
// ------------------------------
BbsControlHostSearch(target,function(control_host){
control_host.setResponse(response);
var host = control_host.getHost();
var element_host = control_host.getElement();
var textnode_host = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_host.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_host,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_host,"");
}
var style = element_host.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","80%");
}
};
control_host.update();
element_host.appendChild(textnode_host);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "host"){
if(response.getHost() == host) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_host);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromHost(host);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_host = responses[i];
var clone = response_host.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_host,param,response_dialog,"host");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
var nodes = ElementGetElementsByTagName(target,"br");
if(nodes.length){
DomNode_InsertBefore(nodes[0],element_follower);
}else{
target.appendChild(element_follower);
}
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.dt){
forResponseAnchor(node.dt);
forId(node.dt);
forName(node.dt);
forHost(node.dt);
forFollower(node.dt);
}
if(node.dd){
forResponseAnchor(node.dd);
forId(node.dd);
forName(node.dd);
}
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var dt = element;
var dd;
var br;
try{
if(dt.tagName != "DT") return false;
}catch(e){
return false;
}
dd = dt.nextSibling;
try{
if(dd.tagName != "DD") return false;
}catch(e){
return false;
}
try{
var dl = dt.parentNode;
if(dl.tagName != "DL") return false;
if(dl.className != "thread") return false;
}catch(e){
return false;
}
try{
br = dd.nextSibling.nextSibling;
if(br.tagName != "BR"){
br = null;
}
}catch(e){
}
// 改行補充
if(!br){
br = DocumentCreateElement('br');
var text_node = DocumentCreateText("\n");
DomNodeInsertAfter(element,text_node);
DomNodeInsertAfter(text_node,br);
}
// document に未登録
if(!DomNodeGetAttachedDocument(dt)) return false;
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor(dd);
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanup(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(◆[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// ホスト名
var m = node.nodeValue.match(new RegExp("^([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
var m = node.nodeValue.match(new RegExp("^([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
return null;
});
}
if(dt){
cleanup(dt);
}
if(dd){
cleanup(dd);
}
})();
// ナンバーを取得
var dt_text = ElementGetTextContent(dt);
if(!(dt_text.match(new RegExp("^([0-9]+)[ ]","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
// IDの取得
if(dt_text.match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"))){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i"))){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(|\\n) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
if(br) response.addOriginalElements("br",br);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
// オリジナルエレメントを外す
var i;
var num = original.length;
for(i=0;i<num;i++){
var revise_scroll = new DocumentReviseScroll();
var node = original[i].element;
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
};
response.setAnalyzed();
}
var dl = document.body;
var node = dt;
while(node){
if(node.tagName == "DL"){
dl = node;
}
node = node.parentNode;
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
dt:dt,
dd:dd,
parent:dl
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「あっとちゃんねるず」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize_Atchs(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
// ------------------------------
// 基本URL抽出
// ------------------------------
var url = document.URL;
var bbs_list = [
{url:"(http://[^.]+\\.atchs\\.jp/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"atchs"}
];
var i;
var num = bbs_list.length;
for(i=0;i<num;i++){
var bbs = bbs_list[i];
var re = new RegExp(bbs.url,"i");
var m = url.match(re);
if(m){
work.base_url = m[1].replace(re,bbs.replace);
work.bbs_name = bbs.name;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var work = info.work;
if(!(work.bbs_name)){
return false;
}
var first_id = 1;
var last_id = 1;
var dictionary_id = new Array();
var element_parent = null;
var read_more_button = null;
var element_form = null;
var base_url = work.base_url;
var resource_url_shadow = base_url;
var resource_url_more = base_url;
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
work.createResponseAnchorNumbers = function (str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var id0 = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var id1 = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(id0 < 1) id0 = 1;
if(id1 < 1) id1 = 1;
if(id0 > 10000) id0 = 10000;
if(id1 > 10000) id1 = 10000;
p += m[0].length;
numbers.addNumbers(id0,id1);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
};
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor = function (target){
if(BbsControlResponseAnchorExist(target)) return;
var re_simple = new RegExp("^(>>|<<|>)[-,0-90-9]+$","i");
var re_detail = new RegExp("(>>|<<|>>|<<|>|>|》|≫|>>)(([0-90-9]+[-][0-90-9]+|[0-90-9]+),)*([0-90-9]+[-][0-90-9]+|[0-90-9]+)","i");
var re_range = new RegExp("([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("([0-90-9]+)","i");
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(re_simple);
if(m){
var text_node = DocumentCreateText(m[0]);
DomNode_InsertBefore(node,text_node);
DomNodeRemove(node);
}
}
// テキストノードを統合
target.normalize();
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(re_detail);
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var element = DocumentCreateElement("a");
ElementSetTextContent(element,m[0]);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element,node);
var query = "";
m = ElementGetTextContent(element).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 10000) min = 10000;
if(max > 10000) max = 10000;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
query = min + "-" + max;
}else{
// 番号
m = ElementGetTextContent(element).match(re_number);
if(m){
query = parseInt(StringConvertFromNumericFullToNumericHalf(m[0]));
if(query < 1) query = 1;
if(query > 0x7fffffff) query = 0x7fffffff;
}
}
element.href = work.base_url + query;
}
}
}
};
// ------------------------------
// 継ぎ足し読み込み
// ------------------------------
function readMore(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("<a href=\".*?\">([0-9]+)</a>","i");
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<div class=\"res\">",p);
if(p < 0) throw 0;
var e = str.indexOf("</div>",p);
if(e >= 0) e += 6;
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if(last_id < id){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var nodes = StringHtmlCreateDomNodesSafe(s);
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
last_id = id;
resource_url_more = base_url + (last_id) + "-";
}
}
if(p < e){
p = e;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
read_more_button.init();
}
execute_queue.attachFirst(f,null);
};
// 失敗
loader.onerror = function(){
read_more_button.init();
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_more);
loader.loadText();
}
// ------------------------------
// レスポンス親要素
// ------------------------------
element_parent = document.getElementById("article");
if(!element_parent) return false;
// ------------------------------
// 範囲取得
// ------------------------------
var nodes = ElementGetElementsByTagName(element_parent,"div");
var i;
var node_num = nodes.length;
for(i=0;i<node_num;i++){
var node = nodes[i];
if(node.className == "res"){
var m = ElementGetTextContent(node).match(new RegExp("([0-9]+)","i"));
if(m){
first_id = parseInt(m[1]);
dictionary_id[first_id] = true;
if(first_id != 1){
break;
}
}
}
}
for(i=node_num-1;i>=0;i--){
var node = nodes[i];
if(node.className == "res"){
var m = ElementGetTextContent(node).match(new RegExp("([0-9]+)","i"));
if(m){
last_id = parseInt(m[1]);
dictionary_id[last_id] = true;
if(last_id <= 1000){
break;
}
}
}
}
// ------------------------------
// アクセス先 URL
// ------------------------------
resource_url_shadow = base_url;
resource_url_more = base_url + last_id + "-";
// ------------------------------
// BbsControlReadMoreButton 作成
// ------------------------------
read_more_button = new BbsControlReadMoreButton();
read_more_button.setWaitTime(2 * 1000);
read_more_button.onclick = readMore;
var read_more_button_prev = document.getElementById("wrap");
if(read_more_button_prev){
DomNode_InsertAfter(read_more_button_prev,read_more_button.getElement());
}
// ------------------------------
// 書き込みをポップアップ化
// ------------------------------
(function(){
var element_form;
var input_submit;
var element_textarea;
var event_handler_release;
var task;
(function(){
// フォーム
var nodes = ElementGetElementsByTagName(document.body,"form");
var i;
for(i=0;i<nodes.length;i++){
if(nodes[i].action.indexOf("/test/bbs.cgi/") >= 0){
element_form = nodes[i];
break;
}
}
// サブミットボタン
if(element_form){
var nodes = ElementGetElementsByTagName(element_form,"input");
for(i=0;i<nodes.length;i++){
if(nodes[i].type.toLowerCase() == "submit"){
input_submit = nodes[i];
break;
}
}
var nodes = ElementGetElementsByTagName(element_form,"textarea");
if(nodes.length){
element_textarea = nodes[0];
}
}
})();
// 開放
function release(){
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
removeEvent();
if(task){
task.release();
}
}
// クリア
function clear(){
element_textarea.value = "";
}
// 有効セット
function setEnable(type){
input_submit.disabled = !(type);
}
// イベント追加
function addEvent(){
if(window.addEventListener){
input_submit.addEventListener("click",EventClickButton);
element_form.addEventListener("submit",EventSubmitForm);
}else if(window.attachEvent){
input_submit.attachEvent("onclick",EventClickButton);
element_form.attachEvent("onsubmit",EventSubmitForm);
}
}
// イベント除外
function removeEvent(){
if(window.removeEventListener){
input_submit.removeEventListener("click",EventClickButton);
element_form.removeEventListener("submit",EventSubmitForm);
}else if(window.detachEvent){
input_submit.detachEvent("onclick",EventClickButton);
element_form.detachEvent("onsubmit",EventSubmitForm);
}
}
// サブミット直前に実行されるイベント
function EventSubmitForm(e){
setEnable(false);
}
// クリック時に実行されるイベント
function EventClickButton(e){
var w = 600;
var h = 500;
var window_name = "_pageexpand_" + Math.floor(Math.random() * 0x7FFFFFFF);
var popup_iframe = new BbsControlPopupIframe(window_name);
popup_iframe.setWindowSize(w,h);
popup_iframe.onclose = function(){
setEnable(true);
};
var element_iframe = popup_iframe.getIFrameElement();
var window_obj = element_iframe.contentWindow;
element_form.target = window_name;
(function(){
var closed = false;
var timer = null;
// タスク生成
task = task_container.createTask();
task.setDestructorFunc(function(){
task = null;
});
task.setExecuteFunc(function(){
try{
var href = "";
if(window_obj.document){
href = window_obj.document.URL;
}
if(href.indexOf("http://") == 0){
if(href.indexOf("/test/read.cgi/") != -1){
if(!timer){
timer = (new Date()).getTime();
}
}else if(href.indexOf("/test/bbs.cgi/") == -1){
closed = true;
}else{
var document_obj = window_obj.document;
if(document_obj.readyState == "complete"){
if(document_obj.title === ""){
if(!timer){
timer = (new Date()).getTime();
}
}
}
}
}
if(timer){
if((new Date()).getTime() - timer > 1000 * 0){
closed = true;
}
}
}catch(e){
closed = true;
}
if(closed){
if(task){
task.release();
}
popup_iframe.close();
setEnable(true);
if(timer){
readMore();
clear();
}
}
});
})();
}
(function(){
if(!element_form) return;
if(!input_submit) return;
if(!element_textarea) return;
addEvent();
event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
release();
});
})();
})();
// ------------------------------
// シャドウロード
// ------------------------------
(function(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("<a href=\".*?\">([0-9]+)</a>","i");
var re_id = new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i");
var re_name = new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i");
var p = 0;
var n = str.length;
function f(){
if(p >= n) return;
p = str.indexOf("<div class=\"res\">",p);
if(p < 0) return;
var e = str.indexOf("</div>",p);
if(e >= 0) e += 6;
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var nodes = StringHtmlCreateDomNodesSafe(s);
var dt = nodes[0];
var dd = ElementGetElementsByTagName(dt,"p")[0];
try{
if(dt.tagName != "DIV") return false;
if(dt.className != "res") return false;
if(dd.className != "res_body") return false;
}catch(e){
return false;
}
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
if(dt_text.match(re_id)){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(re_name)){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})\\n \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
if(p < e){
p = e;
execute_queue.attachFirst(f,null);
}
}
execute_queue.attachFirst(f,null);
};
// 失敗
loader.onerror = function(){
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_shadow);
loader.loadText();
})();
response({result:true});
return true;
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「あっとちゃんねるず」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_Atchs(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var work = info.work;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ホスト
// ------------------------------
function forHost(target){
if(BbsControlHostExist(target)) return;
// ------------------------------
// BbsControlHost を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var text_value = DomNodeGetNodeValue(node);
var m = text_value.match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(\\n \\])","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText("\n ]" + RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
break;
}
break;
}
}
})();
// ------------------------------
// BbsControlHost を検索
// ------------------------------
BbsControlHostSearch(target,function(control_host){
control_host.setResponse(response);
var host = control_host.getHost();
var element_host = control_host.getElement();
var textnode_host = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_host.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_host,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_host,"");
}
var style = element_host.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","80%");
}
};
control_host.update();
element_host.appendChild(textnode_host);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "host"){
if(response.getHost() == host) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_host);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromHost(host);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_host = responses[i];
var clone = response_host.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_host,param,response_dialog,"host");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
var nodes = ElementGetElementsByTagName(target,"br");
if(nodes.length){
DomNode_InsertBefore(nodes[0],element_follower);
}else{
target.appendChild(element_follower);
}
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.dt){
forResponseAnchor(node.dt);
forId(node.dt);
forName(node.dt);
forHost(node.dt);
forFollower(node.dt);
}
if(node.dd){
forResponseAnchor(node.dd);
forId(node.dd);
forName(node.dd);
}
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var dt = element;
var dd;
try{
if(dt.tagName != "DIV") return false;
if(dt.className != "res") return false;
}catch(e){
return false;
}
try{
dd = ElementGetElementsByTagName(dt,"p")[0];
if(dd.className != "res_body") return false;
}catch(e){
return false;
}
try{
var div = dt.parentNode;
if(div.id != "article") return false;
}catch(e){
return false;
}
// document に未登録
if(!DomNodeGetAttachedDocument(dt)) return false;
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor(dd);
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanup(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// ホスト名
var m = node.nodeValue.match(new RegExp("^([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
var m = node.nodeValue.match(new RegExp("^([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
return null;
});
}
if(dt){
cleanup(dt);
}
if(dd){
cleanup(dd);
}
})();
// ナンバーを取得
var dt_text = ElementGetTextContent(dt);
if(!(dt_text.match(new RegExp("([0-9]+)","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
(function(){
// 本文を除外
var dt_clone = dt.cloneNode(true);
try{
var dd = ElementGetElementsByTagName(dt_clone,"p")[0];
DomNodeRemove(dd);
}catch(e){
}
dt_text = ElementGetTextContent(dt_clone);
})();
// IDの取得
if(dt_text.match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"))){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"))){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})\\n \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
// オリジナルエレメントを外す
var i;
var num = original.length;
for(i=0;i<num;i++){
var revise_scroll = new DocumentReviseScroll();
var node = original[i].element;
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
};
response.setAnalyzed();
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
dt:dt,
dd:dd,
parent:dt.parentNode
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「みみずん検索」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize_Mimizun(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
// ------------------------------
// 基本URL抽出
// ------------------------------
var url = document.URL;
var bbs_list = [
{url:"(http://mimizun\\.com/log/2ch/[^/]+/[0-9]+)",replace:"$1/",name:"mimizun"},
{url:"(http://mimizun\\.com/log/machi/[^/]+/[0-9]+)",replace:"$1/",name:"mimizun"}
];
var i;
var num = bbs_list.length;
for(i=0;i<num;i++){
var bbs = bbs_list[i];
var re = new RegExp(bbs.url,"i");
var m = url.match(re);
if(m){
work.base_url = m[1].replace(re,bbs.replace);
work.bbs_name = bbs.name;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var work = info.work;
if(!(work.bbs_name)){
return false;
}
var first_id = 1;
var last_id = 1;
var dictionary_id = new Array();
var element_parent = null;
var read_more_button = null;
var element_form = null;
var base_url = work.base_url;
var resource_url_shadow = base_url;
var resource_url_more = base_url;
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
work.createResponseAnchorNumbers = function (str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var id0 = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var id1 = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(id0 < 1) id0 = 1;
if(id1 < 1) id1 = 1;
if(id0 > 10000) id0 = 10000;
if(id1 > 10000) id1 = 10000;
p += m[0].length;
numbers.addNumbers(id0,id1);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
};
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor = function (target){
if(BbsControlResponseAnchorExist(target)) return;
var re_simple = new RegExp("^(>>|<<|>)[-,0-90-9]+$","i");
var re_detail = new RegExp("(>>|<<|>>|<<|>|>|》|≫|>>)(([0-90-9]+[-][0-90-9]+|[0-90-9]+),)*([0-90-9]+[-][0-90-9]+|[0-90-9]+)","i");
var re_range = new RegExp("([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("([0-90-9]+)","i");
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(re_simple);
if(m){
var text_node = DocumentCreateText(m[0]);
DomNode_InsertBefore(node,text_node);
DomNodeRemove(node);
}
}
// テキストノードを統合
target.normalize();
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(re_detail);
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var element = DocumentCreateElement("a");
ElementSetTextContent(element,m[0]);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element,node);
var query = "";
m = ElementGetTextContent(element).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 10000) min = 10000;
if(max > 10000) max = 10000;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
query = min + "-" + max;
}else{
// 番号
m = ElementGetTextContent(element).match(re_number);
if(m){
query = parseInt(StringConvertFromNumericFullToNumericHalf(m[0]));
if(query < 1) query = 1;
if(query > 0x7fffffff) query = 0x7fffffff;
}
}
element.href = work.base_url + query;
}
}
}
};
// ------------------------------
// 継ぎ足し読み込み
// ------------------------------
function readMore(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("<a name=\"([0-9]+)\">","i");
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<div class=\"contributor\">",p);
if(p < 0) throw 0;
var e = str.indexOf("\n",p);
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if(last_id < id){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var nodes = StringHtmlCreateDomNodesSafe(s);
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
last_id = id;
resource_url_more = base_url + (last_id) + "-";
}
}
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
read_more_button.init();
}
execute_queue.attachFirst(f,null);
};
// 失敗
loader.onerror = function(){
read_more_button.init();
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_more);
loader.overrideMimeType("text/plain; charset=Shift_JIS");
loader.loadText();
}
// ------------------------------
// レスポンス親要素
// ------------------------------
if(!element_parent) element_parent = document.getElementById("thread");
if(!element_parent) element_parent = document.getElementById("thread2");
if(!element_parent) return false;
// ------------------------------
// 範囲取得
// ------------------------------
var nodes = ElementGetElementsByTagName(element_parent,"div");
var i;
var node_num = nodes.length;
for(i=0;i<node_num;i++){
var node = nodes[i];
if(node.className == "contributor"){
var m = ElementGetTextContent(node).match(new RegExp("([0-9]+)","i"));
if(m){
first_id = parseInt(m[1]);
dictionary_id[first_id] = true;
if(first_id != 1){
break;
}
}
}
}
for(i=node_num-1;i>=0;i--){
var node = nodes[i];
if(node.className == "contributor"){
var m = ElementGetTextContent(node).match(new RegExp("([0-9]+)","i"));
if(m){
last_id = parseInt(m[1]);
dictionary_id[last_id] = true;
break;
}
}
}
// ------------------------------
// アクセス先 URL
// ------------------------------
resource_url_shadow = base_url;
resource_url_more = base_url + last_id + "-";
// ------------------------------
// BbsControlReadMoreButton 作成
// ------------------------------
read_more_button = new BbsControlReadMoreButton();
read_more_button.setWaitTime(2 * 1000);
read_more_button.onclick = readMore;
DomNode_InsertAfter(element_parent,read_more_button.getElement());
// ------------------------------
// シャドウロード
// ------------------------------
(function(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("<a name=\"([0-9]+)\">","i");
var re_id = new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i");
var re_name = new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i");
var p = 0;
var n = str.length;
function f(){
if(p >= n) return;
p = str.indexOf("<div class=\"contributor\">",p);
if(p < 0) return;
var e = str.indexOf("\n",p);
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var nodes = StringHtmlCreateDomNodesSafe(s);
var dt = nodes[0];
var dd = nodes[1];
try{
if(dt.tagName != "DIV") return;
if(dt.className != "contributor") return;
if(dd.tagName != "DIV") return;
if(dd.className != "res") return;
}catch(e){
return;
}
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
if(dt_text.match(re_id)){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(re_name)){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,}) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
}
}
execute_queue.attachFirst(f,null);
};
// 失敗
loader.onerror = function(){
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_shadow);
loader.loadText();
})();
response({result:true});
return true;
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「みみずん検索」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_Mimizun(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var work = info.work;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ホスト
// ------------------------------
function forHost(target){
if(BbsControlHostExist(target)) return;
// ------------------------------
// BbsControlHost を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var text_value = DomNodeGetNodeValue(node);
var m = text_value.match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})( \\])","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(" ]" + RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
break;
}
break;
}
}
})();
// ------------------------------
// BbsControlHost を検索
// ------------------------------
BbsControlHostSearch(target,function(control_host){
control_host.setResponse(response);
var host = control_host.getHost();
var element_host = control_host.getElement();
var textnode_host = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_host.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_host,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_host,"");
}
var style = element_host.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","80%");
}
};
control_host.update();
element_host.appendChild(textnode_host);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "host"){
if(response.getHost() == host) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_host);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromHost(host);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_host = responses[i];
var clone = response_host.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_host,param,response_dialog,"host");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
var nodes = ElementGetElementsByTagName(target,"br");
if(nodes.length){
DomNode_InsertBefore(nodes[0],element_follower);
}else{
target.appendChild(element_follower);
}
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"p")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.dt){
forResponseAnchor(node.dt);
forId(node.dt);
forName(node.dt);
forHost(node.dt);
forFollower(node.dt);
}
if(node.dd){
forResponseAnchor(node.dd);
forId(node.dd);
forName(node.dd);
}
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var dt = element;
var dd;
try{
if(dt.tagName != "DIV") return false;
if(dt.className != "contributor") return false;
}catch(e){
return false;
}
dd = dt.nextSibling;
try{
if(dd.tagName != "DIV") return false;
if(dd.className != "res") return false;
}catch(e){
return false;
}
try{
var div = dt.parentNode;
if(div.tagName != "DIV") return false;
if(div.id.indexOf("thread") != 0) return false;
}catch(e){
return false;
}
// document に未登録
if(!DomNodeGetAttachedDocument(dt)) return false;
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor(dd);
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanup(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// ホスト名
var m = node.nodeValue.match(new RegExp("^([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
var m = node.nodeValue.match(new RegExp("^([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
return null;
});
}
if(dt){
cleanup(dt);
}
if(dd){
cleanup(dd);
}
})();
// ナンバーを取得
var dt_text = ElementGetTextContent(dt);
if(!(dt_text.match(new RegExp("([0-9]+)","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
(function(){
// 本文を除外
var dt_clone = dt.cloneNode(true);
try{
var dd = ElementGetElementsByTagName(dt_clone,"p")[0];
DomNodeRemove(dd);
}catch(e){
}
dt_text = ElementGetTextContent(dt_clone);
})();
// IDの取得
if(dt_text.match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"))){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"))){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,}) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
// オリジナルエレメントを外す
var i;
var num = original.length;
for(i=0;i<num;i++){
var revise_scroll = new DocumentReviseScroll();
var node = original[i].element;
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
};
response.setAnalyzed();
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
dt:dt,
dd:dd,
parent:dt.parentNode
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「ログ速」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize_Logsoku(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
// ------------------------------
// 基本URL抽出
// ------------------------------
var url = document.URL;
var bbs_list = [
{url:"http://logsoku\\.com/thread/.*?\\.2ch\\.net/.*?/[0-9]+/",name:"logsoku"},
{url:"http://.*?\\.logsoku\\.com/r/.*?/[0-9]+/",name:"logsoku"},
{url:"http://logsoku\\.com/r/.*?/[0-9]+/",name:"logsoku"}
];
var i;
var num = bbs_list.length;
for(i=0;i<num;i++){
var bbs = bbs_list[i];
var re = new RegExp(bbs.url,"i");
var m = url.match(re);
if(m){
work.base_url = m[0];
work.bbs_name = bbs.name;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var work = info.work;
if(!(work.bbs_name)){
return false;
}
var first_id = 1;
var last_id = 1;
var dictionary_id = new Array();
var element_parent = null;
var read_more_button = null;
var element_form = null;
var base_url = work.base_url;
var resource_url_shadow = base_url;
var resource_url_more = base_url;
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
work.createResponseAnchorNumbers = function (str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var id0 = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var id1 = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(id0 < 1) id0 = 1;
if(id1 < 1) id1 = 1;
if(id0 > 10000) id0 = 10000;
if(id1 > 10000) id1 = 10000;
p += m[0].length;
numbers.addNumbers(id0,id1);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
};
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor = function (target){
if(BbsControlResponseAnchorExist(target)) return;
var re_simple = new RegExp("^(>>|<<|>)[-,0-90-9]+$","i");
var re_detail = new RegExp("(>>|<<|>>|<<|>|>|》|≫|>>)(([0-90-9]+[-][0-90-9]+|[0-90-9]+),)*([0-90-9]+[-][0-90-9]+|[0-90-9]+)","i");
var re_range = new RegExp("([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("([0-90-9]+)","i");
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(re_simple);
if(m){
var text_node = DocumentCreateText(m[0]);
DomNode_InsertBefore(node,text_node);
DomNodeRemove(node);
}
}
// テキストノードを統合
target.normalize();
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(re_detail);
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var element = DocumentCreateElement("a");
ElementSetTextContent(element,m[0]);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element,node);
var query = "";
m = ElementGetTextContent(element).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 10000) min = 10000;
if(max > 10000) max = 10000;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
query = min + "-" + max;
}else{
// 番号
m = ElementGetTextContent(element).match(re_number);
if(m){
query = parseInt(StringConvertFromNumericFullToNumericHalf(m[0]));
if(query < 1) query = 1;
if(query > 0x7fffffff) query = 0x7fffffff;
}
}
element.href = work.base_url + query;
}
}
}
};
// ------------------------------
// 継ぎ足し読み込み
// ------------------------------
function readMore(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("<div id=\"([0-9]+)\">","i");
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<div id=",p);
if(p < 0) throw 0;
var e = str.indexOf("</div>",p);
if(e >= 0){
e = str.indexOf("</div>",e + 6);
if(e >= 0) e += 6;
}
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if(last_id < id){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var nodes = StringHtmlCreateDomNodesSafe(s);
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
last_id = id;
resource_url_more = base_url + (last_id) + "-";
}
}
if(p < e){
p = e;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
read_more_button.init();
}
p = str.indexOf("<div id=\"comments\">",p);
if(p >= 0){
p += 19;
execute_queue.attachFirst(f,null);
}
};
// 失敗
loader.onerror = function(){
read_more_button.init();
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_more);
loader.loadText();
}
// ------------------------------
// レスポンス親要素
// ------------------------------
element_parent = document.getElementById("comments");
if(!element_parent) return false;
// ------------------------------
// 範囲取得
// ------------------------------
var nodes = ElementGetElementsByTagName(element_parent,"div");
var i;
var node_num = nodes.length;
for(i=0;i<node_num;i++){
var node = nodes[i];
var m = node.id.match(new RegExp("^([0-9]+)$","i"));
if(m){
first_id = parseInt(m[1]);
dictionary_id[first_id] = true;
if(first_id != 1){
break;
}
}
}
for(i=node_num-1;i>=0;i--){
var node = nodes[i];
var m = node.id.match(new RegExp("^([0-9]+)$","i"));
if(m){
last_id = parseInt(m[1]);
dictionary_id[last_id] = true;
break;
}
}
// ------------------------------
// アクセス先 URL
// ------------------------------
resource_url_shadow = base_url;
resource_url_more = base_url + last_id + "-";
// ------------------------------
// BbsControlReadMoreButton 作成
// ------------------------------
read_more_button = new BbsControlReadMoreButton();
read_more_button.setWaitTime(2 * 1000);
read_more_button.onclick = readMore;
DomNode_InsertAfter(element_parent,read_more_button.getElement());
// ------------------------------
// シャドウロード
// ------------------------------
(function(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
var re_number = new RegExp("<div id=\"([0-9]+)\">","i");
var re_id = new RegExp("ID:([-a-zA-Z0-9+/.]+)[●!]{0,2}","i");
var re_name = new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i");
var p = 0;
var n = str.length;
function f(){
if(p >= n) return;
p = str.indexOf("<div id=",p);
if(p < 0) return;
var e = str.indexOf("</div>",p);
if(e >= 0){
e = str.indexOf("</div>",e + 6);
if(e >= 0) e += 6;
}
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var nodes = StringHtmlCreateDomNodesSafe(s);
var dt = nodes[0];
var dd = ElementGetElementsByTagName(dt,"DIV")[0];
try{
if(dt.tagName != "DIV") return;
if(!dt.id.match(/^[0-9]+$/)) return;
if(dd.className != "comment") return;
}catch(e){
return;
}
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
if(dt_text.match(re_id)){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(re_name)){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})\\n \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
if(p < e){
p = e;
execute_queue.attachFirst(f,null);
}
}
p = str.indexOf("<div id=\"comments\">",p);
if(p >= 0){
p += 19;
execute_queue.attachFirst(f,null);
}
};
// 失敗
loader.onerror = function(){
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_shadow);
loader.loadText();
})();
response({result:true});
return true;
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「ログ速」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_Logsoku(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var work = info.work;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"div")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
param["dd"].style.minHeight = "0px";
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
// 名前欄
if(node.tagName == "A"){
var m = node.href.match(new RegExp("/ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}$","i"));
if(m){
// BbsControlId を生成
var control_id = new BbsControlId(null,true);
control_id.setId(m[1]);
var element_id = control_id.getElement();
DomNode_InsertAfter(node,element_id);
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
control_id.setTextNode(textnode_id);
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
control_id.setTextNode(textnode_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = control_id.getTextNode();
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"div")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
param["dd"].style.minHeight = "0px";
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"div")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
param["dd"].style.minHeight = "0px";
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ホスト
// ------------------------------
function forHost(target){
if(BbsControlHostExist(target)) return;
// ------------------------------
// BbsControlHost を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var text_value = DomNodeGetNodeValue(node);
var m = text_value.match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(\\n \\])","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText("\n ]" + RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
break;
}
break;
}
}
})();
// ------------------------------
// BbsControlHost を検索
// ------------------------------
BbsControlHostSearch(target,function(control_host){
control_host.setResponse(response);
var host = control_host.getHost();
var element_host = control_host.getElement();
var textnode_host = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_host.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_host,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_host,"");
}
var style = element_host.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","80%");
}
};
control_host.update();
element_host.appendChild(textnode_host);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "host"){
if(response.getHost() == host) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_host);
response_dialog.oncreate = function(_window,callback){
var responses = bbs_dictionary.getResponsesFromHost(host);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_host = responses[i];
var clone = response_host.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"div")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
param["dd"].style.minHeight = "0px";
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_host,param,response_dialog,"host");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
var nodes = ElementGetElementsByTagName(target,"div");
if(nodes.length){
DomNode_InsertBefore(nodes[0],element_follower);
}else{
target.appendChild(element_follower);
}
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
_window.appendChild(obj.element);
}
try{
var dd = ElementGetElementsByTagName(param["dt"],"div")[0];
DomNode_InsertBefore(dd,param["dd"]);
DomNodeRemove(dd);
param["dd"].style.minHeight = "0px";
}catch(e){
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.dt){
forResponseAnchor(node.dt);
forId(node.dt);
forName(node.dt);
forHost(node.dt);
forFollower(node.dt);
}
if(node.dd){
forResponseAnchor(node.dd);
forId(node.dd);
forName(node.dd);
}
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var dt = element;
var dd;
try{
if(dt.tagName != "DIV") return false;
if(!dt.id.match(/^[0-9]+$/)) return false;
}catch(e){
return false;
}
try{
dd = ElementGetElementsByTagName(dt,"DIV")[0];
if(dd.className != "comment") return false;
}catch(e){
return false;
}
try{
var div = dt.parentNode;
if(div.tagName != "DIV") return false;
if(div.id != "comments") return false;
}catch(e){
return false;
}
// document に未登録
if(!DomNodeGetAttachedDocument(dt)) return false;
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor(dd);
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanupIdInfo(target){
var p;
var n;
var q;
var ignore_tag = {"A":1};
var ignore_class = {"comment":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(ignore_tag[node.tagName]){
}else if(ignore_class[node.className]){
}else{
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("\[[0-9]+/[0-9]+回.*?\]","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// 直後テキスト
var next_node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(node,next_node);
node = next_node;
}
break;
}
}
}
function cleanup(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// ホスト名
var m = node.nodeValue.match(new RegExp("^([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
var m = node.nodeValue.match(new RegExp("^([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
return null;
});
}
if(dt){
cleanupIdInfo(dt);
cleanup(dt);
}
if(dd){
cleanup(dd);
}
})();
// ナンバーを取得
var dt_text = ElementGetTextContent(dt);
if(!(dt_text.match(new RegExp("([0-9]+)","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
(function(){
// 本文を除外
var dt_clone = dt.cloneNode(true);
try{
var div = ElementGetElementsByTagName(dt_clone,"div")[0];
DomNodeRemove(div);
}catch(e){
}
dt_text = ElementGetTextContent(dt_clone);
})();
// IDの取得
if(dt_text.match(new RegExp("ID:([a-zA-Z0-9+/.]{8,10})[●!]{0,2}","i"))){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(new RegExp("(◆(|[ ])[a-zA-Z0-9+/.]{10,12})","i"))){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})\\n \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
// オリジナルエレメントを外す
var i;
var num = original.length;
for(i=0;i<num;i++){
var revise_scroll = new DocumentReviseScroll();
var node = original[i].element;
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
};
response.setAnalyzed();
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
dt:dt,
dd:dd,
parent:dt.parentNode
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「2ちゃんねる掲示板」
// ------------------------------
function PresetScript_ExpandBbs_ScriptInitialize_2ch(){
return "" +
"[\n\t" +
function(info,response){
var work = info.work;
// ------------------------------
// 基本URL抽出
// ------------------------------
var url = document.URL;
var bbs_list = [
{url:"(http://[^.]+\\.2ch\\.net/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"2ch"},
{url:"(http://[^.]+\\.2ch\\.sc/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"2ch.sc"},
{url:"(http://(|[^.]+\\.)machi\\.to/bbs/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"machi"},
{url:"(http://(|[^.]+\\.)machibbs\\.net/[^/]+/[^/]*[0-9]+)",replace:"$1",name:"machibbs"},
{url:"(http://[^.]+\\.bbspink\\.com/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"pink"},
{url:"(http://jbbs\\.shitaraba\\.net/bbs/read.cgi/[^/]+/[0-9]+/[0-9]+)",replace:"$1/",name:"shitaraba"},
{url:"(http://jbbs\\.shitaraba\\.net/[^/]+/[0-9]+/storage/[0-9]+.*)",replace:"$1/",name:"shitaraba_storage"},
{url:"(http://[^.]+\\.kakiko\\.com/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$1/",name:"kakiko"},
{url:"(http://[^.]+\\.60\\.kg/test/read\\.cgi/[^/]+/[0-9]+)",replace:"$0/",name:"kakiko"}
];
var i;
var num = bbs_list.length;
for(i=0;i<num;i++){
var bbs = bbs_list[i];
var re = new RegExp(bbs.url,"i");
var m = url.match(re);
if(m){
work.base_url = m[1].replace(re,bbs.replace);
work.bbs_name = bbs.name;
break;
}
}
return false;
}.toString() +
",\n\n\t" +
function (info,response){
var work = info.work;
if(!(work.bbs_name)){
return false;
}
var first_id = 1;
var last_id = 1;
var dictionary_id = new Array();
var load_shadow_func = null;
var load_more_func = null;
var element_parent = null;
var read_more_button = null;
var element_form = null;
var base_url = work.base_url;
var resource_url_shadow;
var resource_url_more;
// ------------------------------
// 文字列からレスポンス番号を取得
// ------------------------------
work.createResponseAnchorNumbers = function (str){
var numbers = new ResponseAnchorNumbers();
var re_search = new RegExp("^(>>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i");
var re_range = new RegExp("^([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("^([0-90-9]+)","i");
var m = str.match(re_search);
if(m){
var p = m[1].length;
while(true){
// 番号-番号
m = str.substr(p).match(re_range);
if(m){
var id0 = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var id1 = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(id0 < 1) id0 = 1;
if(id1 < 1) id1 = 1;
if(id0 > 10000) id0 = 10000;
if(id1 > 10000) id1 = 10000;
p += m[0].length;
numbers.addNumbers(id0,id1);
}else{
// 番号
m = str.substr(p).match(re_number);
if(m){
p += m[0].length;
var id = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
if(id < 1) id = 1;
if(id > 0x7fffffff) id = 0x7fffffff;
numbers.addNumber(id);
}
}
if(m){
// カンマ
if(RegExp.rightContext.search(",") == 0){
p += 1;
continue;
}
}
break;
}
}
return numbers;
};
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor = function (target){
if(BbsControlResponseAnchorExist(target)) return;
var re_simple = new RegExp("^(>>|<<|>)[-,0-90-9]+$","i");
var re_detail = new RegExp("(>>|<<|>>|<<|>|>|》|≫|>>)(([0-90-9]+[-][0-90-9]+|[0-90-9]+),)*([0-90-9]+[-][0-90-9]+|[0-90-9]+)","i");
var re_range = new RegExp("([0-90-9]+)[-]([0-90-9]+)","i");
var re_number = new RegExp("([0-90-9]+)","i");
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=num-1;i>=0;i--){
var node = nodes[i];
var m = ElementGetTextContent(node).match(re_simple);
if(m){
var text_node = DocumentCreateText(m[0]);
DomNode_InsertBefore(node,text_node);
DomNodeRemove(node);
}
}
// テキストノードを統合
target.normalize();
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(re_detail);
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var element = DocumentCreateElement("a");
ElementSetTextContent(element,m[0]);
DomNode_InsertAfter(node,element);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element,node);
var query = "";
m = ElementGetTextContent(element).match(re_range);
if(m){
var min = parseInt(StringConvertFromNumericFullToNumericHalf(m[1]));
var max = parseInt(StringConvertFromNumericFullToNumericHalf(m[2]));
if(min < 1) min = 1;
if(max < 1) max = 1;
if(min > 10000) min = 10000;
if(max > 10000) max = 10000;
if(max < min){
var tmp = min;
min = max;
max = tmp;
}
query = min + "-" + max;
}else{
// 番号
m = ElementGetTextContent(element).match(re_number);
if(m){
query = parseInt(StringConvertFromNumericFullToNumericHalf(m[0]));
if(query < 1) query = 1;
if(query > 0x7fffffff) query = 0x7fffffff;
}
}
element.href = work.base_url + query;
}
}
}
};
// ------------------------------
// HTML 文書をシャドウ読み込み
// ------------------------------
function loadShadowFromHTML(str){
var re_number;
var re_id = new RegExp("ID:([-a-zA-Z0-9+/.●!]{8,})","i");
var re_name = new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i");
switch(work.bbs_name){
case "2ch":
case "2ch.sc":
case "pink":
case "kakiko":
case "machi":
case "machibbs":
re_number = new RegExp("([0-9]+)","i");
break;
case "shitaraba":
re_number = new RegExp("<a href=\".*?\">([0-9]+)</a> :","i");
break;
}
var p = 0;
var n = str.length;
function f(){
if(p >= n) return;
p = str.indexOf("<dt>",p);
if(p < 0) return;
var e = str.indexOf("\n",p);
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
var nodes = StringHtmlCreateDomNodesSafe(s);
var dt = nodes[0];
var dd = nodes[1];
try{
if(dt.tagName != "DT") return;
if(dd.tagName != "DD") return;
}catch(e){
return;
}
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
if(dt_text.match(re_id)){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(re_name)){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(|\\n) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// HTML 文書を継ぎ足し読み込み
// ------------------------------
function loadMoreFromHTML(str){
var re_number;
switch(work.bbs_name){
case "2ch":
case "2ch.sc":
case "pink":
case "kakiko":
case "machi":
case "machibbs":
re_number = new RegExp("([0-9]+)","i");
break;
case "shitaraba":
re_number = new RegExp("<a href=\".*?\">([0-9]+)</a> :","i");
break;
}
var p = 0;
var n = str.length;
function f(){
try{
if(p >= n) throw 0;
p = str.indexOf("<dt>",p);
if(p < 0) throw 0;
var e = str.indexOf("\n",p);
var s = str.substring(p,e);
var m = s.match(re_number);
if(m){
var id = parseInt(m[1]);
if(last_id < id){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var nodes = StringHtmlCreateDomNodesSafe(s);
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
last_id = id;
resource_url_more = base_url + (last_id) + "-";
}
}
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
read_more_button.init();
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// DAT 文書をシャドウ読み込み
// ------------------------------
function loadShadowFromDAT(str){
var re_search = new RegExp("(.*?)<>(.*?)<>(.*?)<>(.*?)<>","i");
var re_number = new RegExp("([0-9]+)","i");
var re_id = new RegExp("ID:([-a-zA-Z0-9+/.●!]{8,})","i");
var re_name = new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i");
var re_icon = new RegExp("^ sssp://img.2ch.net/ico/(.*?)( <br> .*)$","i");
var p = 0;
var n = str.length;
var id = 1;
function f(){
if(p >= n) return;
var e = str.indexOf("\n",p);
if((first_id <= id) && (id <= last_id)){
}else if(dictionary_id[id]){
}else{
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(id);
if(!(response.getAnalyzed())){
var m = str.substring(p,e).match(re_search);
if(m){
var html = "<dt>" + id + " :";
if(m[2]){
html += "<a href=\"mailto:" + m[2] + "\"><b>" + m[1] + "</b></a>";
}else{
html += "<font color=green><b>" + m[1] + "</b></font>";
}
html += ":" + m[3] + "<dd>";
var msg = m[4];
if(msg.match(re_icon)){
msg = "<img src=\"http://img.2ch.net/ico/" + RegExp.$1 + "\">" + RegExp.$2;
}
html += msg + "<br><br>";
var nodes = StringHtmlCreateDomNodesSafe(html);
var dt = nodes[0];
var dd = nodes[1];
try{
if(dt.tagName != "DT") return;
if(dd.tagName != "DD") return;
}catch(e){
return;
}
var dt_text = ElementGetTextContent(dt);
// レスアンカー拡張
work.extendResponseAnchor(dd);
// IDの取得
if(dt_text.match(re_id)){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(re_name)){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(|\\n) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){};
response.setAnalyzed();
}
}
}
id += 1;
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// DAT 文書を継ぎ足し読み込み
// ------------------------------
function loadMoreFromDAT(str){
// 最後尾 ID
var nodes = ElementGetElementsByTagName(element_parent,"dt");
var node_num = nodes.length;
if(node_num){
if(ElementGetTextContent(nodes[node_num-1]).match(new RegExp("^([0-9]+)[ ]:","i"))){
last_id = parseInt(RegExp.$1);
}
}
var re_search = new RegExp("(.*?)<>(.*?)<>(.*?)<>(.*?)<>","i");
var re_icon = new RegExp("^ sssp://img.2ch.net/ico/(.*?)( <br> .*)$","i");
// レスポンス抽出
var p = 0;
var n = str.length;
var id = 1;
function f(){
try{
if(p >= n) throw 0;
var e = str.indexOf("\n",p);
if(last_id < id){
var m = str.substring(p,e).match(re_search);
if(m){
var response = bbs_dictionary.getResponse(id);
response.clearAnalyzed();
response.clearOriginalElements();
response.clearFollowing();
var html = "<dt>" + id + " :";
if(m[2]){
html += "<a href=\"mailto:" + m[2] + "\"><b>" + m[1] + "</b></a>";
}else{
html += "<font color=green><b>" + m[1] + "</b></font>";
}
html += ":" + m[3] + "<dd>";
var msg = m[4];
if(msg.match(re_icon)){
msg = "<img src=\"http://img.2ch.net/ico/" + RegExp.$1 + "\">" + RegExp.$2;
}
html += msg + "<br><br>";
var nodes = StringHtmlCreateDomNodesSafe(html);
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
element_parent.appendChild(nodes[j]);
}
last_id = id;
}
}
id += 1;
if(p < e){
p = e + 1;
execute_queue.attachFirst(f,null);
return;
}
}catch(e){
}
read_more_button.init();
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// 継ぎ足し読み込み
// ------------------------------
function readMore(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(load_more_func){
load_more_func(str);
}
};
// 失敗
loader.onerror = function(){
read_more_button.init();
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_more);
switch(work.bbs_name){
case "2ch":
case "2ch.sc":
case "machi":
case "machibbs":
case "pink":
case "kakiko":
loader.overrideMimeType("text/plain; charset=Shift_JIS");
break;
case "shitaraba":
loader.overrideMimeType("text/plain; charset=EUC-JP");
break;
}
loader.loadText();
}
// ------------------------------
// レスポンス親要素
// ------------------------------
var i;
var nodes = ElementGetElementsByTagName(document.body,"dl");
var num = nodes.length;
for(i=0;i<num;i++){
element_parent = nodes[i];
break;
}
if(!element_parent) return false;
// ------------------------------
// フォーム位置修正
// ------------------------------
switch(work.bbs_name){
case "machi":
var nodes = ElementGetElementsByTagName(element_parent,"dt");
if(nodes.length){
var dt = nodes[nodes.length - 1];
var node = dt.firstChild;
while(node){
var next = node.nextSibling;
DomNode_InsertAfter(element_parent,node);
node = next;
}
DomNodeRemove(dt);
}
var nodes = ElementGetElementsByTagName(element_parent,"dd");
if(nodes.length){
nodes = ElementGetElementsByTagName(nodes[nodes.length - 1],"br");
if(nodes.length){
var node = nodes[nodes.length - 1];
node = node.nextSibling;
while(node){
var next = node.nextSibling;
DomNode_InsertAfter(element_parent,node);
node = next;
}
}
}
break;
}
// ------------------------------
// 範囲取得
// ------------------------------
var nodes = ElementGetElementsByTagName(element_parent,"dt");
var node_num = nodes.length;
if(node_num){
var re_id = new RegExp("^([0-9]+)","i");
if(ElementGetTextContent(nodes[0]).match(re_id)){
first_id = parseInt(RegExp.$1);
dictionary_id[0] = true;
}
if((first_id == 1) && (node_num > 1)){
if(ElementGetTextContent(nodes[1]).match(re_id)){
first_id = parseInt(RegExp.$1);
dictionary_id[first_id] = true;
if(first_id <= 2) first_id = 1;
}
}
if(ElementGetTextContent(nodes[node_num-1]).match(re_id)){
last_id = parseInt(RegExp.$1);
dictionary_id[last_id] = true;
}
}
// ------------------------------
// 読み込み方式
// ------------------------------
load_shadow_func = loadShadowFromHTML;
load_more_func = loadMoreFromHTML;
// JavaScript モード検出
switch(work.bbs_name){
case "2ch":
case "2ch.sc":
load_shadow_func = loadShadowFromDAT;
var nodes = ElementGetElementsByTagName(DocumentGetHeadElement(document),"meta");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var http_equiv = node.getAttribute("http-equiv");
if(!http_equiv) http_equiv = node.httpEquiv;
if(!http_equiv) continue;
if(http_equiv.toLowerCase() != "content-type") continue;
var content = node.getAttribute("content");
if(!content) content = node.content;
if(!content) continue;
if(content.indexOf("application") == -1) continue;
load_more_func = loadMoreFromDAT;
break;
}
break;
}
// ------------------------------
// アクセス先 URL
// ------------------------------
if(load_more_func == loadMoreFromHTML){
resource_url_more = base_url + last_id + "-";
}else{
if(base_url.match(new RegExp("http://([^/]+)/test/read\\.cgi/([^/]+)/([0-9]+)/","i"))){
resource_url_more = "http://" + RegExp.$1 + "/" + RegExp.$2 + "/dat/" + RegExp.$3 + ".dat";
}
}
if(load_shadow_func == loadShadowFromHTML){
resource_url_shadow = base_url;
}else{
if(base_url.match(new RegExp("http://([^/]+)/test/read\\.cgi/([^/]+)/([0-9]+)/","i"))){
resource_url_shadow = "http://" + RegExp.$1 + "/" + RegExp.$2 + "/dat/" + RegExp.$3 + ".dat";
}
}
// ------------------------------
// BbsControlReadMoreButton 作成
// ------------------------------
read_more_button = new BbsControlReadMoreButton();
read_more_button.setWaitTime(2 * 1000);
read_more_button.onclick = readMore;
DomNode_InsertAfter(element_parent,read_more_button.getElement());
// ------------------------------
// 書き込みをポップアップ化
// ------------------------------
if(load_more_func == loadMoreFromHTML){
(function(){
var element_form;
var input_submit;
var element_textarea;
var event_handler_release;
var task;
(function(){
// フォーム
var nodes = ElementGetElementsByTagName(document.body,"form");
var i;
switch(work.bbs_name){
case "2ch":
case "2ch.sc":
case "pink":
for(i=0;i<nodes.length;i++){
if(nodes[i].action.indexOf("/test/bbs.cgi") >= 0){
element_form = nodes[i];
break;
}
}
break;
case "shitaraba":
for(i=0;i<nodes.length;i++){
if(nodes[i].action.indexOf("/bbs/write.cgi/") >= 0){
element_form = nodes[i];
break;
}
}
break;
}
// サブミットボタン
if(element_form){
var nodes = ElementGetElementsByTagName(element_form,"input");
for(i=0;i<nodes.length;i++){
if(nodes[i].type.toLowerCase() == "submit"){
input_submit = nodes[i];
break;
}
}
var nodes = ElementGetElementsByTagName(element_form,"textarea");
if(nodes.length){
element_textarea = nodes[0];
}
}
})();
// 開放
function release(){
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
removeEvent();
if(task){
task.release();
}
}
// クリア
function clear(){
element_textarea.value = "";
}
// 有効セット
function setEnable(type){
input_submit.disabled = !(type);
}
// イベント追加
function addEvent(){
if(window.addEventListener){
input_submit.addEventListener("click",EventClickButton);
element_form.addEventListener("submit",EventSubmitForm);
}else if(window.attachEvent){
input_submit.attachEvent("onclick",EventClickButton);
element_form.attachEvent("onsubmit",EventSubmitForm);
}
}
// イベント除外
function removeEvent(){
if(window.removeEventListener){
input_submit.removeEventListener("click",EventClickButton);
element_form.removeEventListener("submit",EventSubmitForm);
}else if(window.detachEvent){
input_submit.detachEvent("onclick",EventClickButton);
element_form.detachEvent("onsubmit",EventSubmitForm);
}
}
// サブミット直前に実行されるイベント
function EventSubmitForm(e){
setEnable(false);
}
// クリック時に実行されるイベント
function EventClickButton(e){
var w = 800;
var h = 600;
var cookie = document.cookie;
if(cookie){
if(cookie.indexOf("PREN=") != -1){
w = 600;
h = 450;
}
}
var window_name = "_pageexpand_" + Math.floor(Math.random() * 0x7FFFFFFF);
var popup_iframe = new BbsControlPopupIframe(window_name);
popup_iframe.setWindowSize(w,h);
popup_iframe.onclose = function(){
setEnable(true);
};
var element_iframe = popup_iframe.getIFrameElement();
var window_obj = element_iframe.contentWindow;
element_form.target = window_name;
(function(){
var closed = false;
var timer = null;
// タスク生成
task = task_container.createTask();
task.setDestructorFunc(function(){
task = null;
});
task.setExecuteFunc(function(){
try{
var href = "";
if(window_obj.document){
href = window_obj.document.URL;
}
if(href.indexOf("http://") == 0){
switch(work.bbs_name){
case "2ch":
case "pink":
if(href.indexOf("test/bbs.cgi?guid=") == -1){
closed = true;
}else if(!timer){
var body = window_obj.document.body;
if(body){
if(ElementGetTextContent(body).indexOf("書きこみが終わりました") != -1){
timer = (new Date()).getTime();
}
}
}
break;
case "2ch.sc":
if(href.indexOf("test/bbs.cgi?guid=") == -1){
closed = true;
}else if(!timer){
var body = window_obj.document.body;
if(body){
if(ElementGetTextContent(body).indexOf("書きこみが終わりました") != -1){
timer = (new Date()).getTime();
}
}
}
break;
case "shitaraba":
if(href.indexOf("/bbs/write.cgi/") == -1){
closed = true;
}else if(!timer){
var body = window_obj.document.body;
if(body){
if(ElementGetTextContent(body).indexOf("書きこみが終りました") != -1){
timer = (new Date()).getTime();
}
}
}
break;
}
}
if(timer){
if((new Date()).getTime() - timer > 1000 * 2){
closed = true;
}
}
}catch(e){
closed = true;
}
if(closed){
if(task){
task.release();
}
popup_iframe.close();
setEnable(true);
if(timer){
readMore();
clear();
}
}
});
})();
}
(function(){
if(!element_form) return;
if(!input_submit) return;
if(!element_textarea) return;
addEvent();
event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
release();
});
})();
})();
}
// ------------------------------
// シャドウロード
// ------------------------------
(function(){
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = function(str){
if(load_shadow_func){
load_shadow_func(str);
}
};
// 失敗
loader.onerror = function(){
};
// テキストの読み込み
loader.setMethod("GET");
loader.setURL(resource_url_shadow);
switch(work.bbs_name){
case "2ch":
case "2ch.sc":
case "pink":
loader.overrideMimeType("text/plain; charset=Shift_JIS");
break;
case "shitaraba":
loader.overrideMimeType("text/plain; charset=EUC-JP");
break;
}
loader.loadText();
})();
response({result:true});
return true;
}.toString() +
",\n\n\t" +
function (info,response){
response({result:false});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// 掲示板設定「2ちゃんねる掲示板」
// ------------------------------
function PresetScript_ExpandBbs_ScriptCallback_2ch(){
return "" +
"[\n\t" +
function(info,response){
var element = info.element;
var work = info.work;
// ------------------------------
// レスポンスダイアログを登録
// ------------------------------
function attachBbsResponseDialog(response,node,parent_dialog,type){
// ------------------------------
// レスアンカー
// ------------------------------
function forResponseAnchor(target){
if(BbsControlResponseAnchorExist(target)) return;
// ------------------------------
// BbsControlResponseAnchor を生成
// ------------------------------
(function(){
var i;
var nodes = ElementGetElementsByTagName(target,"a");
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(node));
if(numbers.getCount()){
var control_res_anchor = new BbsControlResponseAnchor(node,false);
control_res_anchor.setResponseAnchorNumbers(numbers);
}
}
})();
// ------------------------------
// BbsControlResponseAnchor を検索
// ------------------------------
BbsControlResponseAnchorSearch(target,function(control_res_anchor){
var element_res_anchor = control_res_anchor.getElement();
var numbers = control_res_anchor.getResponseAnchorNumbers();
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_res_anchor);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var created = false;
var i = 0;
var number_list = numbers.getNumberList();
var num = number_list.length;
if(!num) return false;
function f(){
var following = bbs_dictionary.getResponse(number_list[i]);
var clone = following.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(following,param,response_dialog,"response");
created = true;
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:created});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ID
// ------------------------------
function forId(target){
if(BbsControlIdExist(target)) return;
// ------------------------------
// BbsControlId を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"A":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var m = DomNodeGetNodeValue(node).match(new RegExp("ID:([-a-zA-Z0-9+/.●!]{8,})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlId を生成
var control_id = new BbsControlId(null,false);
control_id.setId(m[1]);
var element_id = control_id.getElement();
ElementSetTextContent(element_id,m[0]);
DomNode_InsertAfter(node,element_id);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_id,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlId を検索
// ------------------------------
BbsControlIdSearch(target,function(control_id){
control_id.setResponse(response);
var id = control_id.getId();
var element_id = control_id.getElement();
var textnode_id = DocumentCreateText("");
element_id.appendChild(textnode_id);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_id.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_id,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_id,"");
}
var style = element_id.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_id.update();
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "id"){
if(response.getId() == id) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_id);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromId(id);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_id = responses[i];
var clone = response_id.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_id,param,response_dialog,"id");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// トリップ
// ------------------------------
function forName(target){
if(BbsControlNameExist(target)) return;
// ------------------------------
// BbsControlName を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
// 本文
var m = DomNodeGetNodeValue(node).match(new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i"));
if(!m) break;
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext);
// BbsControlName を生成
var control_name = new BbsControlName(null,false);
control_name.setName(m[0]);
var element_name = control_name.getElement();
ElementSetTextContent(element_name,m[0]);
DomNode_InsertAfter(node,element_name);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_name,node);
}
break;
}
}
})();
// ------------------------------
// BbsControlName を検索
// ------------------------------
BbsControlNameSearch(target,function(control_name){
control_name.setResponse(response);
var name = control_name.getName();
var element_name = control_name.getElement();
var textnode_name = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_name.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_name,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_name,"");
}
var style = element_name.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
};
control_name.update();
element_name.appendChild(textnode_name);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "name"){
if(response.getName() == name) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_name);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromName(name);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_name = responses[i];
var clone = response_name.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_name,param,response_dialog,"name");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// ホスト
// ------------------------------
function forHost(target){
if(BbsControlHostExist(target)) return;
// ------------------------------
// BbsControlHost を生成
// ------------------------------
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:target};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
while(node){
var text_value = DomNodeGetNodeValue(node);
var m = text_value.match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})((|\\n) \\])","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText("\n ]" + RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
var m = text_value.match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 元のテキストノード
DomNodeSetNodeValue(node,RegExp.leftContext + m[1]);
// BbsControlHost を生成
var control_host = new BbsControlHost(null,false);
control_host.setHost(m[2]);
var element_host = control_host.getElement();
ElementSetTextContent(element_host,m[2]);
DomNode_InsertAfter(node,element_host);
// 直後テキスト
node = DocumentCreateText(RegExp.rightContext);
DomNode_InsertAfter(element_host,node);
continue;
}
break;
}
break;
}
}
})();
// ------------------------------
// BbsControlHost を検索
// ------------------------------
BbsControlHostSearch(target,function(control_host){
control_host.setResponse(response);
var host = control_host.getHost();
var element_host = control_host.getElement();
var textnode_host = DocumentCreateText("");
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_host.onchange = function(count){
if(count > 1){
DomNodeSetNodeValue(textnode_host,"(" + count + ")");
}else{
DomNodeSetNodeValue(textnode_host,"");
}
var style = element_host.style;
if(count >= 5){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else if(count >= 2){
StyleDeclarationRemoveProperty(style,"color");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","80%");
}
};
control_host.update();
element_host.appendChild(textnode_host);
// ------------------------------
// ポップアップ化
// ------------------------------
if(type == "host"){
if(response.getHost() == host) return null;
}
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_host);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var responses = bbs_dictionary.getResponsesFromHost(host);
var i = 0;
var num = responses.length;
if(num <= 1) return false;
function f(){
var response_host = responses[i];
var clone = response_host.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(response_host,param,response_dialog,"host");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
return null;
});
}
// ------------------------------
// フォロワー
// ------------------------------
function forFollower(target){
if(BbsControlFollowerExist(target)) return;
// ------------------------------
// BbsControlFollower を生成
// ------------------------------
var control_follower = new BbsControlFollower(null,true);
control_follower.setResponse(response);
var element_follower = control_follower.getElement();
var textnode_follower = DocumentCreateText("");
element_follower.appendChild(textnode_follower);
// ------------------------------
// 変化があったときに実行されるイベント
// ------------------------------
control_follower.onchange = function(count){
if(count){
textnode_follower.nodeValue = " follower(" + count + ")";
}else{
textnode_follower.nodeValue = "";
}
var style = element_follower.style;
if(count >= 3){
StyleDeclarationSetProperty(style,"color","#e80000");
StyleDeclarationRemoveProperty(style,"font-size");
}else{
StyleDeclarationSetProperty(style,"color","#888");
StyleDeclarationSetProperty(style,"font-size","small");
}
if(count){
StyleDeclarationSetProperty(style,"margin","0px 4px 0px 0px");
}else{
StyleDeclarationRemoveProperty(style,"margin");
}
};
control_follower.update();
var nodes = ElementGetElementsByTagName(target,"br");
if(nodes.length){
DomNode_InsertBefore(nodes[0],element_follower);
}else{
target.appendChild(element_follower);
}
// ------------------------------
// ポップアップ化
// ------------------------------
// ダイアログを作成
var response_dialog = new BbsResponseDialog();
if(parent_dialog) parent_dialog.attachChild(response_dialog);
response_dialog.setElementParent(node.parent);
response_dialog.setElementHitArea(element_follower);
response_dialog.oncreate = function(_window,callback){
var dl = DocumentCreateElement("dl");
dl.style.margin = "0px";
_window.appendChild(dl);
var ary = response.getFollower();
var i = 0;
var num = ary.length;
if(num <= 0) return false;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
var clone = follower.getCloneElements();
var j;
var clone_num = clone.length;
if(clone_num){
var param = new Object();
param.parent = node.parent;
for(j=0;j<clone_num;j++){
var obj = clone[j];
param[obj.name] = obj.element;
dl.appendChild(obj.element);
}
// レスポンスダイアログを登録
attachBbsResponseDialog(follower,param,response_dialog,"response");
}
i += 1;
if(i < num){
execute_queue.attachFirst(f,null);
}else{
callback({result:true});
}
}
execute_queue.attachFirst(f,null);
};
}
if(node.dt){
forResponseAnchor(node.dt);
forId(node.dt);
forName(node.dt);
forHost(node.dt);
forFollower(node.dt);
}
if(node.dd){
forResponseAnchor(node.dd);
forId(node.dd);
forName(node.dd);
}
}
// ------------------------------
// エレメントを解析
// ------------------------------
var useful = (function(){
var dt = element;
var dd;
try{
if(dt.tagName != "DT") return false;
}catch(e){
return false;
}
dd = dt.nextSibling;
try{
if(dd.tagName != "DD") return false;
}catch(e){
return false;
}
try{
var dl = dt.parentNode;
if(dl.tagName != "DL") return false;
switch(work.bbs_name){
case "2ch":
case "pink":
break;
case "shitaraba":
case "machi":
if(dl.parentNode.parentNode != document.body) return false;
break;
default:
if(dl.parentNode != document.body) return false;
break;
}
}catch(e){
return false;
}
// document に未登録
if(!DomNodeGetAttachedDocument(dt)) return false;
// ------------------------------
// レスアンカー拡張
// ------------------------------
work.extendResponseAnchor(dd);
// ------------------------------
// クリーンアップ
// ------------------------------
(function(){
function cleanup(target){
BbsControlSearchTrash(target,function(element){
var node = element.firstChild;
if(!node) return null;
if(node.nodeType != 3) return null;
// ID
var m = node.nodeValue.match(new RegExp("^ID:([-a-zA-Z0-9+/.●!]{8,})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// トリップ
var m = node.nodeValue.match(new RegExp("^(◆[a-zA-Z0-9+/.]{10,12})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
return null;
}
// ホスト名
var m = node.nodeValue.match(new RegExp("^([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
var m = node.nodeValue.match(new RegExp("^([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
// 直後テキスト
var node = DocumentCreateText(m[0]);
DomNode_InsertAfter(element,node);
DomNodeRemove(element);
// テキストノードを統合
node.parentNode.normalize();
return null;
}
return null;
});
}
if(dt){
cleanup(dt);
}
if(dd){
cleanup(dd);
}
})();
// ナンバーを取得
var dt_text = ElementGetTextContent(dt);
if(!(dt_text.match(new RegExp("^([0-9]+)[ ]","i")))) return false;
// ナンバーからレスポンスオブジェクトを取得
var response = bbs_dictionary.getResponse(parseInt(RegExp.$1));
// レスポンス解析
if(!response.getAnalyzed()){
// IDの取得
if(dt_text.match(new RegExp("ID:([-a-zA-Z0-9+/.●!]{8,})","i"))){
response.setId(RegExp.$1);
}
// 名前の取得
if(dt_text.match(new RegExp("(◆[a-zA-Z0-9+/.]{10,12})","i"))){
response.setName(RegExp.$1);
}
// ホスト名の取得
(function(){
var p;
var n;
var q;
var ignore_dictionary = {"B":1,"SCRIPT":1};
var queue = new Object();
q = {p:queue,n:queue,node:dt};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
if(!(ignore_dictionary[node.tagName])){
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
}
break;
case 3:
var m = DomNodeGetNodeValue(node).match(new RegExp("(^|HOST:)([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(\\[ )([-._a-zA-Z0-9]{1,}(\\.[-._a-zA-Z0-9]{1,}){2,})(|\\n) \\]","i"));
if(m){
response.setHost(m[2]);
return;
}
var m = DomNodeGetNodeValue(node).match(new RegExp("(発信元:)([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})","i"));
if(m){
response.setHost(m[2]);
return;
}
break;
}
}
})();
// フォロー解析
var dictionary = new Object();
(function(){
var nodes = ElementGetElementsByTagName(dd,"a");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var numbers = work.createResponseAnchorNumbers(ElementGetTextContent(nodes[i]));
numbers.getNumbers(function(n){
if(!dictionary[n]){
var following = bbs_dictionary.getResponse(n);
following.addFollower(response);
dictionary[n] = true;
}
});
}
})();
// オリジナルエレメントをセット
if(dt) response.addOriginalElements("dt",dt);
if(dd) response.addOriginalElements("dd",dd);
// 消去時に実行されるイベント
response.onerase = function(){
var original = response.getOriginalElements();
// オリジナルエレメントを外す
var i;
var num = original.length;
for(i=0;i<num;i++){
var revise_scroll = new DocumentReviseScroll();
var node = original[i].element;
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
}
};
response.setAnalyzed();
}
var dl = document.body;
var node = dt;
while(node){
if(node.tagName == "DL"){
dl = node;
}
node = node.parentNode;
}
// レスポンスダイアログを登録(ルート)
attachBbsResponseDialog(
response,
{
dt:dt,
dd:dd,
parent:dl
},
null,
null
);
return true;
})();
response({useful:useful});
return true;
}.toString() +
"\n]";
}
// ------------------------------
// PageExpand デバッグ
// ------------------------------
function PageExpandDebug(){
var _this = this;
// ------------------------------
// 解放
// ------------------------------
_this.release = function (){
if(_analyze_work){
// 解析辞書除外
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
// タスク解放
if(_task){
_task.release();
_task = null;
}
// ウィンドウ破棄
if(_window){
DomNodeRemove(_window);
_window = null;
}
};
// ------------------------------
// 要素生成
// ------------------------------
function createElement(){
// 解放
_this.release();
// ウィンドウ
var style;
var container = DocumentCreateElement("div");
ElementSetStyle(container,"width:220px;border:3px #888 outset; padding:0px; margin:0px; right:5px; bottom:5px; position:fixed; text-align:left; color:#000; font-size:12px; line-height:1.0; z-index:2147483647;");
_window = container;
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_window);
// 解析無効化
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_window);
_observer_remove.setFunction(_this.release);
var background = DocumentCreateElement("div");
ElementSetStyle(background,"background-color:#FFF; line-height:1.0; border:1px #ccc solid; padding:0px; margin:0px; opacity:0.8;");
container.appendChild(background);
// PageExpandDebug
var debug_msg = DocumentCreateElement("div");
ElementSetStyle(debug_msg,"font-weight:bold; text-align:left; color:#000; line-height:1.0; background-color:#ccc; padding:2px 5px; margin:0px 0px 2px; position:relative;");
ElementSetTextContent(debug_msg,"PageExpand Debug");
background.appendChild(debug_msg);
// 閉じるボタン
var close_msg = DocumentCreateElement("div");
ElementSetStyle(close_msg,"width:12px; position:absolute; right:1px; top:1px; bottom:1px; border:1px #888 solid; background:#ddd; line-height:1.0;");
ElementSetTextContent(close_msg,"");
debug_msg.appendChild(close_msg);
close_msg.onclick = function(){
_this.release();
};
var element;
var css_text_msg = "text-align:left; color:#000; font-size:12px; line-height:1.0;";
// 実行キュー数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 0px; " + css_text_msg);
background.appendChild(element);
var execute_queue_msg = new UI_Text(element);
// 実行フェーズ
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 0px; " + css_text_msg);
background.appendChild(element);
var execute_queue_phase_msg = new UI_Text(element);
// 実行キューエラー数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 0px; " + css_text_msg);
background.appendChild(element);
var execute_queue_error_msg = new UI_Text(element);
// ローダーキュー数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 0px; " + css_text_msg);
background.appendChild(element);
var loader_queue_msg = new UI_Text(element);
// ローダーキューエラー数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var loader_queue_error_msg = new UI_Text(element);
// ローダースレッド数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 1px; " + css_text_msg);
background.appendChild(element);
var loader_thread_msg = new UI_Text(element);
// ローダースレッドメーター
var loader_thread_meter = new UI_ProgressBar(background);
// タスク数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var task_count_msg = new UI_Text(element);
// イメージ数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var image_count_msg = new UI_Text(element);
// イメージスレッド数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 1px; " + css_text_msg);
background.appendChild(element);
var image_thread_msg = new UI_Text(element);
// イメージスレッドメーター
var image_thread_meter = new UI_ProgressBar(background);
// サウンド数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var sound_count_msg = new UI_Text(element);
// サウンドスレッド数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 1px; " + css_text_msg);
background.appendChild(element);
var sound_thread_msg = new UI_Text(element);
// サウンドスレッドメーター
var sound_thread_meter = new UI_ProgressBar(background);
// ビデオ数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var video_count_msg = new UI_Text(element);
// ビデオスレッド数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 1px; " + css_text_msg);
background.appendChild(element);
var video_thread_msg = new UI_Text(element);
// ビデオスレッドメーター
var video_thread_meter = new UI_ProgressBar(background);
if(1){
// ダウンローダーキュー数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 0px; " + css_text_msg);
background.appendChild(element);
var downloader_queue_msg = new UI_Text(element);
// ダウンローダーキューエラー数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var downloader_queue_error_msg = new UI_Text(element);
// ダウンローダースレッド数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 1px; " + css_text_msg);
background.appendChild(element);
var downloader_thread_msg = new UI_Text(element);
// ダウンローダースレッドメーター
var downloader_thread_meter = new UI_ProgressBar(background);
}
// リムーブ監視数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var observer_remove_msg = new UI_Text(element);
// 変更監視数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var observer_modify_msg = new UI_Text(element);
// スクロール監視数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var observer_scroll_msg = new UI_Text(element);
// アドレス数
element = DocumentCreateElement("div");
ElementSetStyle(element,"margin:0px 5px 2px; " + css_text_msg);
background.appendChild(element);
var address_count_msg = new UI_Text(element);
var execute_queue_phase_msg_list = [
"interrupt",
"remove",
"insert",
"bbs",
"analyze",
"element",
"text",
"complete",
""
]
// タスク実行
_task = task_container.createTask();
_task.setExecuteFunc(function(task){
// 表示更新
execute_queue_msg.setText("execute queue: " + execute_queue.getCountQueue());
execute_queue_phase_msg.setText("execute phase: " + execute_queue_phase_msg_list[execute_queue.getPhase()]);
execute_queue_error_msg.setText("execute error: " + execute_queue.getCountError());
loader_queue_msg.setText("loader queue: " + loader_queue.getCountQueue());
loader_queue_error_msg.setText("loader error: " + loader_queue.getCountError());
loader_thread_msg.setText("loader thread: " + loader_queue.getCountThread() + " / " + loader_queue.getMaxThread());
loader_thread_meter.setValue(loader_queue.getCountThread());
loader_thread_meter.setMaximum(loader_queue.getMaxThread());
task_count_msg.setText("task count: " + task_container.getCountTask());
var use_size = Math.floor(element_limitter_image.getByteSizeNow() / 1024 / 1024 * 100) / 100;
image_count_msg.setText("image size: " + use_size);
image_thread_msg.setText("image thread: " + element_limitter_image.getCountUse() + " / " + element_limitter_image.getCount());
image_thread_meter.setValue(element_limitter_image.getCountUse());
image_thread_meter.setMaximum(element_limitter_image.getCount());
sound_count_msg.setText("sound count: " + element_limitter_sound.getCount());
sound_thread_msg.setText("sound thread: " + element_limitter_sound.getCountUse() + " / " + element_limitter_sound.getMaxUse());
sound_thread_meter.setValue(element_limitter_sound.getCountUse());
sound_thread_meter.setMaximum(element_limitter_sound.getMaxUse());
video_count_msg.setText("video count: " + element_limitter_video.getCount());
video_thread_msg.setText("video thread: " + element_limitter_video.getCountUse() + " / " + element_limitter_video.getMaxUse());
video_thread_meter.setValue(element_limitter_video.getCountUse());
video_thread_meter.setMaximum(element_limitter_video.getMaxUse());
if(1){
downloader_queue_msg.setText("download queue: " + downloader_queue.getCountQueue());
downloader_queue_error_msg.setText("download error: " + downloader_queue.getCountError());
downloader_thread_msg.setText("download thread: " + downloader_queue.getCountThread() + " / " + downloader_queue.getMaxThread());
downloader_thread_meter.setValue(downloader_queue.getCountThread());
downloader_thread_meter.setMaximum(downloader_queue.getMaxThread());
}
observer_remove_msg.setText("observer remove: " + document_observer_remove_node.getCount());
observer_modify_msg.setText("observer modify: " + document_observer_modify_node.getCount());
observer_scroll_msg.setText("observer scroll: " + document_observer_scroll.getCount());
address_count_msg.setText("src count: " + address_collection.getCountAddress());
});
_task.execute(0xffffffff);
document.body.appendChild(_window);
}
// ------------------------------
// 表示をセット
// ------------------------------
_this.setVisible = function (type){
_visible = type;
if(_visible){
// フレーム内では動作させない
if (WindowIsChild(window)){
}else{
createElement();
}
}else{
_this.release();
}
};
// ------------------------------
// テキスト(内部用)
// ------------------------------
function UI_Text(parent){
var _this = this;
// ------------------------------
// テキストをセット
// ------------------------------
_this.setText = function(value){
if(_text != value){
_text = value;
DomNodeSetNodeValue(_node,_text);
}
};
// ------------------------------
// プライベート変数
// ------------------------------
var _node;
var _text;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_node = DocumentCreateText("");
parent.appendChild(_node);
})();
}
// ------------------------------
// ブログレスバー(内部用)
// ------------------------------
function UI_ProgressBar(parent){
var _this = this;
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(value){
if(_now != value){
_now = value;
update();
}
};
// ------------------------------
// 最大値をセット
// ------------------------------
_this.setMaximum = function(value){
if(_max != value){
_max = value;
update();
}
};
// ------------------------------
// 更新(内部用)
// ------------------------------
function update(){
var percent = 0;
if(_max){
percent = Math.floor(_now / _max * 100);
}
_bar.style.width = percent + "%";
}
// ------------------------------
// プライベート変数
// ------------------------------
var _mater;
var _bar;
var _now;
var _max;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_now = 0;
_max = 0;
_mater = DocumentCreateElement("div");
ElementSetStyle(_mater,"height:2px; min-height:0; border:1px #888 solid; margin:0px 5px 2px; line-height:1.0;");
parent.appendChild(_mater);
_bar = DocumentCreateElement("div");
ElementSetStyle(_bar,"height:2px; min-height:0; background-color :#888; margin:0px 0px 2px; width:0%; line-height:1.0;");
_mater.appendChild(_bar);
})();
}
// ------------------------------
// プライベート変数
// ------------------------------
var _window;
var _task;
var _analyze_work;
var _observer_remove;
var _visible;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_visible = false;
})();
}
// ------------------------------
// PageExpand コンフィグ
// ------------------------------
function PageExpandConfig(){
var _config = new Object();
// ------------------------------
// メニューアイテム
// ------------------------------
function MenuItemCreate(label,id){
var _this = this;
// ------------------------------
// 通常状態
// ------------------------------
_this.normal = function(){
_item.onmouseout = _this.normal;
_item.onmouseover = _this.over;
_item.onmousedown = click;
_style.fontSize = "12px";
_style.width = "230px";
_style.boxShadow = "";
_style.padding = "2px 10px 2px 0px";
_style.marginTop = "0px";
_style.marginBottom = "1px";
_brightness = 0.75;
updateBackgroundColor();
};
// ------------------------------
// マウスオーバー状態
// ------------------------------
_this.over = function(){
_this.normal();
_style.width = "240px";
_brightness = 0.9375;
updateBackgroundColor();
};
// ------------------------------
// 選択状態
// ------------------------------
_this.active = function(){
_item.onmouseover = null;
_item.onmouseout = null;
_item.onmousedown = null;
_style.fontSize = "16px";
_style.width = "250px";
_style.padding = "10px 5px 10px 0px";
_style.marginTop = "2px";
_style.marginBottom = "3px";
var brightness = 0.25;
var r = (_color >> 16) & 0xFF;
var g = (_color >> 8) & 0xFF;
var b = (_color >> 0) & 0xFF;
r = Math.floor(r * brightness);
g = Math.floor(g * brightness);
b = Math.floor(b * brightness);
_style.boxShadow = "0px 1px 2px #" + r.toString(16) + g.toString(16) + b.toString(16);
var brightness = 1.0;
var r = (_color >> 16) & 0xFF;
var g = (_color >> 8) & 0xFF;
var b = (_color >> 0) & 0xFF;
r = Math.floor(r * brightness);
g = Math.floor(g * brightness);
b = Math.floor(b * brightness);
var liner_gradient = "linear-gradient(left, #" + r.toString(16) + g.toString(16) + b.toString(16) + " 25px, #ffffff 25px)";
_style.background = "#FFF";
_style.backgroundImage = liner_gradient;
var none = {"none":1,"initial":1};
if(none[_style.backgroundImage]) _style.backgroundImage = "-webkit-" + liner_gradient;
if(none[_style.backgroundImage]) _style.backgroundImage = "-moz-" + liner_gradient;
if(none[_style.backgroundImage]) _style.backgroundImage = "-ms-" + liner_gradient;
if(none[_style.backgroundImage]) _style.backgroundImage = "-o-" + liner_gradient;
_brightness = 1.0;
};
// ------------------------------
// サポート状態をセット
// ------------------------------
_this.setSupport = function(type){
if(type) _item.style.color = "#000";
else _item.style.color = "#888";
};
// ------------------------------
// 背景カラーをセット
// ------------------------------
_this.setBackgroundColor = function(argb){
_color = argb;
updateBackgroundColor();
};
// ------------------------------
// 背景カラー更新
// ------------------------------
function updateBackgroundColor(){
var r = (_color >> 16) & 0xFF;
var g = (_color >> 8) & 0xFF;
var b = (_color >> 0) & 0xFF;
r = Math.floor(r * _brightness);
g = Math.floor(g * _brightness);
b = Math.floor(b * _brightness);
_style.background = "#" + r.toString(16) + g.toString(16) + b.toString(16);
}
// ------------------------------
// クリック時のイベント
// ------------------------------
function click(){
_config.pushHistory(id);
_config.MenuItemSelect(id);
}
// ------------------------------
// プライベート変数
// ------------------------------
var _item;
var _style;
var _color;
var _brightness;
// ------------------------------
// 初期化
// ------------------------------
_item = DocumentCreateElement("a");
_item.href = "";
_item.onclick = function(){ return false; };
ElementSetStyle(_item,"display:block; width:250px; text-decoration:none; text-align:right; padding:5px 10px 5px 0px; margin:0px 0px 2px auto; border-radius:5px 0px 0px 5px;");
_style = _item.style;
ElementSetTextContent(_item,label);
_menu_window.appendChild(_item);
_color = 0xFFFFFFFF;
_brightness = 1.0;
updateBackgroundColor();
}
// ------------------------------
// 履歴を作成
// ------------------------------
_config.pushHistory = function(id){
// 履歴更新
var index = _history_state.index;
_history_state.scroll_pos = WindowGetScrollPosition(window);
history.replaceState({ index:index , menu:_history_state.selected_menu }, "", "");
// 履歴作成
index += 1;
_history_state_list[index] = _history_state = { index:index , selected_menu:id };
history.pushState({ index:index , menu:id }, "", "");
};
// ------------------------------
// メニューアイテム選択
// ------------------------------
_config.MenuItemSelect = function(id){
var param = _menu_item_param[id];
var i;
var num = _menu_items.length;
var item;
for(i=0;i<num;i++){
// すべて未選択
item = _menu_items[i];
item.normal();
}
item = _menu_items[id];
item.active();
ContentClear();
_history_state.selected_menu = id;
if(param.callback){
return (new param.callback());
}
return null;
};
// ------------------------------
// コンテンツクリア
// ------------------------------
function ContentClear(){
// エレメントを全てクリア
var child_nodes = _content_window.childNodes;
var i;
var num = child_nodes.length;
for(i=num-1;i >= 0;i--){
var node = child_nodes[i];
DomNodeRemove(node);
}
WindowSetScrollPositionY (window,0);
}
// ------------------------------
// 基本設定
// ------------------------------
function ContentSettingStandard(){
var _this = this;
// ------------------------------
// プライベート変数
// ------------------------------
var _combo_box_filter_url;
var _text_area_filter_url;
var _check_box_enable_icon_address_bar;
var _check_box_enable_context_menu;
var _check_box_enable_startup;
var _check_box_enable_debug_mode;
var _check_box_enable_output_log;
var _check_box_enable_input_touch;
var _check_box_enable_double_touch_assist;
var _stepper_execute_queue_time_occupancy;
var _stepper_execute_queue_sleep_time;
var _button_storage_sync_load;
var _button_storage_sync_save;
var _button_storage_sync_delete;
var _button_export;
var _button_import;
var _button_reset;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var standard = page_expand_project.getObject().standard;
// タイトル
var title = new UI_Title(_content_window,_i18n.getMessage("menu_setting_standard"));
// 動作を制限する
var container = new UI_LineContainer(_content_window,_i18n.getMessage("menu_setting_standard_filter_url"));
var parent = container.getElement();
_combo_box_filter_url = new UI_ComboBox(parent);
_combo_box_filter_url.attachItem(_i18n.getMessage("menu_setting_standard_filter_url_combo_box_item_deny"),"deny");
_combo_box_filter_url.attachItem(_i18n.getMessage("menu_setting_standard_filter_url_combo_box_item_allow"),"allow");
_combo_box_filter_url.onchange = function(v){
standard.filter_type = v;
filterTypeUpdate();
projectModify();
};
_text_area_filter_url = new UI_TextArea(parent);
_text_area_filter_url.oninput = function(v){
var filter = _text_area_filter_url.spiritByLine();
switch(standard.filter_type){
case "deny":
standard.filter_deny = filter;
break;
default:
standard.filter_allow = filter;
break;
}
projectModify();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_standard_filter_url_hint"));
// 基本設定
var container = new UI_InlineContainer(_content_window,_i18n.getMessage("menu_setting_standard_check_box_container"));
container.setWidth(400);
var parent = container.getElement();
// アドレスバーアイコンが有効であるか
_check_box_enable_icon_address_bar = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_standard_enable_icon_address_bar"));
_check_box_enable_icon_address_bar.onchange = function(v){
standard.enable_icon_address_bar = v;
projectModify();
};
// コンテキストメニューが有効か
_check_box_enable_context_menu = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_standard_enable_context_menu"));
_check_box_enable_context_menu.onchange = function(v){
standard.enable_context_menu = v;
projectModify();
};
// ロード完了時から動作を開始するか
_check_box_enable_startup = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_standard_enable_startup"));
_check_box_enable_startup.onchange = function(v){
standard.enable_startup = v;
projectModify();
};
// デバッグモードが有効であるか
_check_box_enable_debug_mode = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_standard_enable_debug_mode"));
_check_box_enable_debug_mode.onchange = function(v){
standard.enable_debug_mode = v;
projectModify();
};
// ログ出力が有効であるか
_check_box_enable_output_log = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_standard_enable_output_log"));
_check_box_enable_output_log.onchange = function(v){
standard.enable_output_log = v;
projectModify();
};
// タッチ操作設定
var container = new UI_InlineContainer(_content_window,_i18n.getMessage("menu_setting_standard_touch"));
container.setWidth(400);
var parent = container.getElement();
// タッチ操作を有効
_check_box_enable_input_touch = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_standard_enable_input_touch"));
_check_box_enable_input_touch.onchange = function(v){
standard.enable_input_touch = v;
projectModify();
};
// ダブルタッチ補助線を表示
_check_box_enable_double_touch_assist = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_standard_enable_double_touch_assist"));
_check_box_enable_double_touch_assist.onchange = function(v){
standard.enable_double_touch_assist = v;
projectModify();
};
// 実行キュー設定
var container = new UI_LineContainer(_content_window,_i18n.getMessage("menu_setting_standard_execute_queue"));
var parent = container.getElement();
// 最大CPU占有時間
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_standard_execute_queue_time_occupancy"));
_stepper_execute_queue_time_occupancy = new UI_NumericStepper(parent);
_stepper_execute_queue_time_occupancy.setMinimum(0);
_stepper_execute_queue_time_occupancy.setMaximum(5000);
_stepper_execute_queue_time_occupancy.oninput = function(v){
standard.execute_queue.time_occupancy = v;
projectModify();
};
// スリープ時間
new UI_Text(parent,_i18n.getMessage("menu_setting_standard_execute_queue_time_sleep"));
_stepper_execute_queue_sleep_time = new UI_NumericStepper(parent);
_stepper_execute_queue_sleep_time.setMinimum(0);
_stepper_execute_queue_sleep_time.setMaximum(1000);
_stepper_execute_queue_sleep_time.oninput = function(v){
standard.execute_queue.time_sleep = v;
projectModify();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_standard_execute_queue_hint"));
// 設定のエクスポート / インポート
var container = new UI_LineContainer(_content_window,_i18n.getMessage("menu_setting_standard_export_import"));
var parent = container.getElement();
// エクスポート
_button_export = new UI_InlineButton(parent,_i18n.getMessage("menu_setting_standard_export_button"));
_button_export.onclick = function(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_standard_export_dialog"));
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_standard_export_dialog_export"));
var parent = container.getElement();
var text_area = new UI_TextArea(parent);
new UI_TextHint(parent,_i18n.getMessage("menu_setting_standard_export_dialog_export_hint"));
// Ok ボタン
var yes_no_button = new UI_OkButton(dialog_parent);
yes_no_button.setEnable(false);
yes_no_button.onclick = function(v){
// ダイアログ終了
dialog.close();
};
projectSave(function(e){
var export_obj = page_expand_project.exportObject();
// プリセットを除去
export_obj = PageExpandProjectObjectRemovePreset(export_obj);
export_obj.setting_export = {
type:"setting"
};
text_area.setValue(JsonStringify(export_obj));
yes_no_button.setEnable(true);
});
// ダイアログ開始
dialog.open();
};
// インポート
_button_import = new UI_InlineButton(parent,_i18n.getMessage("menu_setting_standard_import_button"));
_button_import.onclick = function(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_standard_import_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_standard_import_dialog_explanation"));
var parent = container.getElement();
var unordered_list = new UI_UnorderedList(parent);
unordered_list.addListItem(_i18n.getMessage("menu_setting_standard_import_dialog_explanation_0"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_standard_import_dialog_explanation_1"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_standard_import_dialog_explanation_2"));
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_standard_import_dialog_import"));
var parent = container.getElement();
var text_area_import = new UI_TextArea(parent);
new UI_TextHint(parent,_i18n.getMessage("menu_setting_standard_import_dialog_import_hint"));
// 実行しますか?
var container = new UI_LineContainer(dialog_parent,null);
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_standard_import_dialog_confirm"));
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(!v){
// ダイアログ終了
dialog.close();
return;
}
function ImportFailure(message){
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_standard_import_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_standard_import_alert_failure"));
new UI_Text(alert_dialog.getElement(),message);
alert_dialog.oncomplete = function(){
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
}
try{
var proj_obj = page_expand_project.getObject();
var proj_new = new PageExpandProject();
var import_obj = JsonParse(text_area_import.getValue());
// バージョンが一致しない
if(import_obj.version > proj_obj.version){
throw "Error: It is a version not supported.";
}
// 出力タイプチェック
var error = true;
try{
// v1.0.3 以前
if(!(import_obj.setting_export)){
error = false;
}else{
switch(import_obj.setting_export.type){
case "setting":
error = false;
break;
}
}
}catch(e){}
if(error){
throw "Error: It is a type not supported.";
}
delete import_obj.setting_export;
// プリセットを付加
import_obj = PageExpandProjectObjectAppendPreset(import_obj);
proj_new.importObject(import_obj);
page_expand_project = proj_new;
projectSave(function(e){
if(!e.result){
ImportFailure(e.message);
return;
}
text_area_import.setValue("");
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_standard_import_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_standard_import_alert_success"));
alert_dialog.oncomplete = function(){
// フェードアウト完了後
dialog.oncomplete = function(){
// PageExpandConfig を再構築
initialize();
// 基本設定を選択
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_STANDARD);
};
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
});
}catch(e){
ImportFailure(e);
}
};
// ダイアログ開始
dialog.open();
};
// 設定の初期化
var container = new UI_LineContainer(_content_window,_i18n.getMessage("menu_setting_standard_reset"));
var parent = container.getElement();
_button_reset = new UI_LineButton(parent,_i18n.getMessage("menu_setting_standard_reset_button"));
_button_reset.onclick = function(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_standard_reset_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_standard_reset_dialog_explanation"));
var parent = container.getElement();
var unordered_list = new UI_UnorderedList(parent);
unordered_list.addListItem(_i18n.getMessage("menu_setting_standard_reset_dialog_explanation_0"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_standard_reset_dialog_explanation_1"));
new UI_Text(parent,_i18n.getMessage("menu_setting_standard_reset_dialog_confirm"));
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(!v){
// ダイアログ終了
dialog.close();
return;
}
function LocalStorageDeleteFailure(message){
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_standard_reset_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_standard_reset_alert_failure"));
new UI_Text(alert_dialog.getElement(),message);
alert_dialog.oncomplete = function(){
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
}
try{
// プロジェクトを破棄
projectDelete(function(result){
page_expand_project = new PageExpandProject();
page_expand_project.initialize();
projectSave(function(e){
if(!e.result){
LocalStorageDeleteFailure(e.message);
return;
}
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_standard_reset_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_standard_reset_alert_success"));
alert_dialog.oncomplete = function(){
// フェードアウト完了後
dialog.oncomplete = function(){
// PageExpandConfig を再構築
initialize();
// 基本設定を選択
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_STANDARD);
};
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
});
});
}catch(e){
LocalStorageDeleteFailure(e);
}
};
// ダイアログ開始
dialog.open();
};
// フィルタタイプ
_combo_box_filter_url.setValue( standard.filter_type);
function filterTypeUpdate(){
switch(standard.filter_type){
case "deny":
_text_area_filter_url.joinArray(standard.filter_deny,"\n");
break;
default:
_text_area_filter_url.joinArray(standard.filter_allow,"\n");
break;
}
}
filterTypeUpdate();
// アドレスバーアイコンが有効であるか
_check_box_enable_icon_address_bar.setValue(standard.enable_icon_address_bar);
// コンテキストメニューが有効か
_check_box_enable_context_menu.setValue(standard.enable_context_menu);
// ロード完了時から動作を開始するか
_check_box_enable_startup.setValue(standard.enable_startup);
// デバッグモードが有効であるか
_check_box_enable_debug_mode.setValue(standard.enable_debug_mode);
// ログ出力が有効であるか
_check_box_enable_output_log.setValue(standard.enable_output_log);
// タッチ操作が有効であるか
_check_box_enable_input_touch.setValue(standard.enable_input_touch);
// ダブルタッチ操作補助線を表示するか
_check_box_enable_double_touch_assist.setValue(standard.enable_double_touch_assist);
// 最大CPU占有時間
_stepper_execute_queue_time_occupancy.setValue(standard.execute_queue.time_occupancy);
// スリープ時間
_stepper_execute_queue_sleep_time.setValue(standard.execute_queue.time_sleep);
})();
}
// ------------------------------
// ダウンロード設定
// ------------------------------
function ContentSettingDownload(){
var _this = this;
// ------------------------------
// プライベート変数
// ------------------------------
var _stepper_load_thread_max;
var _stepper_load_timeout;
var _stepper_download_thread_max;
var _combo_box_conflict_type;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var download = page_expand_project.getObject().download;
// タイトル
var title = new UI_Title(_content_window,_i18n.getMessage("menu_setting_download"));
// ロード設定
var title = new UI_TitleSub(_content_window,_i18n.getMessage("menu_setting_download_load"));
// グループ
var group = new UI_GroupContainer(_content_window);
var group_parent = group.getElement();
// 最大同時ロード数
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_download_load_thread_max"));
var parent = container.getElement();
_stepper_load_thread_max = new UI_NumericStepper(parent);
_stepper_load_thread_max.setMinimum(1);
_stepper_load_thread_max.setMaximum(99999);
_stepper_load_thread_max.oninput = function(v){
download.load.thread_max = v;
projectModify();
};
// タイムアウト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_download_load_timeout"));
var parent = container.getElement();
_stepper_load_timeout = new UI_NumericStepper(parent);
_stepper_load_timeout.setMinimum(0);
_stepper_load_timeout.setMaximum(1000 * 60 * 10);
_stepper_load_timeout.oninput = function(v){
download.load.timeout = v;
projectModify();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_download_load_timeout_hint"));
new UI_Break(_content_window);
// ダウンロード設定
var title = new UI_TitleSub(_content_window,_i18n.getMessage("menu_setting_download_download"));
// グループ
var group = new UI_GroupContainer(_content_window);
var group_parent = group.getElement();
// 最大同時ダウンロード数
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_download_download_thread_max"));
var parent = container.getElement();
_stepper_download_thread_max = new UI_NumericStepper(parent);
_stepper_download_thread_max.setMinimum(1);
_stepper_download_thread_max.setMaximum(99999);
_stepper_download_thread_max.oninput = function(v){
download.download.thread_max = v;
projectModify();
};
// ファイル名衝突時の処理
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_download_download_conflict_type"));
var parent = container.getElement();
_combo_box_conflict_type = new UI_ComboBox(parent);
_combo_box_conflict_type.attachItem(_i18n.getMessage("menu_setting_download_download_conflict_type_combo_box_item_rename"),"rename");
_combo_box_conflict_type.attachItem(_i18n.getMessage("menu_setting_download_download_conflict_type_combo_box_item_overwrite"),"overwrite");
_combo_box_conflict_type.onchange = function(v){
download.download.conflict_type = v;
projectModify();
};
new UI_Break(_content_window);
// 最大同時ロード数
_stepper_load_thread_max.setValue(download.load.thread_max);
// タイムアウト
_stepper_load_timeout.setValue(download.load.timeout);
// 最大同時ダウンロード数
_stepper_download_thread_max.setValue(download.download.thread_max);
// ファイル名衝突時の処理
_combo_box_conflict_type.setValue(download.download.conflict_type);
})();
}
// ------------------------------
// スレッド掲示板拡張設定
// ------------------------------
function ContentSettingExpandBbs(){
var _this = this;
// ------------------------------
// URLからリストを選択
// ------------------------------
_this.selectFromURL = function(url){
var expand_bbs = page_expand_project.getObject().expand_bbs;
var i;
var j;
var num = expand_bbs.length;
for(i=0;i<num;i++){
var c = ProjectObjectGetActiveData(expand_bbs[i]);
if(!c) continue;
// アドレスチェック
switch(c.filter.type){
case "asterisk":
var filter = c.filter.asterisk.filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchAsteriskWord(url,filter[j])){
_expand_bbs_list.select(i);
_expand_bbs_list.replaceHistory();
return;
}
}
break;
case "regexp":
var filter = c.filter.regexp.filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
var regexp = RegExpObjectGetRegExp(filter[j]);
if(regexp){
if(StringUrlMatchRegExpList(url,[regexp])){
_expand_bbs_list.select(i);
_expand_bbs_list.replaceHistory();
return;
}
}
}
break;
}
}
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_expand_bbs_list.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_expand_bbs_list.replaceHistory();
};
// ------------------------------
// 選択(内部用)
// ------------------------------
function select(id){
var proj = page_expand_project.getObject();
var expand_bbs = proj.expand_bbs;
var c = ProjectObjectGetActiveData(expand_bbs[id]);
if(!c) return;
_text_input_name.setValue(LocaleObjectGetString(c.name));
_check_box_enable_expand_bbs.setValue(c.enable);
_form_container_enable.setVisible(c.enable);
_url_edit_container.attachObject(c.filter);
_text_area_script_initialize.setValue(c.script_initialize);
_check_box_popup_enable_animation.setValue(c.popup.enable_animation);
_combo_box_popup_origin_type.setValue(c.popup.origin_type);
_combo_box_popup_position_type.setValue(c.popup.position_type);
_stepper_popup_percent_h.setValue(c.popup.percent.x);
_stepper_popup_percent_v.setValue(c.popup.percent.y);
_stepper_popup_time_wait_open.setValue(c.popup.time_wait_open);
_stepper_popup_time_wait_close.setValue(c.popup.time_wait_close);
_text_input_popup_style_sheet.setValue(c.popup.style_sheet);
_text_area_script_callback.setValue(c.script_callback);
}
// ------------------------------
// 選択しているURLマッピングオブジェクトを取得(内部用)
// ------------------------------
function getSelectedExpandBbs(func){
var expand_bbs = page_expand_project.getObject().expand_bbs;
var c;
var p;
var a = _expand_bbs_list.getSelectedIndices();
var i;
var num = a.length;
for(i=0;i<num;i++){
p = null;
c = expand_bbs[a[i]];
if(c.user){
p = c.user;
}else{
if(c.preset){
// プリセットを昇格
p = c.user = ObjectCopy(c.preset);
}
}
if(p) func(p);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _expand_bbs_list;
var _form_container;
var _form_container_enable;
var _text_input_name;
var _check_box_enable_expand_bbs;
var _url_edit_container;
var _text_area_script_initialize;
var _check_box_popup_enable_animation;
var _combo_box_popup_origin_type;
var _combo_box_popup_position_type;
var _stepper_popup_percent_h;
var _stepper_popup_percent_v;
var _stepper_popup_time_wait_open;
var _stepper_popup_time_wait_close;
var _text_input_popup_style_sheet;
var _text_area_script_callback;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var expand_bbs = page_expand_project.getObject().expand_bbs;
// タイトル
var title = new UI_Title(_content_window,_i18n.getMessage("menu_setting_expand_bbs"));
// 掲示板拡張設定一覧
var container = new UI_LineContainer(_content_window,_i18n.getMessage("menu_setting_expand_bbs_list"));
var parent = container.getElement();
_expand_bbs_list = new UI_ExpandBbsList(parent);
_expand_bbs_list.attachExpandBbsData(expand_bbs);
_expand_bbs_list.onselect = function(id){
if(id < 0 || expand_bbs.length <= id){
_form_container.setVisible(false);
}else{
_form_container.setVisible(true);
select(id);
}
};
_expand_bbs_list.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_EXPAND_BBS);
};
// フォームコンテナ
_form_container = new UI_FormContainer(_content_window);
var form_parent = _form_container.getElement();
_form_container.setVisible(false);
// 名前
var container = new UI_LineContainer(form_parent,_i18n.getMessage("menu_setting_expand_bbs_name"));
var parent = container.getElement();
_text_input_name = new UI_TextInput(parent);
_text_input_name.oninput = function(v){
getSelectedExpandBbs(function(c){
LocaleObjectSetString(c.name,v);
});
_expand_bbs_list.update();
projectModify();
};
// 掲示板拡張設定
var container = new UI_LineContainer(form_parent,_i18n.getMessage("menu_setting_expand_bbs_check_box_container"));
var parent = container.getElement();
// 有効であるか
_check_box_enable_expand_bbs = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_bbs_enable_setting"));
_check_box_enable_expand_bbs.onchange = function(v){
getSelectedExpandBbs(function(c){
c.enable = v;
});
_form_container_enable.setVisible(v);
_expand_bbs_list.update();
projectModify();
};
_form_container_enable = new UI_FormContainer(form_parent);
_form_container_enable.setVisible(false);
var form_parent_enable = _form_container_enable.getElement();
// 動作URLの設定
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_filter_url"));
var parent = container.getElement();
_url_edit_container = new UI_UrlEditContainer(parent);
_url_edit_container.onchange = function(v){
getSelectedExpandBbs(function(c){
c.filter = ObjectCopy(v);
});
_expand_bbs_list.update();
projectModify();
};
// ポップアップの設定
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_popup_check_box_container"));
var parent = container.getElement();
// ポップアップ時のアニメーション動作を有効
_check_box_popup_enable_animation = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_bbs_popup_enable_animation"));
_check_box_popup_enable_animation.onchange = function(v){
getSelectedExpandBbs(function(c){
c.popup.enable_animation = v;
});
_expand_bbs_list.update();
projectModify();
};
// ポップアップの配置基点
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_popup_origin_type"));
var parent = container.getElement();
_combo_box_popup_origin_type = new UI_ComboBox(parent);
_combo_box_popup_origin_type.attachItem(_i18n.getMessage("menu_setting_expand_bbs_popup_origin_type_combo_box_item_adsorb_top_bottom"),"adsorb_top_bottom");
_combo_box_popup_origin_type.attachItem(_i18n.getMessage("menu_setting_expand_bbs_popup_origin_type_combo_box_item_adsorb_left_right"),"adsorb_left_right");
_combo_box_popup_origin_type.onchange = function(v){
getSelectedExpandBbs(function(c){
c.popup.origin_type = v;
});
_expand_bbs_list.update();
projectModify();
};
// ポップアップの配置位置
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_popup_position_type"));
var parent = container.getElement();
_combo_box_popup_position_type = new UI_ComboBox(parent);
_combo_box_popup_position_type.attachItem(_i18n.getMessage("menu_setting_expand_bbs_popup_position_type_combo_box_item_absolute"),"absolute");
_combo_box_popup_position_type.attachItem(_i18n.getMessage("menu_setting_expand_bbs_popup_position_type_combo_box_item_fixed"),"fixed");
_combo_box_popup_position_type.onchange = function(v){
getSelectedExpandBbs(function(c){
c.popup.position_type = v;
});
_expand_bbs_list.update();
projectModify();
};
// ポップアップサイズ
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_popup_percent"));
var parent = container.getElement();
// 横方向パーセント (0~100)
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_bbs_popup_percent_h"));
_stepper_popup_percent_h = new UI_NumericStepper(parent);
_stepper_popup_percent_h.setMinimum(0);
_stepper_popup_percent_h.setMaximum(100);
_stepper_popup_percent_h.oninput = function(v){
getSelectedExpandBbs(function(c){
c.popup.percent.x = v;
});
_expand_bbs_list.update();
projectModify();
};
// 縦方向パーセント (0~100)
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_bbs_popup_percent_v"));
_stepper_popup_percent_v = new UI_NumericStepper(parent);
_stepper_popup_percent_v.setMinimum(0);
_stepper_popup_percent_v.setMaximum(100);
_stepper_popup_percent_v.oninput = function(v){
getSelectedExpandBbs(function(c){
c.popup.percent.y = v;
});
_expand_bbs_list.update();
projectModify();
};
// ポップアップ時間
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_popup_time"));
var parent = container.getElement();
// 開くまでに待機する時間(ミリ秒)
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_bbs_popup_time_wait_open"));
_stepper_popup_time_wait_open = new UI_NumericStepper(parent);
_stepper_popup_time_wait_open.setMinimum(0);
_stepper_popup_time_wait_open.setMaximum(9999999);
_stepper_popup_time_wait_open.oninput = function(v){
getSelectedExpandBbs(function(c){
c.popup.time_wait_open = v;
});
_expand_bbs_list.update();
projectModify();
};
// 閉じるまでに待機する時間(ミリ秒)
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_bbs_popup_time_wait_close"));
_stepper_popup_time_wait_close = new UI_NumericStepper(parent);
_stepper_popup_time_wait_close.setMinimum(0);
_stepper_popup_time_wait_close.setMaximum(9999999);
_stepper_popup_time_wait_close.oninput = function(v){
getSelectedExpandBbs(function(c){
c.popup.time_wait_close = v;
});
_expand_bbs_list.update();
projectModify();
};
// ポップアップのスタイル
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_popup_style_sheet"));
var parent = container.getElement();
_text_input_popup_style_sheet = new UI_TextInput(parent);
_text_input_popup_style_sheet.oninput = function(v){
getSelectedExpandBbs(function(c){
c.popup.style_sheet = v;
});
_expand_bbs_list.update();
projectModify();
};
// 初期化スクリプト
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_script_initialize"));
var parent = container.getElement();
_text_area_script_initialize = new UI_ScriptArea(parent);
_text_area_script_initialize.oninput = function(v){
getSelectedExpandBbs(function(c){
c.script_initialize = v;
});
_expand_bbs_list.update();
projectModify();
};
// コールバックスクリプト
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_expand_bbs_script_callback"));
var parent = container.getElement();
_text_area_script_callback = new UI_ScriptArea(parent);
_text_area_script_callback.oninput = function(v){
getSelectedExpandBbs(function(c){
c.script_callback = v;
});
_expand_bbs_list.update();
projectModify();
};
})();
}
// ------------------------------
// URLマッピング設定
// ------------------------------
function ContentSettingUrlMap(){
var _this = this;
// ------------------------------
// URLからリストを選択
// ------------------------------
_this.selectFromURL = function(url){
var urlmap = page_expand_project.getObject().urlmap;
var i;
var j;
var num = urlmap.length;
for(i=0;i<num;i++){
var c = ProjectObjectGetActiveData(urlmap[i]);
if(!c) continue;
// アドレスチェック
switch(c.filter.type){
case "asterisk":
var filter = c.filter.asterisk.filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
if(StringUrlMatchAsteriskWord(url,filter[j])){
_urlmap_list.select(i);
_urlmap_list.replaceHistory();
return;
}
}
break;
case "regexp":
var filter = c.filter.regexp.filter;
var filter_num = filter.length;
for(j=0;j<filter_num;j++){
var regexp = RegExpObjectGetRegExp(filter[j]);
if(regexp){
if(StringUrlMatchRegExpList(url,[regexp])){
_urlmap_list.select(i);
_urlmap_list.replaceHistory();
return;
}
}
}
break;
}
}
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_urlmap_list.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_urlmap_list.replaceHistory();
};
// ------------------------------
// 選択(内部用)
// ------------------------------
function select(id){
var proj = page_expand_project.getObject();
var urlmap = proj.urlmap;
var c = ProjectObjectGetActiveData(urlmap[id]);
if(!c) return;
// 名前
_text_input_name.setValue(LocaleObjectGetString(c.name));
// 有効
_check_box_enable_urlmap.setValue(c.enable);
_form_container_enable.setVisible(c.enable);
// フィルタ
_url_edit_container.attachObject(c.filter);
// セキュリティ
_check_box_enable_unsecure.setValue(c.enable_unsecure);
_check_box_enable_mixed_content.setValue(c.enable_mixed_content);
// 定義
var i;
var num = _ui_define.length;
for(i=0;i<num;i++){
var param = _ui_define_select_params[i];
switch(param.select){
case "single":
var combo_box = _ui_define[i];
var define = c[param.asset];
if(define.enable){
combo_box.setValue(define.id);
}else{
combo_box.setValue("");
}
break;
case "multiple":
var multi_list = _ui_define[i];
// フィルタ
var ary = new Array();
var indices = _urlmap_list.getSelectedIndices();
for(var p in indices){
ary.push(urlmap[indices[p]]);
}
multi_list.attachUrlMaps(ary,urlmap[id]);
break;
}
}
}
// ------------------------------
// 選択しているURLマッピングオブジェクトを取得(内部用)
// ------------------------------
function getSelectedUrlMaps(func){
var urlmap = page_expand_project.getObject().urlmap;
var c;
var p;
var a = _urlmap_list.getSelectedIndices();
var i;
var num = a.length;
for(i=0;i<num;i++){
p = null;
c = urlmap[a[i]];
if(c.user){
p = c.user;
}else{
if(c.preset){
// プリセットを昇格
p = c.user = ObjectCopy(c.preset);
}
}
if(p) func(p);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _urlmap_list;
var _form_container;
var _form_container_enable;
var _text_input_name;
var _check_box_enable_urlmap;
var _url_edit_container;
var _check_box_enable_unsecure;
var _check_box_enable_mixed_content;
var _ui_define;
var _ui_define_select_params = [
{asset:"access_block",type:PageExpandConfig.MENU_TYPE_SETTING_ACCESS_BLOCK,select:"multiple" },
{asset:"replacement_to_referer",type:PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_REFERER,select:"multiple" },
{asset:"replacement_to_useragent",type:PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_USERAGENT,select:"multiple" },
{asset:"replacement_to_element",type:PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_ELEMENT,select:"multiple" },
{asset:"replacement_to_text",type:PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_TEXT,select:"multiple" },
{asset:"replacement_to_anchor",type:PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_ANCHOR,select:"multiple" },
{asset:"replacement_to_link",type:PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_LINK,select:"multiple" },
{asset:"make_link_to_text",type:PageExpandConfig.MENU_TYPE_SETTING_MAKE_LINK_TO_TEXT,select:"single" },
{asset:"expand_short_url",type:PageExpandConfig.MENU_TYPE_SETTING_EXPAND_SHORT_URL,select:"single" },
{asset:"expand_text",type:PageExpandConfig.MENU_TYPE_SETTING_EXPAND_TEXT,select:"single" },
{asset:"expand_image",type:PageExpandConfig.MENU_TYPE_SETTING_EXPAND_IMAGE,select:"single" },
{asset:"expand_sound",type:PageExpandConfig.MENU_TYPE_SETTING_EXPAND_SOUND,select:"single" },
{asset:"expand_video",type:PageExpandConfig.MENU_TYPE_SETTING_EXPAND_VIDEO,select:"single" },
{asset:"expand_iframe",type:PageExpandConfig.MENU_TYPE_SETTING_EXPAND_IFRAME,select:"single" },
{asset:"style_sheet",type:PageExpandConfig.MENU_TYPE_SETTING_STYLE_SHEET,select:"single" },
{asset:"experimental",type:PageExpandConfig.MENU_TYPE_SETTING_EXPERIMENTAL,select:"single" }
];
// ------------------------------
// 初期化
// ------------------------------
(function(){
var proj = page_expand_project.getObject();
var urlmap = proj.urlmap;
// タイトル
var title = new UI_Title(_content_window,_i18n.getMessage("menu_setting_urlmap"));
// URLマッピング設定一覧
var container = new UI_LineContainer(_content_window,_i18n.getMessage("menu_setting_urlmap_list"));
var parent = container.getElement();
_urlmap_list = new UI_UrlMapList(parent);
_urlmap_list.attachUrlMapData(urlmap);
_urlmap_list.onselect = function(id){
if(id < 0 || urlmap.length <= id){
_form_container.setVisible(false);
}else{
_form_container.setVisible(true);
select(id);
}
};
// フォームコンテナ
_form_container = new UI_FormContainer(_content_window);
var form_parent = _form_container.getElement();
_form_container.setVisible(false);
// URLマッピング設定名
var container = new UI_LineContainer(form_parent,_i18n.getMessage("menu_setting_urlmap_name"));
var parent = container.getElement();
_text_input_name = new UI_TextInput(parent);
_text_input_name.oninput = function(v){
getSelectedUrlMaps(function(c){
LocaleObjectSetString(c.name,v);
});
_urlmap_list.update();
projectModify();
};
// URLマッピング設定
var container = new UI_LineContainer(form_parent,_i18n.getMessage("menu_setting_urlmap_check_box_container"));
var parent = container.getElement();
// 有効であるか
_check_box_enable_urlmap = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_urlmap_enable_setting"));
_check_box_enable_urlmap.onchange = function(v){
getSelectedUrlMaps(function(c){
c.enable = v;
});
_form_container_enable.setVisible(v);
_urlmap_list.update();
projectModify();
};
_form_container_enable = new UI_FormContainer(form_parent);
_form_container_enable.setVisible(false);
var form_parent_enable = _form_container_enable.getElement();
// 動作 URL
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_urlmap_filter_url"));
var parent = container.getElement();
_url_edit_container = new UI_UrlEditContainer(parent);
_url_edit_container.onchange = function(v){
getSelectedUrlMaps(function(c){
c.filter = ObjectCopy(v);
});
_urlmap_list.update();
projectModify();
};
// セキュリティ
var container = new UI_LineContainer(form_parent_enable,_i18n.getMessage("menu_setting_urlmap_unsecure_check_box_container"));
var parent = container.getElement();
// アンセキュア
_check_box_enable_unsecure = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_urlmap_enable_unsecure"));
_check_box_enable_unsecure.onchange = function(v){
getSelectedUrlMaps(function(c){
c.enable_unsecure = v;
});
_urlmap_list.update();
projectModify();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_urlmap_enable_unsecure_hint"));
// 混在コンテンツ
_check_box_enable_mixed_content = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_urlmap_enable_mixed_content"));
_check_box_enable_mixed_content.onchange = function(v){
getSelectedUrlMaps(function(c){
c.enable_mixed_content = v;
});
_urlmap_list.update();
projectModify();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_urlmap_enable_mixed_content_hint"));
// 定義
_ui_define = new Array();
var i;
var num = _ui_define_select_params.length;
for(i=0;i<num;i++){
(function(){
var param = _ui_define_select_params[i];
var type = param.type;
var asset = param.asset;
// 各定義
var container = new UI_InlineContainer(form_parent_enable,_i18n.getMessage("menu_setting_" + param.asset));
container.setWidth(280);
var parent = container.getElement();
if(!_menu_support_param[type].urlmap){
container.setAlpha(0.5);
}
container.setBackgroundColor(_menu_item_param[type].bgcolor);
switch(param.select){
case "single":
var combo_box = new UI_ComboBoxButton(parent,_i18n.getMessage("menu_setting_urlmap_define_button_edit"));
_ui_define.push(combo_box);
// 定義リストを登録
(function(){
var define = proj[param.asset];
var i=0;
var num = define.length;
for(i=0;i<num;i++){
var d = define[i];
var c = ProjectObjectGetActiveData(d);
combo_box.attachItem(LocaleObjectGetString(c.name),d.id);
}
combo_box.attachItem(_i18n.getMessage("menu_setting_urlmap_define_combo_box_item_no_use"),"");
})();
// コンボボックス変更
combo_box.onchange = function(v){
getSelectedUrlMaps(function(c){
var define = c[asset];
if(v){
define.enable = true;
define.id = v;
}else{
define.enable = false;
define.id = "";
}
});
_urlmap_list.update();
projectModify();
};
// ボタン押下
combo_box.onclick = function(){
_config.pushHistory(type);
var content = _config.MenuItemSelect(type);
content.select(combo_box.getSelectedIndex());
content.replaceHistory();
};
break;
case "multiple":
var multi_list = new UI_DefineMultiSelectList(parent);
_ui_define.push(multi_list);
multi_list.setAsset(param.asset);
multi_list.setMenuId(type);
multi_list.setDefineData(proj[param.asset]);
multi_list.onchange = function(){
_urlmap_list.update();
};
break;
}
})();
}
})();
}
// ------------------------------
// 定義関連のクラス
// ------------------------------
function ContentSettingDefine(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_define_list.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_define_list.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_define_list.replaceHistory();
};
// ------------------------------
// 選択(内部用 )
// ------------------------------
function select(id){
var c = ProjectObjectGetActiveData(_define[id]);
if(!c) return;
// ワイルドカード
if(_define[id].id == "wildcard"){
_wildcard_container.setVisible(true);
}else{
_wildcard_container.setVisible(false);
}
// 名前
_text_input_name.setValue(LocaleObjectGetString(c.name));
_this.onselect(id);
}
// ------------------------------
// 更新
// ------------------------------
_this.update = function(){
_define_list.update();
};
// ------------------------------
// 選択イベント
// ------------------------------
_this.onselect = function(){};
// ------------------------------
// リロードイベント
// ------------------------------
_this.onreload = function(){};
// ------------------------------
// データを関連付け
// ------------------------------
_this.attachDefineData = function(data){
_define = data;
// リスト選択時
_define_list.onselect = function(id){
if(id < 0 || _define.length <= id){
_form_container_inner.setVisible(false);
_form_container_outer.setVisible(false);
}else{
_form_container_inner.setVisible(true);
_form_container_outer.setVisible(true);
select(id);
}
};
// 定義リスト
_define_list.attachDefineData(_define);
};
// ------------------------------
// 定義の識別名をセット
// ------------------------------
_this.setDefineAssetName = function(asset){
_define_list.setDefineAssetName(asset);
};
// ------------------------------
// タイトルをセット
// ------------------------------
_this.setTitle = function(v){
_title.setValue(v);
};
// ------------------------------
// 新規データ作成用関数をセット
// ------------------------------
_this.setFunctionForNewData = function(f){
_define_list.setFunctionForNewData(f);
};
// ------------------------------
// フォームエレメントを取得
// ------------------------------
_this.getElementForm = function(){
return _form_container_outer.getElement();
};
// ------------------------------
// 選択している定義オブジェクトを取得
// ------------------------------
_this.getSelectedDefinitions = function(func){
var c;
var p;
var a = _define_list.getSelectedIndices();
var i;
var num = a.length;
for(i=0;i<num;i++){
p = null;
c = _define[a[i]];
if(c.user){
p = c.user;
}else{
if(c.preset){
// プリセットを昇格
p = c.user = ObjectCopy(c.preset);
}
}
if(p) func(p);
}
};
// ------------------------------
// 選択しているアイテムを取得
// ------------------------------
_this.getSelectedIndex = function(){
return _define_list.getSelectedIndex();
};
// ------------------------------
// 選択されたアイテムをすべて取得
// ------------------------------
_this.getSelectedIndices = function(){
return ObjectCopy(_define_list.getSelectedIndices());
};
// ------------------------------
// プライベート変数
// ------------------------------
var _title;
var _form_container_inner;
var _form_container_outer;
var _wildcard_container;
var _text_input_name;
var _define_list;
var _define;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_title = new UI_Title(_content_window,"");
// グループ
var group = new UI_GroupContainer(_content_window);
var group_parent = group.getElement();
// 定義一覧
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_define_list"));
var parent = container.getElement();
_define_list = new UI_DefineList(parent);
_define_list.onreload = function(){
_this.onreload();
};
// フォームコンテナ
_form_container_inner = new UI_FormContainer(group_parent);
var form_parent = _form_container_inner.getElement();
_form_container_inner.setVisible(false);
// ワイルドカードについて
_wildcard_container = new UI_FormContainer(form_parent);
var wildcard_parent = _wildcard_container.getElement();
_wildcard_container.setVisible(false);
// ワイルドカードについて
var container = new UI_LineContainer(wildcard_parent,_i18n.getMessage("menu_setting_define_wildcard_detail"));
var parent = container.getElement();
var unordered_list = new UI_UnorderedList(parent);
unordered_list.addListItem(_i18n.getMessage("menu_setting_define_wildcard_detail_0"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_define_wildcard_detail_1"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_define_wildcard_detail_2"));
// 定義名
var container = new UI_LineContainer(form_parent,_i18n.getMessage("menu_setting_define_name"));
var parent = container.getElement();
_text_input_name = new UI_TextInput(parent);
_text_input_name.oninput = function(v){
_this.getSelectedDefinitions(function(c){
LocaleObjectSetString(c.name,v);
});
_this.update();
projectModify();
};
new UI_Break(_content_window);
// フォームコンテナ
_form_container_outer = new UI_FormContainer(_content_window);
var form_parent = _form_container_outer.getElement();
_form_container_outer.setVisible(false);
})();
}
// ------------------------------
// アクセス遮断の定義
// ------------------------------
function ContentSettingAccessBlock(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _url_edit_container;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().access_block;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_access_block"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// アクセス遮断 URL
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_access_block_filter_url"));
var parent = container.getElement();
_url_edit_container = new UI_UrlEditContainer(parent);
_url_edit_container.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.filter = ObjectCopy(v);
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("access_block");
_setting_define.setFunctionForNewData(createAccessBlockData);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// アクセス遮断 URL
_url_edit_container.attachObject(c.filter);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_ACCESS_BLOCK);
};
})();
}
// ------------------------------
// エレメントの置換定義
// ------------------------------
function ContentSettingReplacementToElement(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _text_area_script;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().replacement_to_element;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_replacement_to_element"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// コールバックスクリプト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_element_script"));
var parent = container.getElement();
_text_area_script = new UI_ScriptArea(parent);
_text_area_script.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.script = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("replacement_to_element");
_setting_define.setFunctionForNewData(createPlacementToElementData);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// コールバックスクリプト
_text_area_script.setValue(c.script);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_ELEMENT);
};
})();
}
// ------------------------------
// テキストの置換定義
// ------------------------------
function ContentSettingReplacementToText(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _text_area_script;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().replacement_to_text;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_replacement_to_text"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// コールバックスクリプト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_text_script"));
var parent = container.getElement();
_text_area_script = new UI_ScriptArea(parent);
_text_area_script.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.script = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("replacement_to_text");
_setting_define.setFunctionForNewData(createPlacementToTextData);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// コールバックスクリプト
_text_area_script.setValue(c.script);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_TEXT);
};
})();
}
// ------------------------------
// アンカー置換定義
// ------------------------------
function ContentSettingReplacementToAnchor(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
var _text_area_allow_url;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().replacement_to_anchor;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_replacement_to_anchor"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// コールバックスクリプト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_anchor_script"));
var parent = container.getElement();
_text_area_allow_url = new UI_ScriptArea(parent);
_text_area_allow_url.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.script = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("replacement_to_anchor");
_setting_define.setFunctionForNewData(createPlacementToAnchorData);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// コールバックスクリプト
_text_area_allow_url.setValue(c.script);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_ANCHOR);
};
})();
}
// ------------------------------
// ハイパーリンク置換定義
// ------------------------------
function ContentSettingReplacementToLink(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// リストからフィルタを選択
// ------------------------------
_this.selectFilterFromList = function(list){
_filter_list.selectFromList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
_filter_list.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _filter_list;
var _text_input_name;
var _url_edit_container;
var _text_area_script;
var _check_box_enable_reflect_to_anchor;
var _check_box_enable_cache;
var _form_container_filter_inner;
var _form_container_filter_outer;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().replacement_to_link;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_replacement_to_link"));
// フィルタ一覧
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_replacement_to_link_filter_list"));
// フィルタ更新
function filterListUpdate(id){
var visible = false;
var c = ProjectObjectGetActiveData(_filter_list.getDefinitionActive());
if(c){
var filter = c.filter;
if(0 <= id && id < filter.length){
var filter = filter[id];
_text_input_name.setValue(LocaleObjectGetString(filter.name));
_url_edit_container.attachObject(filter.filter);
_text_area_script.setValue(filter.script);
_check_box_enable_reflect_to_anchor.setValue(filter.enable_reflect_to_anchor);
_check_box_enable_cache.setValue(filter.enable_cache);
visible = true;
}
}
_form_container_filter_inner.setVisible(visible);
_form_container_filter_outer.setVisible(visible);
}
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// ファイルタリスト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_link_filter_list"));
var parent = container.getElement();
_filter_list = new UI_FilterList(parent);
_filter_list.onselect = function(id){
filterListUpdate(id);
};
_filter_list.onchange = function(id){
_setting_define.update();
};
_form_container_filter_inner = new UI_FormContainer(group_parent);
_form_container_filter_inner.setVisible(false);
var form_parent_filter = _form_container_filter_inner.getElement();
// フィルタ名
var container = new UI_LineContainer(form_parent_filter,_i18n.getMessage("menu_setting_replacement_to_link_filter_name"));
var parent = container.getElement();
_text_input_name = new UI_TextInput(parent);
_text_input_name.oninput = function(v){
_filter_list.writeFilters(function(c){
LocaleObjectSetString(c.name,v);
});
_filter_list.update();
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
_form_container_filter_outer = new UI_FormContainer(form_parent);
_form_container_filter_outer.setVisible(false);
var form_parent_filter = _form_container_filter_outer.getElement();
// フィルタ設定
var title = new UI_TitleSub(form_parent_filter,_i18n.getMessage("menu_setting_replacement_to_link_filter"));
// グループ
var group = new UI_GroupContainer(form_parent_filter);
var group_parent = group.getElement();
// 対象 URL
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_link_filter_filter_url"));
var parent = container.getElement();
_url_edit_container = new UI_UrlEditContainer(parent);
_url_edit_container.onchange = function(v){
_filter_list.writeFilters(function(c){
c.filter = ObjectCopy(v);
});
_setting_define.update();
projectModify();
};
// ハイパーリンクの設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_link_check_box_container"));
var parent = container.getElement();
//リンクの変更をアンカーに反映する
_check_box_enable_reflect_to_anchor = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_replacement_to_link_enable_reflect_to_anchor"));
_check_box_enable_reflect_to_anchor.onchange = function(v){
_filter_list.writeFilters(function(c){
c.enable_reflect_to_anchor = v;
});
_setting_define.update();
projectModify();
};
//コールバックスクリプトの実行結果をキャッシュする
_check_box_enable_cache = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_replacement_to_link_enable_cache"));
_check_box_enable_cache.onchange = function(v){
_filter_list.writeFilters(function(c){
c.enable_cache = v;
});
_setting_define.update();
projectModify();
};
// コールバックスクリプト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_link_filter_script"));
var parent = container.getElement();
_text_area_script = new UI_ScriptArea(parent);
_text_area_script.oninput = function(v){
_filter_list.writeFilters(function(c){
c.script = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent_filter);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("replacement_to_link");
_setting_define.setFunctionForNewData(createPlacementToLinkData);
_filter_list.setFunctionForNewDefineData(createPlacementToLinkData);
_filter_list.setFunctionForNewFilterData(createPlacementToLinkFilterItemData);
_filter_list.setDefineAssetName("replacement_to_link");
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// フィルタ
var ary = new Array();
var indices = _setting_define.getSelectedIndices();
for(var p in indices){
ary.push(define[indices[p]]);
}
_filter_list.attachDefinitions(ary,define[id]);
// フィルタ選択
filterListUpdate(-1);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_LINK);
};
})();
}
// ------------------------------
// リファラ置換定義
// ------------------------------
function ContentSettingReplacementToReferer(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// リストからフィルタを選択
// ------------------------------
_this.selectFilterFromList = function(list){
_filter_list.selectFromList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
_filter_list.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _filter_list;
var _text_input_name;
var _url_edit_container;
var _combo_box_send_type;
var _text_input_send_custom;
var _text_regexp_send_regexp;
var _text_input_send_replacement;
var _form_container_filter_inner;
var _form_container_filter_outer;
var _form_container_send_custom;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().replacement_to_referer;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_replacement_to_referer"));
// フィルタ一覧
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_list"));
// フィルタ更新
function filterListUpdate(id){
var visible = false;
var c = ProjectObjectGetActiveData(_filter_list.getDefinitionActive());
if(c){
var filter = c.filter;
if(0 <= id && id < filter.length){
var filter = filter[id];
_text_input_name.setValue(LocaleObjectGetString(filter.name));
_url_edit_container.attachObject(filter.filter);
_combo_box_send_type.setValue(filter.send_referer.type);
_text_input_send_custom.setValue(filter.send_referer.custom);
_text_regexp_send_regexp.setValue(filter.send_referer.regexp);
_text_input_send_replacement.setValue(filter.send_referer.replacement);
sendTypeUpdate();
visible = true;
}
}
_form_container_filter_inner.setVisible(visible);
_form_container_filter_outer.setVisible(visible);
}
// 送信タイプ更新
function sendTypeUpdate(){
_form_container_send_custom.setVisible(_combo_box_send_type.getValue() == "custom");
}
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// ファイルタリスト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_list"));
var parent = container.getElement();
_filter_list = new UI_FilterList(parent);
_filter_list.onselect = function(id){
filterListUpdate(id);
};
_filter_list.onchange = function(id){
_setting_define.update();
};
_form_container_filter_inner = new UI_FormContainer(group_parent);
_form_container_filter_inner.setVisible(false);
var form_parent_filter = _form_container_filter_inner.getElement();
// フィルタ名
var container = new UI_LineContainer(form_parent_filter,_i18n.getMessage("menu_setting_replacement_to_referer_filter_name"));
var parent = container.getElement();
_text_input_name = new UI_TextInput(parent);
_text_input_name.oninput = function(v){
_filter_list.writeFilters(function(c){
LocaleObjectSetString(c.name,v);
});
_filter_list.update();
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
_form_container_filter_outer = new UI_FormContainer(form_parent);
_form_container_filter_outer.setVisible(false);
var form_parent_filter = _form_container_filter_outer.getElement();
// フィルタ設定
var title = new UI_TitleSub(form_parent_filter,_i18n.getMessage("menu_setting_replacement_to_referer_filter"));
// グループ
var group = new UI_GroupContainer(form_parent_filter);
var group_parent = group.getElement();
// 対象 URL
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_filter_url"));
var parent = container.getElement();
_url_edit_container = new UI_UrlEditContainer(parent);
_url_edit_container.onchange = function(v){
_filter_list.writeFilters(function(c){
c.filter = ObjectCopy(v);
});
_setting_define.update();
projectModify();
};
// 基本送信データ
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_type"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_type_combo_box_item"));
_combo_box_send_type = new UI_ComboBox(parent);
_combo_box_send_type.attachItem(_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_type_combo_box_item_default"),"default");
_combo_box_send_type.attachItem(_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_type_combo_box_item_current_url"),"current_url");
_combo_box_send_type.attachItem(_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_type_combo_box_item_link_url"),"link_url");
_combo_box_send_type.attachItem(_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_type_combo_box_item_custom"),"custom");
_combo_box_send_type.onchange = function(v){
_filter_list.writeFilters(function(c){
c.send_referer.type = v;
});
_setting_define.update();
projectModify();
sendTypeUpdate();
};
_form_container_send_custom = new UI_FormContainer(parent);
_form_container_send_custom.setVisible(false);
var form_parent_send_custom = _form_container_send_custom.getElement();
new UI_Text(form_parent_send_custom,_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_custom"));
_text_input_send_custom = new UI_TextInput(form_parent_send_custom);
_text_input_send_custom.oninput = function(v){
_filter_list.writeFilters(function(c){
c.send_referer.custom = v;
});
_setting_define.update();
projectModify();
};
// 基本送信データを正規表現で置換
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_regexp"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_regexp_match"));
_text_regexp_send_regexp = new UI_TextRegExp(parent);
_text_regexp_send_regexp.oninput = function(v){
_filter_list.writeFilters(function(c){
c.send_referer.regexp = ObjectCopy(v);
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_regexp_replacement"));
_text_input_send_replacement = new UI_TextInput(parent);
_text_input_send_replacement.oninput = function(v){
_filter_list.writeFilters(function(c){
c.send_referer.replacement = v;
});
_setting_define.update();
projectModify();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_replacement_to_referer_filter_send_regexp_replacement_hint"));
new UI_Break(form_parent_filter);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("replacement_to_referer");
_setting_define.setFunctionForNewData(createPlacementToRefererData);
_filter_list.setFunctionForNewDefineData(createPlacementToRefererData);
_filter_list.setFunctionForNewFilterData(createPlacementToRefererFilterItemData);
_filter_list.setDefineAssetName("replacement_to_referer");
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// フィルタ
var ary = new Array();
var indices = _setting_define.getSelectedIndices();
for(var p in indices){
ary.push(define[indices[p]]);
}
_filter_list.attachDefinitions(ary,define[id]);
// フィルタ選択
filterListUpdate(-1);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_REFERER);
};
})();
}
// ------------------------------
// ユーザーエージェント置換定義
// ------------------------------
function ContentSettingReplacementToUserAgent(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// リストからフィルタを選択
// ------------------------------
_this.selectFilterFromList = function(list){
_filter_list.selectFromList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
_filter_list.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _filter_list;
var _text_input_name;
var _url_edit_container;
var _text_input_send_custom;
var _form_container_filter_inner;
var _form_container_filter_outer;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().replacement_to_useragent;
// フィルタ一覧
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_replacement_to_useragent_filter_list"));
// フィルタ更新
function filterListUpdate(id){
var visible = false;
var c = ProjectObjectGetActiveData(_filter_list.getDefinitionActive());
if(c){
var filter = c.filter;
if(0 <= id && id < filter.length){
var filter = filter[id];
_text_input_name.setValue(LocaleObjectGetString(filter.name));
_url_edit_container.attachObject(filter.filter);
_text_input_send_custom.setValue(filter.send_useragent.custom);
visible = true;
}
}
_form_container_filter_inner.setVisible(visible);
_form_container_filter_outer.setVisible(visible);
}
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// ファイルタリスト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_useragent_filter_list"));
var parent = container.getElement();
_filter_list = new UI_FilterList(parent);
_filter_list.onselect = function(id){
filterListUpdate(id);
};
_filter_list.onchange = function(id){
_setting_define.update();
};
_form_container_filter_inner = new UI_FormContainer(group_parent);
_form_container_filter_inner.setVisible(false);
var form_parent_filter = _form_container_filter_inner.getElement();
// フィルタ名
var container = new UI_LineContainer(form_parent_filter,_i18n.getMessage("menu_setting_replacement_to_useragent_filter_name"));
var parent = container.getElement();
_text_input_name = new UI_TextInput(parent);
_text_input_name.oninput = function(v){
_filter_list.writeFilters(function(c){
LocaleObjectSetString(c.name,v);
});
_filter_list.update();
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
_form_container_filter_outer = new UI_FormContainer(form_parent);
_form_container_filter_outer.setVisible(false);
var form_parent_filter = _form_container_filter_outer.getElement();
// フィルタ設定
var title = new UI_TitleSub(form_parent_filter,_i18n.getMessage("menu_setting_replacement_to_useragent_filter"));
// グループ
var group = new UI_GroupContainer(form_parent_filter);
var group_parent = group.getElement();
// 対象 URL
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_useragent_filter_filter_url"));
var parent = container.getElement();
_url_edit_container = new UI_UrlEditContainer(parent);
_url_edit_container.onchange = function(v){
_filter_list.writeFilters(function(c){
c.filter = ObjectCopy(v);
});
_setting_define.update();
projectModify();
};
// 基本送信データ
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_replacement_to_useragent_filter_send"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_replacement_to_useragent_filter_send_custom"));
_text_input_send_custom = new UI_TextInput(parent);
_text_input_send_custom.oninput = function(v){
_filter_list.writeFilters(function(c){
c.send_useragent.custom = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent_filter);
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_replacement_to_useragent"));
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("replacement_to_useragent");
_setting_define.setFunctionForNewData(createPlacementToUserAgentData);
_filter_list.setFunctionForNewDefineData(createPlacementToUserAgentData);
_filter_list.setFunctionForNewFilterData(createPlacementToUserAgentFilterItemData);
_filter_list.setDefineAssetName("replacement_to_useragent");
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// フィルタ
var ary = new Array();
var indices = _setting_define.getSelectedIndices();
for(var p in indices){
ary.push(define[indices[p]]);
}
_filter_list.attachDefinitions(ary,define[id]);
// フィルタ選択
filterListUpdate(-1);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_USERAGENT);
};
})();
}
// ------------------------------
// ハイパーリンク化定義
// ------------------------------
function ContentSettingMakeLinkToText(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _text_area_script;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().make_link_to_text;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_make_link_to_text"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// コールバックスクリプト
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_make_link_to_text_script"));
var parent = container.getElement();
_text_area_script = new UI_ScriptArea(parent);
_text_area_script.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.script = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("make_link_to_text");
_setting_define.setFunctionForNewData(createMakeLinkToTextData);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// コールバックスクリプト
_text_area_script.setValue(c.script);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_MAKE_LINK_TO_TEXT);
};
})();
}
// ------------------------------
// 短縮 URL の展開の定義
// ------------------------------
function ContentSettingExpandShortUrl(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
var _url_edit_container;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().expand_short_url;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_expand_short_url"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// 対象 URL
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_short_url_filter_url"));
var parent = container.getElement();
_url_edit_container = new UI_UrlEditContainer(parent);
_url_edit_container.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.filter = ObjectCopy(v);
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("expand_short_url");
_setting_define.setFunctionForNewData(createExpandShortUrlData);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// 対象 URL
_url_edit_container.attachObject(c.filter);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_EXPAND_SHORT_URL);
};
})();
}
// ------------------------------
// テキストの展開の定義
// ------------------------------
function ContentSettingExpandText(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().expand_text;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_expand_text"));
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_text_inline"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// インライン表示の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_text_inline_check_box_container"));
var parent = container.getElement();
// 同じURLは展開しない
var check_box_disable_same_text = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_text_inline_disable_same_text"));
check_box_disable_same_text.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.disable_same_text = v;
});
_setting_define.update();
projectModify();
};
// リンクからインライン表示する条件
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_text_inline_script_allow"));
var parent = container.getElement();
var text_area_inline_script_allow = new UI_ScriptArea(parent);
text_area_inline_script_allow.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.script_allow = v;
});
_setting_define.update();
projectModify();
};
// テキストの挿入位置
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_text_inline_script_insert"));
var parent = container.getElement();
var text_area_inline_script_insert = new UI_ScriptArea(parent);
text_area_inline_script_insert.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.script_insert = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("expand_text");
_setting_define.setFunctionForNewData(createExpandText);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// 同じURLは展開しない
check_box_disable_same_text.setValue(c.inline.disable_same_text);
// リンクからインライン表示する条件
text_area_inline_script_allow.setValue(c.inline.script_allow);
// テキストの挿入位置
text_area_inline_script_insert.setValue(c.inline.script_insert);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_EXPAND_TEXT);
};
})();
}
// ------------------------------
// 画像の展開の定義
// ------------------------------
function ContentSettingExpandImage(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
var _form_container_thumbnail;
var _form_container_popup;
var _form_container_reduced_image;
var _form_container_unload;
var _selected_id;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().expand_image;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_expand_image"));
// フォーム更新
function formUpdate(){
var c = ProjectObjectGetActiveData(define[_selected_id]);
if(c){
_form_container_thumbnail.setVisible(c.thumbnail.enable_thumbnail);
_form_container_popup.setVisible((c.thumbnail.enable_thumbnail || c.popup.enable_popup_mouseover || c.reduced_image.enable_popup));
_form_container_reduced_image.setVisible(c.reduced_image.enable_popup);
}
}
// 縮小イメージ設定
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_image_reduced_image"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// 有効/無効
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_image_reduced_image_check_box_container"));
var parent = container.getElement();
// 縮小されたイメージをマウスオーバーするとポップアップ表示
var check_box_reduced_image_enable_popup = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_popup_enable_popup"));
check_box_reduced_image_enable_popup.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.reduced_image.enable_popup = v;
});
formUpdate();
_setting_define.update();
projectModify();
};
_form_container_reduced_image = new UI_FormContainer(group_parent);
_form_container_reduced_image.setVisible(false);
var form_parent_reduced_image = _form_container_reduced_image.getElement();
// 縮小イメージのポップアップ化条件
var container = new UI_LineContainer(form_parent_reduced_image,_i18n.getMessage("menu_setting_expand_image_reduced_image_allow_slcale_less_then"));
var parent = container.getElement();
// 縮小率
var stepper_popup_allow_slcale_less_then = new UI_NumericStepper(parent);
stepper_popup_allow_slcale_less_then.setMinimum(0);
stepper_popup_allow_slcale_less_then.setMaximum(100);
stepper_popup_allow_slcale_less_then.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.reduced_image.popup_allow_slcale_less_then = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_image_reduced_image_allow_slcale_less_then_text"));
new UI_Break(form_parent);
// サムネイル表示設定
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_image_thumbnail"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// 有効/無効
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_image_thumbnail_enable_check_box_container"));
var parent = container.getElement();
// サムネイルを表示する
var check_box_enable_thumbnail = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_thumbnail_enable_thumbnail"));
check_box_enable_thumbnail.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.thumbnail.enable_thumbnail = v;
});
formUpdate();
_setting_define.update();
projectModify();
};
_form_container_thumbnail = new UI_FormContainer(group_parent);
_form_container_thumbnail.setVisible(false);
var form_parent_thumbnail = _form_container_thumbnail.getElement();
// サムネイル表示設定
var container = new UI_LineContainer(form_parent_thumbnail,_i18n.getMessage("menu_setting_expand_image_thumbnail_check_box_container"));
var parent = container.getElement();
// サムネイルにマウスオーバーするとポップアップ表示
var check_box_enable_popup_mouseover = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_thumbnail_enable_popup_mouseover"));
check_box_enable_popup_mouseover.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.thumbnail.enable_popup_mouseover = v;
});
_setting_define.update();
projectModify();
};
// 同じイメージがすでに配置されている場合サムネイルを表示しない
var check_box_disable_same_thumbnail_image = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_thumbnail_disable_same_thumbnail_image"));
check_box_disable_same_thumbnail_image.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.thumbnail.disable_same_image = v;
});
_setting_define.update();
projectModify();
};
// イメージのロード設定
var container = new UI_LineContainer(form_parent_thumbnail,_i18n.getMessage("menu_setting_expand_image_load_start_type"));
var parent = container.getElement();
var combo_box_thumbnail_load_type = new UI_ComboBox(parent);
combo_box_thumbnail_load_type.attachItem(_i18n.getMessage("menu_setting_expand_image_load_start_type_preload"),"preload");
combo_box_thumbnail_load_type.attachItem(_i18n.getMessage("menu_setting_expand_image_load_start_type_scroll"),"scroll");
combo_box_thumbnail_load_type.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.thumbnail.load_type = v;
});
_setting_define.update();
projectModify();
};
// リンクからサムネイル化する条件
var container = new UI_LineContainer(form_parent_thumbnail,_i18n.getMessage("menu_setting_expand_image_thumbnail_script_allow"));
var parent = container.getElement();
var text_area_thumbnail_script_allow = new UI_ScriptArea(parent);
text_area_thumbnail_script_allow.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.thumbnail.script_allow = v;
});
_setting_define.update();
projectModify();
};
// サムネイルの挿入位置
var container = new UI_LineContainer(form_parent_thumbnail,_i18n.getMessage("menu_setting_expand_image_thumbnail_script_insert"));
var parent = container.getElement();
var text_area_thumbnail_script_insert = new UI_ScriptArea(parent);
text_area_thumbnail_script_insert.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.thumbnail.script_insert = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// ポップアップ表示設定
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_image_popup"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// 有効/無効
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_image_popup_enable_check_box_container"));
var parent = container.getElement();
// ポップアップ表示の有無
var check_box_popup_enable_popup_mouseover = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_popup_enable_popup_mouseover"));
check_box_popup_enable_popup_mouseover.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.enable_popup_mouseover = v;
});
formUpdate();
_setting_define.update();
projectModify();
};
_form_container_popup = new UI_FormContainer(group_parent);
_form_container_popup.setVisible(false);
var form_parent_popup = _form_container_popup.getElement();
// ポップアップ表示設定
var container = new UI_LineContainer(form_parent_popup,_i18n.getMessage("menu_setting_expand_image_popup_check_box_container"));
var parent = container.getElement();
// ポップアップ時のスケールアニメーション動作を有効
var check_box_enable_animation_scale = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_popup_enable_animation_scale"));
check_box_enable_animation_scale.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.enable_animation_scale = v;
});
_setting_define.update();
projectModify();
};
// ポップアップ時のアルファアニメーション動作を有効
var check_box_enable_animation_alpha = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_popup_enable_animation_alpha"));
check_box_enable_animation_alpha.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.enable_animation_alpha = v;
});
_setting_define.update();
projectModify();
};
// イメージのロード設定
var container = new UI_LineContainer(form_parent_popup,_i18n.getMessage("menu_setting_expand_image_load_start_type"));
var parent = container.getElement();
var combo_box_popup_load_type = new UI_ComboBox(parent);
combo_box_popup_load_type.attachItem(_i18n.getMessage("menu_setting_expand_image_load_start_type_preload"),"preload");
combo_box_popup_load_type.attachItem(_i18n.getMessage("menu_setting_expand_image_load_start_type_scroll"),"scroll");
combo_box_popup_load_type.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.load_type = v;
});
_setting_define.update();
projectModify();
};
// ポップアップイメージの配置基点
var container = new UI_LineContainer(form_parent_popup,_i18n.getMessage("menu_setting_expand_image_popup_origin_type"));
var parent = container.getElement();
var combo_box_popup_origin_type = new UI_ComboBox(parent);
combo_box_popup_origin_type.attachItem(_i18n.getMessage("menu_setting_expand_image_popup_origin_type_combo_box_item_center"),"center");
combo_box_popup_origin_type.attachItem(_i18n.getMessage("menu_setting_expand_image_popup_origin_type_combo_box_item_upper_left"),"upper_left");
combo_box_popup_origin_type.attachItem(_i18n.getMessage("menu_setting_expand_image_popup_origin_type_combo_box_item_upper_right"),"upper_right");
combo_box_popup_origin_type.attachItem(_i18n.getMessage("menu_setting_expand_image_popup_origin_type_combo_box_item_client_center"),"client_center");
combo_box_popup_origin_type.attachItem(_i18n.getMessage("menu_setting_expand_image_popup_origin_type_combo_box_item_adsorb_element"),"adsorb_element");
combo_box_popup_origin_type.attachItem(_i18n.getMessage("menu_setting_expand_image_popup_origin_type_combo_box_item_adsorb_mouse"),"adsorb_mouse");
combo_box_popup_origin_type.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.origin_type = v;
});
_setting_define.update();
projectModify();
};
// ポップアップイメージの配置位置
var container = new UI_LineContainer(form_parent_popup,_i18n.getMessage("menu_setting_expand_image_popup_position_type"));
var parent = container.getElement();
var combo_box_popup_position_type = new UI_ComboBox(parent);
combo_box_popup_position_type.attachItem(_i18n.getMessage("menu_setting_expand_image_popup_position_type_combo_box_item_absolute"),"absolute");
combo_box_popup_position_type.attachItem(_i18n.getMessage("menu_setting_expand_image_popup_position_type_combo_box_item_fixed"),"fixed");
combo_box_popup_position_type.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.position_type = v;
});
_setting_define.update();
projectModify();
};
// ポップアップイメージの表示サイズ
var container = new UI_LineContainer(form_parent_popup,_i18n.getMessage("menu_setting_expand_image_popup_size"));
var parent = container.getElement();
// 拡大率(パーセント)
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_image_popup_size_scale"));
var stepper_popup_scale_percent = new UI_NumericStepper(parent);
stepper_popup_scale_percent.setMinimum(0);
stepper_popup_scale_percent.setMaximum(9999999);
stepper_popup_scale_percent.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.scale_percent = v;
});
_setting_define.update();
projectModify();
};
// ポップアップ時間
var container = new UI_LineContainer(form_parent_popup,_i18n.getMessage("menu_setting_expand_image_popup_time"));
var parent = container.getElement();
// 開くまでに待機する時間(ミリ秒)
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_image_popup_time_wait_open"));
var stepper_popup_time_wait_open = new UI_NumericStepper(parent);
stepper_popup_time_wait_open.setMinimum(0);
stepper_popup_time_wait_open.setMaximum(9999999);
stepper_popup_time_wait_open.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.time_wait_open = v;
});
_setting_define.update();
projectModify();
};
// 閉じるまでに待機する時間(ミリ秒)
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_image_popup_time_wait_close"));
var stepper_popup_time_wait_close = new UI_NumericStepper(parent);
stepper_popup_time_wait_close.setMinimum(0);
stepper_popup_time_wait_close.setMaximum(9999999);
stepper_popup_time_wait_close.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.time_wait_close = v;
});
_setting_define.update();
projectModify();
};
// リンクからポップアップ表示する条件
var container = new UI_LineContainer(form_parent_popup,_i18n.getMessage("menu_setting_expand_image_popup_script_allow"));
var parent = container.getElement();
var text_area_popup_script_allow = new UI_ScriptArea(parent);
text_area_popup_script_allow.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.popup.script_allow = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// イメージのロード設定
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_image_load"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// イメージ読み込み設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_image_load_check_box_container"));
var parent = container.getElement();
// 読み込み進捗表示を有効
var check_box_image_load_enable_notify = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_load_enable_notify"));
check_box_image_load_enable_notify.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.load.enable_notify = v;
});
_setting_define.update();
projectModify();
};
// イメージのソースタイプ
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_image_load_src_type"));
var parent = container.getElement();
var combo_box_load_src_type = new UI_ComboBox(parent);
combo_box_load_src_type.attachItem(_i18n.getMessage("menu_setting_expand_image_load_src_type_combo_box_item_url"),"url");
combo_box_load_src_type.attachItem(_i18n.getMessage("menu_setting_expand_image_load_src_type_combo_box_item_mixed_content"),"mixed_content");
combo_box_load_src_type.attachItem(_i18n.getMessage("menu_setting_expand_image_load_src_type_combo_box_item_data_uri_scheme"),"data_uri_scheme");
combo_box_load_src_type.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.load.src_type = v;
});
_setting_define.update();
projectModify();
};
// イメージのアンロード設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_image_load_unload_check_box_container"));
var parent = container.getElement();
// イメージのアンロードを有効
var check_box_enable_unload = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_image_load_enable_unload"));
check_box_enable_unload.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.load.enable_unload = v;
});
_form_container_unload.setVisible(v);
_setting_define.update();
projectModify();
};
_form_container_unload = new UI_FormContainer(group_parent);
_form_container_unload.setVisible(false);
var form_parent_unload = _form_container_unload.getElement();
// イメージのアンロード条件
var container = new UI_LineContainer(form_parent_unload,_i18n.getMessage("menu_setting_expand_image_load_unload"));
var parent = container.getElement();
var stepper_unload_allow_size_more_then = new UI_NumericStepper(parent);
stepper_unload_allow_size_more_then.setMinimum(0);
stepper_unload_allow_size_more_then.setMaximum(99999);
stepper_unload_allow_size_more_then.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.load.unload_allow_size_more_then = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_image_load_allow_unload_more_then_text"));
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("expand_image");
_setting_define.setFunctionForNewData(createExpandImage);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// サムネイルを表示
check_box_enable_thumbnail.setValue(c.thumbnail.enable_thumbnail);
// サムネイルにマウスオーバーするとポップアップ表示
check_box_enable_popup_mouseover.setValue(c.thumbnail.enable_popup_mouseover);
// 同じイメージがすでに配置されている場合サムネイルを表示しない
check_box_disable_same_thumbnail_image.setValue(c.thumbnail.disable_same_image);
// サムネイルイメージの読み込み設定
combo_box_thumbnail_load_type.setValue(c.thumbnail.load_type);
// リンクからサムネイル化する条件
text_area_thumbnail_script_allow.setValue(c.thumbnail.script_allow);
// サムネイルの挿入位置
text_area_thumbnail_script_insert.setValue(c.thumbnail.script_insert);
// ポップアップ表示の有無
check_box_popup_enable_popup_mouseover.setValue(c.popup.enable_popup_mouseover);
// ポップアップ時のアニメーション動作を有効
check_box_enable_animation_scale.setValue(c.popup.enable_animation_scale);
check_box_enable_animation_alpha.setValue(c.popup.enable_animation_alpha);
// ポップアップイメージの読み込み設定
combo_box_popup_load_type.setValue(c.popup.load_type);
// ポップアップイメージの配置基点
combo_box_popup_origin_type.setValue(c.popup.origin_type);
// ポップアップイメージの配置位置
combo_box_popup_position_type.setValue(c.popup.position_type);
// 拡大率(パーセント)
stepper_popup_scale_percent.setValue(c.popup.scale_percent);
// 開くまでに待機する時間(ミリ秒)
stepper_popup_time_wait_open.setValue(c.popup.time_wait_open);
// 閉じるまでに待機する時間(ミリ秒)
stepper_popup_time_wait_close.setValue(c.popup.time_wait_close);
// リンクからポップアップ表示する条件
text_area_popup_script_allow.setValue(c.popup.script_allow);
// 縮小されたイメージをマウスオーバーするとポップアップ表示
check_box_reduced_image_enable_popup.setValue(c.reduced_image.enable_popup);
// 縮小率
stepper_popup_allow_slcale_less_then.setValue(c.reduced_image.popup_allow_slcale_less_then);
// 読み込み進捗表示
check_box_image_load_enable_notify.setValue(c.load.enable_notify);
// 読み込みソースタイプ
combo_box_load_src_type.setValue(c.load.src_type);
// イメージのアンロードを有効
check_box_enable_unload.setValue(c.load.enable_unload);
_form_container_unload.setVisible(c.load.enable_unload);
// イメージのアンロード条件
stepper_unload_allow_size_more_then.setValue(c.load.unload_allow_size_more_then);
_selected_id = id;
formUpdate();
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_EXPAND_IMAGE);
};
})();
}
// ------------------------------
// サウンドの展開の定義
// ------------------------------
function ContentSettingExpandSound(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().expand_sound;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_expand_sound"));
// インライン表示の設定
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_sound_inline"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// インライン表示の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_sound_inline_check_box_container"));
var parent = container.getElement();
// 同じオーディオがすでに配置されている場合サムネイルを表示しない
var check_box_disable_same_sound = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_sound_inline_disable_same_text"));
check_box_disable_same_sound.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.disable_same_audio = v;
});
_setting_define.update();
projectModify();
};
// 最大同時表示数
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_sound_inline_sound_max"));
var parent = container.getElement();
var stepper_inline_sound_max = new UI_NumericStepper(parent);
stepper_inline_sound_max.setMinimum(1);
stepper_inline_sound_max.setMaximum(99999);
stepper_inline_sound_max.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.sound_max = v;
});
_setting_define.update();
projectModify();
};
// リンクからインライン表示する条件
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_sound_inline_script_allow"));
var parent = container.getElement();
var text_area_inline_script_allow = new UI_ScriptArea(parent);
text_area_inline_script_allow.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.script_allow = v;
});
_setting_define.update();
projectModify();
};
// オーディオの挿入位置
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_sound_inline_script_insert"));
var parent = container.getElement();
var text_area_inline_script_insert = new UI_ScriptArea(parent);
text_area_inline_script_insert.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.script_insert = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// HTMLAudioElement の設定
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_sound_inline_element"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// リンクからインライン表示する条件
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_sound_inline_element_script_allow"));
var parent = container.getElement();
var text_area_audio_element_script_allow = new UI_ScriptArea(parent);
text_area_audio_element_script_allow.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.audio_element.script_allow = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_sound_inline_soundcloud"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// soundcloud.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_sound_inline_soundcloud_check_box_container"));
var parent = container.getElement();
// Flash 版プレイヤーを表示
var check_box_soundcloud_visible_player_flash = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_sound_inline_soundcloud_visible_player_flash"));
check_box_soundcloud_visible_player_flash.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.soundcloud.visible_player_flash = v;
});
_setting_define.update();
projectModify();
};
// HTML5 版プレイヤーを表示
var check_box_soundcloud_visible_player_html5 = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_sound_inline_soundcloud_visible_player_html5"));
check_box_soundcloud_visible_player_html5.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.soundcloud.visible_player_html5 = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_sound_inline_mixcloud"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// www.mixcloud.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_sound_inline_mixcloud_check_box_container"));
var parent = container.getElement();
// プレイヤーを表示
var check_box_mixcloud_visible_player = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_sound_inline_mixcloud_visible_player"));
check_box_mixcloud_visible_player.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.mixcloud.visible_player = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("expand_sound");
_setting_define.setFunctionForNewData(createExpandSound);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// 同じオーディオがすでに配置されている場合サムネイルを表示しない
check_box_disable_same_sound.setValue(c.inline.disable_same_audio);
// 最大同時表示数
stepper_inline_sound_max.setValue(c.inline.sound_max);
// リンクからインライン表示する条件
text_area_inline_script_allow.setValue(c.inline.script_allow);
// サウンドの挿入位置
text_area_inline_script_insert.setValue(c.inline.script_insert);
// HTMLAudioElement を表示する条件
text_area_audio_element_script_allow.setValue(c.audio_element.script_allow);
// soundcloud プレイヤー表示
check_box_soundcloud_visible_player_flash.setValue(c.soundcloud.visible_player_flash);
check_box_soundcloud_visible_player_html5.setValue(c.soundcloud.visible_player_html5);
// mixcloud プレイヤー表示
check_box_mixcloud_visible_player.setValue(c.mixcloud.visible_player);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_EXPAND_SOUND);
};
})();
}
// ------------------------------
// ビデオの展開の定義
// ------------------------------
function ContentSettingExpandVideo(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().expand_video;
// インライン表示の設定
_setting_define.setTitle(_i18n.getMessage("menu_setting_expand_video"));
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// インライン表示の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_check_box_container"));
var parent = container.getElement();
// 同じURLは展開しない
var check_box_inline_disable_same_video = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_disable_same_video"));
check_box_inline_disable_same_video.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.disable_same_video = v;
});
_setting_define.update();
projectModify();
};
// 最大同時表示数
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_video_max"));
var parent = container.getElement();
var stepper_inline_video_max = new UI_NumericStepper(parent);
stepper_inline_video_max.setMinimum(1);
stepper_inline_video_max.setMaximum(99999);
stepper_inline_video_max.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.video_max = v;
});
_setting_define.update();
projectModify();
};
// リンクからインライン表示する条件
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_script_allow"));
var parent = container.getElement();
var text_area_inline_script_allow = new UI_ScriptArea(parent);
text_area_inline_script_allow.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.script_allow = v;
});
_setting_define.update();
projectModify();
};
// エレメントの挿入位置
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_script_insert"));
var parent = container.getElement();
var text_area_inline_script_insert = new UI_ScriptArea(parent);
text_area_inline_script_insert.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.script_insert = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// HTMLVideoElement の設定
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline_element"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// リンクからインライン表示する条件
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_element_script_allow"));
var parent = container.getElement();
var text_area_video_element_script_allow = new UI_ScriptArea(parent);
text_area_video_element_script_allow.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.video_element.script_allow = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline_youtube"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// www.youtube.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_youtube_check_box_container"));
var parent = container.getElement();
// ビデオを表示
var check_box_youtube_visible_video = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_youtube_visible_video"));
check_box_youtube_visible_video.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.youtube.visible_video = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// www.nicovideo.jp の設定"
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo_check_box_container"));
var parent = container.getElement();
// ビデオを表示
var check_box_nicovideo_visible_video = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo_visible_video"));
check_box_nicovideo_visible_video.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.nicovideo.visible_video = v;
});
_setting_define.update();
projectModify();
};
// ビデオサムネイルを表示
var check_box_nicovideo_visible_thumbnail_video = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo_visible_thumbnail_video"));
check_box_nicovideo_visible_thumbnail_video.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.nicovideo.visible_thumbnail_video = v;
});
_setting_define.update();
projectModify();
};
// マイリストサムネイルを表示
var check_box_nicovideo_visible_thumbnail_mylist = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo_visible_thumbnail_mylist"));
check_box_nicovideo_visible_thumbnail_mylist.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.nicovideo.visible_thumbnail_mylist = v;
});
_setting_define.update();
projectModify();
};
// ユーザーサムネイルを表示
var check_box_nicovideo_visible_thumbnail_user = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo_visible_thumbnail_user"));
check_box_nicovideo_visible_thumbnail_user.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.nicovideo.visible_thumbnail_user = v;
});
_setting_define.update();
projectModify();
};
// コミュニティサムネイルを表示
var check_box_nicovideo_visible_thumbnail_community = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo_visible_thumbnail_community"));
check_box_nicovideo_visible_thumbnail_community.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.nicovideo.visible_thumbnail_community = v;
});
_setting_define.update();
projectModify();
};
// 生放送サムネイルを表示
var check_box_nicovideo_visible_thumbnail_live = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo_visible_thumbnail_live"));
check_box_nicovideo_visible_thumbnail_live.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.nicovideo.visible_thumbnail_live = v;
});
_setting_define.update();
projectModify();
};
// 静画サムネイルを表示
var check_box_nicovideo_visible_thumbnail_seiga = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_nicovideo_visible_thumbnail_seiga"));
check_box_nicovideo_visible_thumbnail_seiga.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.nicovideo.visible_thumbnail_seiga = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline_ustream"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// www.ustream.tv の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_ustream_check_box_container"));
var parent = container.getElement();
// 配信ビデオを表示
var check_box_ustream_visible_video_live = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_ustream_visible_video_live"));
check_box_ustream_visible_video_live.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.ustream.visible_video_live = v;
});
_setting_define.update();
projectModify();
};
// 録画ビデオを表示
var check_box_ustream_visible_video_record = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_ustream_visible_video_record"));
check_box_ustream_visible_video_record.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.ustream.visible_video_record = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline_dailymotion"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// www.dailymotion.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_dailymotion_check_box_container"));
var parent = container.getElement();
// ビデオを表示
var check_box_dailymotion_visible_video = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_dailymotion_visible_video"));
check_box_dailymotion_visible_video.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.dailymotion.visible_video = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline_video"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// vimeo.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_video_check_box_container"));
var parent = container.getElement();
// ビデオを表示
var check_box_vimeo_visible_video = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_video_visible_video"));
check_box_vimeo_visible_video.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.vimeo.visible_video = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline_fc2video"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// video.fc2.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_fc2video_check_box_container"));
var parent = container.getElement();
// ビデオを表示
var check_box_fc2video_visible_video = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_fc2video_visible_video"));
check_box_fc2video_visible_video.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.fc2video.visible_video = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_video_inline_liveleak"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// www.liveleak.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_video_inline_liveleak_check_box_container"));
var parent = container.getElement();
// ビデオを表示
var check_box_liveleak_visible_video = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_video_inline_liveleak_visible_video"));
check_box_liveleak_visible_video.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.liveleak.visible_video = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("expand_video");
_setting_define.setFunctionForNewData(createExpandVideo);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// 同じURLは展開しない
check_box_inline_disable_same_video.setValue(c.inline.disable_same_video);
// 最大同時表示数
stepper_inline_video_max.setValue(c.inline.video_max);
// リンクからインライン表示する条件
text_area_inline_script_allow.setValue(c.inline.script_allow);
// エレメントの挿入位置
text_area_inline_script_insert.setValue(c.inline.script_insert);
// HTMLVideoElement を表示する条件
text_area_video_element_script_allow.setValue(c.video_element.script_allow);
// youtube ビデオ表示
check_box_youtube_visible_video.setValue(c.youtube.visible_video);
// nicovideo ビデオ表示
check_box_nicovideo_visible_video.setValue(c.nicovideo.visible_video);
// nicovideo ビデオサムネイル表示
check_box_nicovideo_visible_thumbnail_video.setValue(c.nicovideo.visible_thumbnail_video);
// nicovideo マイリストサムネイル表示
check_box_nicovideo_visible_thumbnail_mylist.setValue(c.nicovideo.visible_thumbnail_mylist);
// nicovideo ユーザーサムネイル表示
check_box_nicovideo_visible_thumbnail_user.setValue(c.nicovideo.visible_thumbnail_user);
// nicovideo コミュニティサムネイル表示
check_box_nicovideo_visible_thumbnail_community.setValue(c.nicovideo.visible_thumbnail_community);
// nicovideo 生放送サムネイル表示
check_box_nicovideo_visible_thumbnail_live.setValue(c.nicovideo.visible_thumbnail_live);
// nicovideo 静画サムネイル表示
check_box_nicovideo_visible_thumbnail_seiga.setValue(c.nicovideo.visible_thumbnail_seiga);
// ustream 配信ビデオ表示
check_box_ustream_visible_video_live.setValue(c.ustream.visible_video_live);
// ustream 録画ビデオ表示
check_box_ustream_visible_video_record.setValue(c.ustream.visible_video_record);
// dailymotion ビデオ表示
check_box_dailymotion_visible_video.setValue(c.dailymotion.visible_video);
// vimeo ビデオ表示
check_box_vimeo_visible_video.setValue(c.vimeo.visible_video);
// fc2video ビデオ表示
check_box_fc2video_visible_video.setValue(c.fc2video.visible_video);
// LiveLeak ビデオ表示
check_box_liveleak_visible_video.setValue(c.liveleak.visible_video);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_EXPAND_VIDEO);
};
})();
}
// ------------------------------
// インラインフレームの展開の定義
// ------------------------------
function ContentSettingExpandIframe(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().expand_iframe;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_expand_iframe"));
// インライン表示の設定
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_expand_iframe_inline"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// インライン表示の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_iframe_inline_check_box_container"));
var parent = container.getElement();
// 同じURLは展開しない
var check_box_disable_same_iframe = new UI_CheckBox(parent,_i18n.getMessage("menu_setting_expand_iframe_inline_disable_same_iframe"));
check_box_disable_same_iframe.onchange = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.disable_same_iframe = v;
});
_setting_define.update();
projectModify();
};
// リンクからインライン表示する条件
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_iframe_inline_script_allow"));
var parent = container.getElement();
var text_area_inline_script_allow = new UI_ScriptArea(parent);
text_area_inline_script_allow.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.script_allow = v;
});
_setting_define.update();
projectModify();
};
// HTMLIFrameElement の挿入位置
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_expand_iframe_inline_script_insert"));
var parent = container.getElement();
var text_area_inline_script_insert = new UI_ScriptArea(parent);
text_area_inline_script_insert.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.inline.script_insert = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("expand_iframe");
_setting_define.setFunctionForNewData(createExpandIframe);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
// 同じURLは展開しない
check_box_disable_same_iframe.setValue(c.inline.disable_same_iframe);
// リンクからインライン表示する条件
text_area_inline_script_allow.setValue(c.inline.script_allow);
// サウンドの挿入位置
text_area_inline_script_insert.setValue(c.inline.script_insert);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_EXPAND_IFRAME);
};
})();
}
// ------------------------------
// スタイルシートの定義
// ------------------------------
function ContentSettingStyleSheet(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().style_sheet;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_style_sheet"));
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_style_sheet_expand_text"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// HTMLTextAreaElement の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_text_element"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_text_element_inline"));
var text_input_expand_text_inline = new UI_TextInput(parent);
text_input_expand_text_inline.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_text.inline = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_style_sheet_expand_image"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// HTMImageElement の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_image_element"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_image_element_inline"));
var text_input_expand_image_thumbnail = new UI_TextInput(parent);
text_input_expand_image_thumbnail.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_image.thumbnail = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_image_element_popup"));
var text_input_expand_image_popup = new UI_TextInput(parent);
text_input_expand_image_popup.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_image.popup = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_style_sheet_expand_sound"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// HTMLAudioElement の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_sound_element"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_sound_element_inline_audio"));
var text_input_expand_sound_inline_audio_element = new UI_TextInput(parent);
text_input_expand_sound_inline_audio_element.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_sound.inline.audio_element.audio = v;
});
_setting_define.update();
projectModify();
};
// SoundCloud の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_sound_soundcloud"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_sound_soundcloud_inline_player_flash"));
var text_input_expand_sound_soundcloud_inline_player_flash = new UI_TextInput(parent);
text_input_expand_sound_soundcloud_inline_player_flash.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_sound.inline.soundcloud.player_flash = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_sound_soundcloud_inline_player_html5"));
var text_input_expand_sound_soundcloud_inline_player_html5 = new UI_TextInput(parent);
text_input_expand_sound_soundcloud_inline_player_html5.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_sound.inline.soundcloud.player_html5 = v;
});
_setting_define.update();
projectModify();
};
// MixCloud の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_sound_mixcloud"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_sound_mixcloud_inline_player"));
var text_input_expand_sound_mixcloud_inline_player = new UI_TextInput(parent);
text_input_expand_sound_mixcloud_inline_player.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_sound.inline.mixcloud.player = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// HTMLVideoElement の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_element"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_element_inline_video"));
var text_input_expand_video_inline_video_element = new UI_TextInput(parent);
text_input_expand_video_inline_video_element.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.video_element.video = v;
});
_setting_define.update();
projectModify();
};
// www.youtube.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_youtube"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_youtube_inline_video"));
var text_input_expand_video_youtube_inline_video = new UI_TextInput(parent);
text_input_expand_video_youtube_inline_video.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.youtube.video = v;
});
_setting_define.update();
projectModify();
};
// www.nicovideo.jp の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_nicovideo"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_nicovideo_inline_video"));
var text_input_expand_video_nicovideo_inline_video = new UI_TextInput(parent);
text_input_expand_video_nicovideo_inline_video.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.nicovideo.video = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_video"));
var text_input_expand_video_nicovideo_inline_thumbnail_video = new UI_TextInput(parent);
text_input_expand_video_nicovideo_inline_thumbnail_video.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.nicovideo.thumbnail_video = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_mylist"));
var text_input_expand_video_nicovideo_inline_thumbnail_mylist = new UI_TextInput(parent);
text_input_expand_video_nicovideo_inline_thumbnail_mylist.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.nicovideo.thumbnail_mylist = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_user"));
var text_input_expand_video_nicovideo_inline_thumbnail_user = new UI_TextInput(parent);
text_input_expand_video_nicovideo_inline_thumbnail_user.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.nicovideo.thumbnail_user = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_community"));
var text_input_expand_video_nicovideo_inline_thumbnail_community = new UI_TextInput(parent);
text_input_expand_video_nicovideo_inline_thumbnail_community.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.nicovideo.thumbnail_community = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_live"));
var text_input_expand_video_nicovideo_inline_thumbnail_live = new UI_TextInput(parent);
text_input_expand_video_nicovideo_inline_thumbnail_live.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.nicovideo.thumbnail_live = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_seiga"));
var text_input_expand_video_nicovideo_inline_thumbnail_seiga = new UI_TextInput(parent);
text_input_expand_video_nicovideo_inline_thumbnail_seiga.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.nicovideo.thumbnail_seiga = v;
});
_setting_define.update();
projectModify();
};
// www.ustream.tv の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_ustream"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_ustream_inline_video_record"));
var text_input_expand_video_ustream_inline_video_record = new UI_TextInput(parent);
text_input_expand_video_ustream_inline_video_record.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.ustream.video_record = v;
});
_setting_define.update();
projectModify();
};
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_ustream_inline_video_live"));
var text_input_expand_video_ustream_inline_video_live = new UI_TextInput(parent);
text_input_expand_video_ustream_inline_video_live.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.ustream.video_live = v;
});
_setting_define.update();
projectModify();
};
// www.dailymotion.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_dailymotion"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_dailymotion_inline_video"));
var text_input_expand_video_dailymotion_inline_video = new UI_TextInput(parent);
text_input_expand_video_dailymotion_inline_video.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.dailymotion.video = v;
});
_setting_define.update();
projectModify();
};
// vimeo.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_vimeo"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_vimeo_inline_video"));
var text_input_expand_video_vimeo_inline_video = new UI_TextInput(parent);
text_input_expand_video_vimeo_inline_video.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.vimeo.video = v;
});
_setting_define.update();
projectModify();
};
// video.fc2.com の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_fc2video"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_fc2video_inline_video"));
var text_input_expand_video_fc2video_inline_video = new UI_TextInput(parent);
text_input_expand_video_fc2video_inline_video.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.fc2video.video = v;
});
_setting_define.update();
projectModify();
};
// LiveLeak の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_liveleak"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_video_liveleak_inline_video"));
var text_input_expand_video_liveleak_inline_video = new UI_TextInput(parent);
text_input_expand_video_liveleak_inline_video.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_video.inline.liveleak.video = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// タイトル
var title = new UI_TitleSub(form_parent,_i18n.getMessage("menu_setting_style_sheet_expand_iframe"));
// グループ
var group = new UI_GroupContainer(form_parent);
var group_parent = group.getElement();
// HTMLIFrameElement の設定
var container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_style_sheet_expand_iframe_element"));
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_style_sheet_expand_iframe_element_inline"));
var text_input_expand_iframe_inline = new UI_TextInput(parent);
text_input_expand_iframe_inline.oninput = function(v){
_setting_define.getSelectedDefinitions(function(c){
c.expand_iframe.inline = v;
});
_setting_define.update();
projectModify();
};
new UI_Break(form_parent);
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("style_sheet");
_setting_define.setFunctionForNewData(createStyleSheet);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
text_input_expand_text_inline.setValue(c.expand_text.inline);
text_input_expand_image_thumbnail.setValue(c.expand_image.thumbnail);
text_input_expand_image_popup.setValue(c.expand_image.popup);
text_input_expand_sound_inline_audio_element.setValue(c.expand_sound.inline.audio_element.audio);
text_input_expand_sound_soundcloud_inline_player_flash.setValue(c.expand_sound.inline.soundcloud.player_flash);
text_input_expand_sound_soundcloud_inline_player_html5.setValue(c.expand_sound.inline.soundcloud.player_html5);
text_input_expand_sound_mixcloud_inline_player.setValue(c.expand_sound.inline.mixcloud.player);
text_input_expand_video_inline_video_element.setValue(c.expand_video.inline.video_element.video);
text_input_expand_video_youtube_inline_video.setValue(c.expand_video.inline.youtube.video);
text_input_expand_video_nicovideo_inline_video.setValue(c.expand_video.inline.nicovideo.video);
text_input_expand_video_nicovideo_inline_thumbnail_video.setValue(c.expand_video.inline.nicovideo.thumbnail_video);
text_input_expand_video_nicovideo_inline_thumbnail_mylist.setValue(c.expand_video.inline.nicovideo.thumbnail_mylist);
text_input_expand_video_nicovideo_inline_thumbnail_user.setValue(c.expand_video.inline.nicovideo.thumbnail_user);
text_input_expand_video_nicovideo_inline_thumbnail_community.setValue(c.expand_video.inline.nicovideo.thumbnail_community);
text_input_expand_video_nicovideo_inline_thumbnail_live.setValue(c.expand_video.inline.nicovideo.thumbnail_live);
text_input_expand_video_nicovideo_inline_thumbnail_seiga.setValue(c.expand_video.inline.nicovideo.thumbnail_seiga);
text_input_expand_video_ustream_inline_video_live.setValue(c.expand_video.inline.ustream.video_live);
text_input_expand_video_ustream_inline_video_record.setValue(c.expand_video.inline.ustream.video_record);
text_input_expand_video_dailymotion_inline_video.setValue(c.expand_video.inline.dailymotion.video);
text_input_expand_video_vimeo_inline_video.setValue(c.expand_video.inline.vimeo.video);
text_input_expand_video_fc2video_inline_video.setValue(c.expand_video.inline.fc2video.video);
text_input_expand_video_liveleak_inline_video.setValue(c.expand_video.inline.liveleak.video);
text_input_expand_iframe_inline.setValue(c.expand_iframe.inline);
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_STYLE_SHEET);
};
})();
}
// ------------------------------
// 試験運用の定義
// ------------------------------
function ContentSettingExperimental(){
var _this = this;
// ------------------------------
// 選択
// ------------------------------
_this.select = function(id){
_setting_define.select(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
_setting_define.selectFromIdList(list);
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
_setting_define.replaceHistory();
};
// ------------------------------
// プライベート変数
// ------------------------------
var _setting_define;
var _form_container;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_setting_define = new ContentSettingDefine();
var form_parent = _setting_define.getElementForm();
var define = page_expand_project.getObject().experimental;
// タイトル
_setting_define.setTitle(_i18n.getMessage("menu_setting_experimental"));
// データの関連付け
_setting_define.attachDefineData(define);
_setting_define.setDefineAssetName("experimental");
_setting_define.setFunctionForNewData(createExperimental);
// リスト選択
_setting_define.onselect = function(id){
var c = ProjectObjectGetActiveData(define[id]);
if(!c) return;
};
// リロード
_setting_define.onreload = function(){
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_EXPERIMENTAL);
};
})();
}
// ------------------------------
// 言語設定
// ------------------------------
function ContentSettingLanguage(){
var _this = this;
// ------------------------------
// プライベート変数
// ------------------------------
var _combo_box_language;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var language = page_expand_project.getObject().language;
// タイトル
var title = new UI_Title(_content_window,_i18n.getMessage("menu_setting_language"));
// 言語設定
var container = new UI_LineContainer(_content_window,"Language");
var parent = container.getElement();
_combo_box_language = new UI_ComboBox(parent);
_combo_box_language.attachItem("BROWSER LANGUAGE",-1);
_combo_box_language.attachItem("日本語",0);
_combo_box_language.attachItem("ENGLISH",1);
_combo_box_language.onchange = function(v){
language.type = parseInt(v);
projectModify();
// PageExpandConfig を再構築
initialize();
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_LANGUAGE);
};
// 言語タイプ
_combo_box_language.setValue(language.type);
})();
}
// ------------------------------
// クレジット
// ------------------------------
function ContentCredit(){
var _this = this;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var title = new UI_Title(_content_window,_i18n.getMessage("menu_credit"));
// バージョン情報
var container = new UI_LineContainer(_content_window,_i18n.getMessage("menu_credit_info_version"));
var parent = container.getElement();
new UI_Text(parent,"PageExpand ver.1.4.3");
// 製作
var container = new UI_LineContainer(_content_window,_i18n.getMessage("menu_credit_info_copyright"));
var parent = container.getElement();
new UI_Text(parent,'(c) Hakuhin 2010-2014');
new UI_AnchorText(parent,"http://hakuhin.jp/","http://hakuhin.jp/");
})();
}
// ------------------------------
// ラインコンテナ
// ------------------------------
function UI_LineContainer(parent,label){
var _this = this;
// ------------------------------
// 透明度をセット
// ------------------------------
_this.setAlpha = function(v){
_window.style.opacity = v;
};
// ------------------------------
// エレメント取得
// ------------------------------
_this.getElement = function(){
return _body;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _window;
var _body;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_window = DocumentCreateElement("div");
ElementSetStyle(_window,"margin:0px 0px 20px; padding:10px; background:#fcfcfc; border-radius:10px; box-shadow:0px 0px 2px #ccc;");
parent.appendChild(_window);
if(label){
var div = DocumentCreateElement("div");
ElementSetStyle(div,"padding:5px 0px 5px 20px; margin:0px 0px 10px; background:#666; color:#fff; border-radius:10px; box-shadow:0px 1px 1px #000;");
ElementSetTextContent(div,label);
_window.appendChild(div);
}
_body = DocumentCreateElement("div");
ElementSetStyle(_body,"margin:0px 10px 0px 10px;");
_window.appendChild(_body);
})();
}
// ------------------------------
// インラインコンテナ
// ------------------------------
function UI_InlineContainer(parent,label){
var _this = this;
// ------------------------------
// 幅をセット
// ------------------------------
_this.setWidth = function(v){
_window.style.width = v + "px";
};
// ------------------------------
// 透明度をセット
// ------------------------------
_this.setAlpha = function(v){
_window.style.opacity = v;
};
// ------------------------------
// 背景カラーをセット
// ------------------------------
_this.setBackgroundColor = function(argb){
var color = argb;
var brightness = 0.9;
var r = (color >> 16) & 0xFF;
var g = (color >> 8) & 0xFF;
var b = (color >> 0) & 0xFF;
r = Math.floor(r * brightness);
g = Math.floor(g * brightness);
b = Math.floor(b * brightness);
var style = _label.style;
var liner_gradient = "linear-gradient(right, #" + r.toString(16) + g.toString(16) + b.toString(16) + " 25px, #666 25px)";
style.backgroundImage = liner_gradient;
var none = {"none":1,"initial":1};
if(none[style.backgroundImage]) style.backgroundImage = "-webkit-" + liner_gradient;
if(none[style.backgroundImage]) style.backgroundImage = "-moz-" + liner_gradient;
if(none[style.backgroundImage]) style.backgroundImage = "-ms-" + liner_gradient;
if(none[style.backgroundImage]) style.backgroundImage = "-o-" + liner_gradient;
};
// ------------------------------
// エレメント取得
// ------------------------------
_this.getElement = function(){
return _body;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _window;
var _label;
var _body;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_window = DocumentCreateElement("div");
ElementSetStyle(_window,"width:350px; margin:0px 5px 20px 0px; padding:10px; background:#fcfcfc; display:inline-table; vertical-align:top; border-radius:10px; box-shadow:0px 0px 2px #ccc;");
parent.appendChild(_window);
if(label){
_label = DocumentCreateElement("div");
ElementSetStyle(_label,"padding:5px 0px 5px 20px; margin:0px 0px 10px; background:#666; color:#fff; border-radius:10px; box-shadow:0px 1px 1px #000;");
ElementSetTextContent(_label,label);
_window.appendChild(_label);
}
_body = DocumentCreateElement("div");
ElementSetStyle(_body,"margin:0px 10px 0px 10px;");
_window.appendChild(_body);
})();
}
// ------------------------------
// フォームコンテナ
// ------------------------------
function UI_FormContainer(parent,label){
var _this = this;
// ------------------------------
// 可視状態セット
// ------------------------------
_this.setVisible = function(type){
if(type){
_form.style.display = "";
}else{
_form.style.display = "none";
}
};
// ------------------------------
// エレメント取得
// ------------------------------
_this.getElement = function(){
return _form;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _form;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_form = DocumentCreateElement("form");
parent.appendChild(_form);
_this.setVisible(true);
})();
}
// ------------------------------
// グループコンテナ
// ------------------------------
function UI_GroupContainer(parent){
var _this = this;
// ------------------------------
// エレメント取得
// ------------------------------
_this.getElement = function(){
return _div;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _div;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_div = DocumentCreateElement("div");
_div.style.cssText = "padding-left:10px; padding-right:10px; border-left:20px #f4f4f4 solid; border-right:20px #f4f4f4 solid;";
parent.appendChild(_div);
})();
}
// ------------------------------
// モーダルダイアログ
// ------------------------------
function UI_ModalDialog(parent){
var _this = this;
// ------------------------------
// 幅を変更
// ------------------------------
_this.setWidth = function(v){
_window.style.width = v + "px";
};
// ------------------------------
// 開く
// ------------------------------
_this.open = function(){
var task = task_container.createTask(null);
var d = 0.0;
parent.appendChild(_window);
// イベントを登録
addEvent();
// リサイズ
resize();
task.setExecuteFunc(function(){
var complete = false;
d += 0.2;
if(d > 1.0){
d = 1.0;
complete = true;
}
_background.style.opacity = d * 0.5;
if(complete){
task.release();
}
});
task.execute(0xffffffff);
};
// ------------------------------
// 閉じる
// ------------------------------
_this.close = function(){
var task = task_container.createTask(null);
var d = 1.0;
DomNodeRemove(_window);
task.setExecuteFunc(function(){
var complete = false;
d -= 0.2;
if(d < 0.0){
d = 0.0;
complete = true;
}
_background.style.opacity = d * 0.5;
if(complete){
DomNodeRemove(_background);
_this.oncomplete();
task.release();
return;
}
});
task.execute(0xffffffff);
// イベントを破棄
removeEvent();
};
// ------------------------------
// エレメント取得
// ------------------------------
_this.getElement = function(){
return _window;
};
// ------------------------------
// 完了イベント
// ------------------------------
_this.oncomplete = function(){};
// ------------------------------
// リサイズ(内部用 )
// ------------------------------
function resize(){
var scroll_pos = WindowGetScrollPosition(window);
var client_size = DocumentGetClientSize(document);
var dialog_rect = ElementGetBoundingClientRect(_window);
var w = dialog_rect.right - dialog_rect.left;
var h = dialog_rect.bottom - dialog_rect.top;
_window.style.left = (client_size.width / 2 - w / 2 + scroll_pos.x) + "px";
if(client_size.height > h){
_window.style.top = (client_size.height / 2 - h / 2 + scroll_pos.y) + "px";
_fitted_top = false;
}else{
if(!_fitted_top){
_window.style.top = (scroll_pos.y) + "px";
_fitted_top = true;
}
}
}
// ------------------------------
// イベント登録(内部用 )
// ------------------------------
function addEvent(){
// イベントリスナーに対応している
if(window.addEventListener){
window.addEventListener("scroll" ,resize);
window.addEventListener("resize" ,resize);
// アタッチイベントに対応している
}else if(window.attachEvent){
window.attachEvent("onscroll" ,resize);
window.attachEvent("onresize" ,resize);
}
}
// ------------------------------
// イベント破棄(内部用 )
// ------------------------------
function removeEvent(){
// イベントリスナーに対応している
if(window.removeEventListener){
window.removeEventListener("scroll" ,resize);
window.removeEventListener("resize" ,resize);
// アタッチイベントに対応している
}else if(window.detachEvent){
window.detachEvent("onscroll" ,resize);
window.detachEvent("onresize" ,resize);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _background;
var _window;
var _fitted_top;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_background = DocumentCreateElement("div");
ElementSetStyle(_background,"position:fixed; top:0px; bottom:0px; left:0px; right:0px; opacity:0.0; background:#000;");
parent.appendChild(_background);
_window = DocumentCreateElement("div");
ElementSetStyle(_window,"position:absolute; width:800px; padding:10px 20px 5px; background:#00F; background-color:#FFF; border-radius:5px; box-shadow:5px 5px 10px #444;");
})();
}
// ------------------------------
// アラートダイアログ
// ------------------------------
function UI_AlertDialog(parent,title){
var _this = this;
// ------------------------------
// エレメント取得
// ------------------------------
_this.getElement = function(){
return _element;
};
// ------------------------------
// 開く
// ------------------------------
_this.open = function(){
// ダイアログ開始
_dialog.open();
};
// ------------------------------
// 完了イベント
// ------------------------------
_this.oncomplete = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _dialog;
var _element;
// ------------------------------
// 初期化
// ------------------------------
(function(){
// モーダルダイアログ作成
_dialog = new UI_ModalDialog(_content_window);
_dialog.setWidth(600);
var dialog_parent = _dialog.getElement();
// タイトル
new UI_Title(dialog_parent,title);
var container = new UI_LineContainer(dialog_parent,null);
_element = container.getElement();
// ボタン
var ok_button = new UI_OkButton(dialog_parent);
ok_button.onclick = function(){
// ダイアログ終了
_dialog.close();
_this.oncomplete();
};
})();
}
// ------------------------------
// タイトル
// ------------------------------
function UI_Title(parent,label){
var _this = this;
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
ElementSetTextContent(_body,v);
};
// ------------------------------
// プライベート変数
// ------------------------------
var _body;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_body = DocumentCreateElement("div");
ElementSetStyle(_body,"margin:0px 0px 10px; font-size:32px; text-align:right;");
ElementSetTextContent(_body,label);
parent.appendChild(_body);
})();
}
// ------------------------------
// サブタイトル
// ------------------------------
function UI_TitleSub(parent,label){
var _this = this;
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
ElementSetTextContent(_body,v);
};
// ------------------------------
// プライベート変数
// ------------------------------
var _body;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_body = DocumentCreateElement("div");
ElementSetStyle(_body,"margin:0px 0px 10px; font-size:24px; text-align:left;");
ElementSetTextContent(_body,label);
parent.appendChild(_body);
})();
}
// ------------------------------
// 改行
// ------------------------------
function UI_Break(parent){
var _this = this;
// ------------------------------
// 値をセット
// ------------------------------
_this.setHeight = function(v){
_body.style.height = (v) + "px";
};
// ------------------------------
// プライベート変数
// ------------------------------
var _body;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_body = DocumentCreateElement("div");
ElementSetStyle(_body,"margin:0px; height:20px;");
parent.appendChild(_body);
})();
}
// ------------------------------
// テキスト
// ------------------------------
function UI_Text(parent,label){
var div = DocumentCreateElement("div");
ElementSetStyle(div,"margin:0px 0px 5px;");
ElementSetTextContent(div,label);
parent.appendChild(div);
return div;
}
// ------------------------------
// テキストヒント
// ------------------------------
function UI_TextHint(parent,label){
var div = DocumentCreateElement("div");
ElementSetStyle(div,"margin:-2px 0px 5px; font-size:11px; color:#aaa;");
ElementSetTextContent(div,label);
parent.appendChild(div);
return div;
}
// ------------------------------
// アンカーテキスト
// ------------------------------
function UI_AnchorText(parent,label,url){
var div = DocumentCreateElement("div");
ElementSetStyle(div,"margin:0px 0px 5px;");
var anchor = DocumentCreateElement("a");
anchor.href = url;
ElementSetTextContent(anchor,label);
div.appendChild(anchor);
parent.appendChild(div);
return div;
}
// ------------------------------
// 順序無しリスト
// ------------------------------
function UI_UnorderedList(parent,label){
var _this = this;
// ------------------------------
// アイテムを追加
// ------------------------------
_this.addListItem = function(label){
var li = DocumentCreateElement("li");
ElementSetTextContent(li,label);
_ul.appendChild(li);
};
// ------------------------------
// プライベート変数
// ------------------------------
var _ul;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px;");
parent.appendChild(container);
_ul = DocumentCreateElement("ul");
container.appendChild(_ul);
})();
}
// ------------------------------
// チェックボックス
// ------------------------------
function UI_CheckBox(parent,label){
var _this = this;
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(){
return _input.checked;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_input.checked = v;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _input;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px;");
parent.appendChild(container);
var _label = DocumentCreateElement("label");
ElementSetStyle(_label,"user-select:none; -webkit-user-select:none; -moz-user-select:none; -khtml-user-select:none;");
container.appendChild(_label);
_input = DocumentCreateElement("input");
ElementSetStyle(_input,"margin:0px 2px 0px 0px;");
_input.type = "checkbox";
_label.appendChild(_input);
_input.onchange = function(){
_this.onchange(_input.checked);
};
var span = DocumentCreateElement("span");
ElementSetStyle(span,"font-size:14px;");
ElementSetTextContent(span,":" + label);
_label.appendChild(span);
})();
}
// ------------------------------
// チェックボックス
// ------------------------------
function UI_LineCheckBox(parent,label){
var _this = this;
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(){
return _input.checked;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_input.checked = v;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _input;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("span");
ElementSetStyle(container,"margin:0px 10px 5px 0px;");
parent.appendChild(container);
var _label = DocumentCreateElement("label");
ElementSetStyle(_label,"user-select:none; -webkit-user-select:none; -moz-user-select:none; -khtml-user-select:none;");
container.appendChild(_label);
_input = DocumentCreateElement("input");
ElementSetStyle(_input,"margin:0px 2px 0px 0px;");
_input.type = "checkbox";
_label.appendChild(_input);
_input.onchange = function(){
_this.onchange(_input.checked);
};
var span = DocumentCreateElement("span");
ElementSetStyle(span,"font-size:14px;");
ElementSetTextContent(span,":" + label);
_label.appendChild(span);
})();
}
// ------------------------------
// テキストダイナミック
// ------------------------------
function UI_TextDynamic(parent){
var _this = this;
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(){
return _input.value;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_input.value = v;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _input;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 8px 5px 0px;");
parent.appendChild(container);
_input = DocumentCreateElement("input");
_input.readOnly = "readonly";
ElementSetStyle(_input,"width:100%; padding:2px; background:#f8f8f8; color:#888;");
container.appendChild(_input);
})();
}
// ------------------------------
// テキストインプット
// ------------------------------
function UI_TextInput(parent){
var _this = this;
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(){
return _input.value;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_input.value = v;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.oninput = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _input;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 8px 5px 0px;");
parent.appendChild(container);
_input = DocumentCreateElement("input");
ElementSetStyle(_input,"width:100%; padding:2px; background-color:#fff;");
container.appendChild(_input);
_input.oninput = function(){
_this.oninput(_input.value);
};
})();
}
// ------------------------------
// 正規表現入力
// ------------------------------
function UI_TextRegExp(parent){
var _this = this;
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(){
return getValue();
};
// ------------------------------
// 値を取得
// ------------------------------
function getValue(){
return {
pattern:_input_pattern.value,
flags:{
i:_check_box_enable_i.getValue(),
g:_check_box_enable_g.getValue()
}
};
}
// ------------------------------
// エレメント取得
// ------------------------------
_this.getElement = function(){
return _body;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_input_pattern.value = v.pattern;
_check_box_enable_i.setValue(v.flags.i);
_check_box_enable_g.setValue(v.flags.g);
errorCheck();
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.oninput = function(){};
// ------------------------------
// 更新イベント
// ------------------------------
function oninput(){
errorCheck();
if(!_visible){
_this.oninput(getValue());
}
}
// ------------------------------
// エラーチェック
// ------------------------------
function errorCheck(){
try{
var reg_exp = new RegExp(_input_pattern.value);
setVisibleResult(false);
}catch(e){
_input_result.value = e;
setVisibleResult(true);
}
}
// ------------------------------
// 可視状態セット
// ------------------------------
function setVisibleResult(type){
if(type){
_input_result_container.appendChild(_input_result);
}else{
if(_visible){
DomNodeRemove(_input_result);
}
}
_visible = type;
}
// ------------------------------
// プライベート変数
// ------------------------------
var _body;
var _input_pattern;
var _input_result;
var _visible;
var _input_result_container;
var _check_box_enable_i;
var _check_box_enable_g;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_visible = false;
_body = DocumentCreateElement("div");
parent.appendChild(_body);
var table = DocumentCreateElement("div");
ElementSetStyle(table,"margin:0px 0px 0px 0px; display:table; width:100%;");
_body.appendChild(table);
var input_pattern_container = DocumentCreateElement("div");
ElementSetStyle(input_pattern_container,"display:table-cell; widht:auto; padding-right:8px;");
table.appendChild(input_pattern_container);
_input_pattern = DocumentCreateElement("input");
ElementSetStyle(_input_pattern,"width:100%; padding:2px; background-color:#fff;");
input_pattern_container.appendChild(_input_pattern);
_input_pattern.oninput = function(){
oninput();
};
var input_flags_container = DocumentCreateElement("div");
ElementSetStyle(input_flags_container,"display:table-cell; width:100px; padding-left:10px;");
table.appendChild(input_flags_container);
// g チェック
_check_box_enable_g = new UI_LineCheckBox(input_flags_container,"g");
_check_box_enable_g.onchange = function(v){
oninput();
};
// i チェック
_check_box_enable_i = new UI_LineCheckBox(input_flags_container,"i");
_check_box_enable_i.onchange = function(v){
oninput();
};
_input_result_container = DocumentCreateElement("div");
ElementSetStyle(_input_result_container,"margin:0px 8px 5px 0px;");
_body.appendChild(_input_result_container);
_input_result = DocumentCreateElement("input");
_input_result.readOnly = "readonly";
ElementSetStyle(_input_result,"width:100%; font-size:12px; padding:2px; background:#f88;");
new UI_TextHint(_body,_i18n.getMessage("menu_text_regexp_hint"));
})();
}
// ------------------------------
// テキストエリア
// ------------------------------
function UI_TextArea(parent){
var _this = this;
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(){
return _textarea.value;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_textarea.value = v;
};
// ------------------------------
// 改行コードで分割した配列を取得
// ------------------------------
_this.spiritByLine = function(v){
// 改行コードを統一
var s = _textarea.value.replace(/\r\n?/g,"\n");
var a = s.split("\n");
var n = a.length;
var i;
for(i=n-1;i>=0;i--){
if(!a[i]) a.splice(i,1);
}
return a;
};
// ------------------------------
// 配列の各番地のデータに文字を挟んだ文字列をセット
// ------------------------------
_this.joinArray = function(ary,v){
_textarea.value = ary.join(v);
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.oninput = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _textarea;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 8px 0px 0px;");
parent.appendChild(container);
_textarea = DocumentCreateElement("textarea");
ElementSetStyle(_textarea,"width:100%; height:100px;");
container.appendChild(_textarea);
_textarea.oninput = function(){
_this.oninput(_textarea.value);
};
})();
}
// ------------------------------
// スクリプトエリア
// ------------------------------
function UI_ScriptArea(parent){
var _this = this;
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(){
return _textarea.value;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_textarea.value = v;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.oninput = function(){};
// ------------------------------
// 可視状態セット
// ------------------------------
function setVisibleResult(type){
if(type){
_body.appendChild(_input_container);
}else{
if(_visible){
DomNodeRemove(_input_container);
}
}
_visible = type;
}
// ------------------------------
// プライベート変数
// ------------------------------
var _body;
var _textarea;
var _input_container;
var _input;
var _visible;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_visible = false;
_body = DocumentCreateElement("div");
ElementSetStyle(_body,"margin:0px 8px 0px 0px;");
parent.appendChild(_body);
_textarea = DocumentCreateElement("textarea");
ElementSetStyle(_textarea,"width:100%; height:300px; background-color:#fff;");
_body.appendChild(_textarea);
_textarea.oninput = function(){
try{
(function(){
eval("[function(){" + _textarea.value + "}]");
})();
setVisibleResult(false);
_this.oninput(_textarea.value);
}catch(e){
_input.value = e;
setVisibleResult(true);
}
};
_input_container = DocumentCreateElement("div");
ElementSetStyle(_input_container,"margin:-4px 8px 5px 0px;");
_input = DocumentCreateElement("input");
_input.readOnly = "readonly";
ElementSetStyle(_input,"width:100%; font-size:12px; padding:2px; background:#f88;");
_input_container.appendChild(_input);
new UI_TextHint(parent,_i18n.getMessage("menu_scriptarea_hint"));
})();
}
// ------------------------------
// ステッパー
// ------------------------------
function UI_NumericStepper(parent){
var _this = this;
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_input.value = v;
};
// ------------------------------
// 最小値をセット
// ------------------------------
_this.setMinimum = function(v){
_min = v;
};
// ------------------------------
// 最大値をセット
// ------------------------------
_this.setMaximum = function(v){
_max = v;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.oninput = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _input;
var _min;
var _max;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 8px 5px 0px;");
parent.appendChild(container);
_input = DocumentCreateElement("input");
_input.type = "number";
ElementSetStyle(_input,"width:100%; padding:2px; background-color:#fff;");
container.appendChild(_input);
_input.oninput = function(){
var v = parseInt(_input.value);
if(isNaN(v)){v = 0;}
if(v < _min) v = _min;
if(v > _max) v = _max;
_input.value = v;
_this.oninput(v);
};
_this.setMinimum(-0x80000000);
_this.setMaximum( 0x7fffffff);
})();
}
// ------------------------------
// ラインボタン
// ------------------------------
function UI_LineButton(parent,label){
var _this = this;
// ------------------------------
// クリックイベント
// ------------------------------
_this.onclick = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _input;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px -1px 5px 0px;");
parent.appendChild(container);
function ButtonOnClick(){
_this.onclick();
}
_input = DocumentCreateElement("input");
ElementSetStyle(_input,"width:100%; padding:20px 0px;");
_input.type = "button";
_input.value = label;
container.appendChild(_input);
_input.onclick = function(){
ButtonOnClick();
};
})();
}
// ------------------------------
// インラインボタン
// ------------------------------
function UI_InlineButton(parent,label){
var _this = this;
// ------------------------------
// クリックイベント
// ------------------------------
_this.onclick = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _input;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_input = DocumentCreateElement("input");
ElementSetStyle(_input,"padding:4px 10px; margin:0px 2px 5px -1px;");
_input.type = "button";
_input.value = label;
parent.appendChild(_input);
function ButtonOnClick(){
_this.onclick();
}
_input.onclick = function(){
ButtonOnClick();
};
})();
}
// ------------------------------
// YES NO ボタン
// ------------------------------
function UI_YesNoButton(parent){
var _this = this;
// ------------------------------
// クリックイベント
// ------------------------------
_this.onclick = function(){};
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px -1px 5px 0px; text-align:center;");
parent.appendChild(container);
function ButtonOnClick(result){
input_yes.disabled = true;
input_no.disabled = true;
_this.onclick(result);
}
var input_yes = DocumentCreateElement("input");
ElementSetStyle(input_yes,"padding:10px; width:200px;");
input_yes.type = "button";
input_yes.value = _i18n.getMessage("menu_button_yes");
container.appendChild(input_yes);
input_yes.onclick = function(){
ButtonOnClick(true);
};
var input_no = DocumentCreateElement("input");
ElementSetStyle(input_no,"padding:10px; width:200px;");
input_no.type = "button";
input_no.value = _i18n.getMessage("menu_button_no");
container.appendChild(input_no);
input_no.onclick = function(){
ButtonOnClick(false);
};
})();
}
// ------------------------------
// OK ボタン
// ------------------------------
function UI_OkButton(parent){
var _this = this;
// ------------------------------
// クリックイベント
// ------------------------------
_this.onclick = function(){};
// ------------------------------
// 有無の設定
// ------------------------------
_this.setEnable = function(type){
input_ok.disabled = ((!type) ? true : false);
};
// ------------------------------
// プライベート変数
// ------------------------------
var input_ok;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px -1px 5px 0px; text-align:center;");
parent.appendChild(container);
function ButtonOnClick(){
_this.setEnable(false);
_this.onclick();
}
input_ok = DocumentCreateElement("input");
ElementSetStyle(input_ok,"padding:10px; width:200px;");
input_ok.type = "button";
input_ok.value = _i18n.getMessage("menu_button_ok");
container.appendChild(input_ok);
input_ok.onclick = function(){
ButtonOnClick();
};
})();
}
// ------------------------------
// コンボボックス
// ------------------------------
function UI_ComboBox(parent){
var _this = this;
// ------------------------------
// アイテム追加
// ------------------------------
_this.attachItem = function(label,value){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
ElementSetTextContent(item,label);
item.value = value;
_combo_box.appendChild(item);
};
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(){
return _combo_box.value;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_combo_box.value = v;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _combo_box;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px;");
parent.appendChild(container);
_combo_box = DocumentCreateElement("select");
ElementSetStyle(_combo_box,"width:100%; height:22px; font-size:14px;");
container.appendChild(_combo_box);
_combo_box.onchange = function(){
_this.onchange(_combo_box.value);
};
})();
}
// ------------------------------
// リストボックス
// ------------------------------
function UI_ListBox(parent){
var _this = this;
// ------------------------------
// アイテム追加
// ------------------------------
_this.attachItem = function(label,value){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
ElementSetTextContent(item,label);
item.value = value;
_list.appendChild(item);
};
// ------------------------------
// 値を取得
// ------------------------------
_this.getValue = function(v){
return _list.value;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_list.value = v;
};
// ------------------------------
// 有無の設定
// ------------------------------
_this.setEnable = function(type){
_list.disabled = ((!type) ? true : false);
};
// ------------------------------
// 複数選択設定
// ------------------------------
_this.setMultiple = function(type){
_list.multiple = type;
};
// ------------------------------
// リストサイズをセット
// ------------------------------
_this.setListSize = function(v){
_list.size = v;
};
// ------------------------------
// 選択されたアイテムをすべて取得
// ------------------------------
_this.getSelectedValues = function(){
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
var option = a[i];
if(option.selected){
ary.push(option.value);
}
}
return ary;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _list;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px;");
parent.appendChild(container);
_list = DocumentCreateElement("select");
_list.size = 10;
ElementSetStyle(_list,"width:100%; font-size:14px; background:#fff;");
container.appendChild(_list);
_list.onchange = function(){
_this.onchange(_list.value);
};
})();
}
// ------------------------------
// 正規表現リスト
// ------------------------------
function UI_RegExpList(parent){
var _this = this;
// ------------------------------
// カスタムオブジェクトを関連付け
// ------------------------------
_this.attachArray = function(ary){
// クリア
_this.clear();
_regexp_list = ObjectCopy(ary);
// リストに登録
var i;
var num = _regexp_list.length;
for(i=0;i<num;i++){
attachItem(i);
}
_this.select(-1);
};
// ------------------------------
// クリア
// ------------------------------
_this.clear = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
removeItem(a[i]);
}
};
// ------------------------------
// 表示更新
// ------------------------------
_this.update = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
updateItem(a[i]);
}
};
// ------------------------------
// 追加
// ------------------------------
function addClick(){
_regexp_list.push(RegExpObjectCreate());
var id = _regexp_list.length - 1;
attachItem(id);
_this.update();
_this.select(id);
_this.onchange(_regexp_list);
}
// ------------------------------
// 削除
// ------------------------------
function deleteClick(){
var changed = false;
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
var item = a[i];
if(item.selected){
// 抹消
_regexp_list.splice(i,1);
removeItem(item);
changed = true;
}
}
if(changed){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
a[i].value = i;
}
_this.update();
onselect(_list.selectedIndex);
_this.onchange(_regexp_list);
}
}
// ------------------------------
// 優先度アップ(内部用 )
// ------------------------------
function moveUpClick(){
var changed = false;
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 先頭が選択されている
if(a[0].selected) return;
for(i=1;i<num;i++){
if(a[i].selected){
var c = a[i];
var t = c.previousSibling;
t.selected = true;
c.selected = false;
var j = i;
var k = (i-1);
t = _regexp_list[k];
_regexp_list[k] = _regexp_list[j];
_regexp_list[j] = t;
changed = true;
}
}
if(changed){
_this.update();
_this.onchange(_regexp_list);
}
}
// ------------------------------
// 優先度ダウン(内部用 )
// ------------------------------
function moveDownClick(){
var changed = false;
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 先頭が選択されている
if(a[num - 1].selected) return;
for(i=num - 2;i>=0;i--){
if(a[i].selected){
var c = a[i];
var t = c.nextSibling;
t.selected = true;
c.selected = false;
var j = i;
var k = (i+1);
t = _regexp_list[k];
_regexp_list[k] = _regexp_list[j];
_regexp_list[j] = t;
changed = true;
}
}
if(changed){
_this.update();
_this.onchange(_regexp_list);
}
}
// ------------------------------
// 選択されたアイテムをすべて取得
// ------------------------------
_this.getSelectedIndices = function(){
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
ary.push(i);
}
}
return ary;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// 選択イベント
// ------------------------------
_this.onselect = function(){};
// ------------------------------
// 選択イベント(内部用)
// ------------------------------
function onselect(id){
var text_regexp = _text_regexp.getElement();
if(id >= 0){
_text_regexp.setValue(_regexp_list[id]);
parent.appendChild(text_regexp);
}else{
DomNodeRemove(text_regexp);
}
_this.onselect(id);
}
// ------------------------------
// リストを選択
// ------------------------------
_this.select = function(id){
_list.selectedIndex = id;
onselect(id);
};
// ------------------------------
// アイテム追加(内部用 )
// ------------------------------
function attachItem(id){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
item.value = id;
_list.appendChild(item);
item.onmousedown = item.onmouseup = function(){
_select_mouse = id;
};
updateItem(item);
}
// ------------------------------
// アイテム更新(内部用 )
// ------------------------------
function updateItem(item){
var id = parseInt(item.value);
ElementSetTextContent(item,"" + RegExpObjectGetRegExp(_regexp_list[id]));
}
// ------------------------------
// アイテム削除(内部用 )
// ------------------------------
function removeItem(item){
DomNodeRemove(item);
}
// ------------------------------
// プライベート変数
// ------------------------------
var _regexp_list;
var _list;
var _select_id;
var _select_mouse;
var _text_regexp;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px; display:table; width:100%;");
parent.appendChild(container);
var list_container = DocumentCreateElement("div");
ElementSetStyle(list_container,"display:table-cell; vertical-align:top; width:auto;");
container.appendChild(list_container);
// リスト
_list = DocumentCreateElement("select");
_list.size = 8;
_list.multiple = true;
ElementSetStyle(_list,"width:100%; font-size:14px; background:#fff;");
list_container.appendChild(_list);
_list.onchange = function(e){
_select_id = _list.selectedIndex;
var o = _list.options[_select_mouse];
if(o !== undefined){
if(o.selected){
_select_id = _select_mouse;
}
}
onselect(_select_id);
};
var button_container = DocumentCreateElement("div");
ElementSetStyle(button_container,"display:table-cell; vertical-align:top; width:150px;");
container.appendChild(button_container);
var button_add = DocumentCreateElement("input");
button_add.type = "button";
button_add.value = _i18n.getMessage("menu_regexp_list_button_add");
ElementSetStyle(button_add,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_add);
button_add.onclick = function(){
addClick();
};
var button_delete = DocumentCreateElement("input");
button_delete.type = "button";
button_delete.value = _i18n.getMessage("menu_regexp_list_button_delete");
ElementSetStyle(button_delete,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_delete);
button_delete.onclick = function(){
deleteClick();
};
var button_move_up = DocumentCreateElement("input");
button_move_up.type = "button";
button_move_up.value = _i18n.getMessage("menu_regexp_list_button_move_up");
ElementSetStyle(button_move_up,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_move_up);
button_move_up.onclick = function(){
moveUpClick();
};
var button_move_down = DocumentCreateElement("input");
button_move_down.type = "button";
button_move_down.value = _i18n.getMessage("menu_regexp_list_button_move_down");
ElementSetStyle(button_move_down,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_move_down);
button_move_down.onclick = function(){
moveDownClick();
};
_text_regexp = new UI_TextRegExp(parent);
_text_regexp.oninput = function(v){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
_regexp_list[i] = ObjectCopy(v);
updateItem(a[i]);
}
}
_this.onchange(_regexp_list);
};
})();
}
// ------------------------------
// コンボボックス+ボタン
// ------------------------------
function UI_ComboBoxButton(parent,label){
var _this = this;
// ------------------------------
// アイテム追加
// ------------------------------
_this.attachItem = function(label,value){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
ElementSetTextContent(item,label);
item.value = value;
_combo_box.appendChild(item);
};
// ------------------------------
// アイテムクリア
// ------------------------------
_this.clearItem = function(){
var options = _combo_box.options;
var i;
var num = options.length;
for(i=num-1;i>=0;i--){
DomNodeRemove(options[i]);
}
};
// ------------------------------
// 選択番号を取得
// ------------------------------
_this.getSelectedIndex = function(){
return _combo_box.selectedIndex;
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(v){
_combo_box.value = v;
};
// ------------------------------
// ボタンクリックイベント
// ------------------------------
_this.onclick = function(){};
// ------------------------------
// 変更イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _combo_box;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px; display:table; width:100%;");
parent.appendChild(container);
var combo_box_container = DocumentCreateElement("div");
ElementSetStyle(combo_box_container,"display:table-cell; widht:auto;");
container.appendChild(combo_box_container);
_combo_box = DocumentCreateElement("select");
ElementSetStyle(_combo_box,"width:100%; height:22px; font-size:14px;");
combo_box_container.appendChild(_combo_box);
_combo_box.onchange = function(){
_this.onchange(_combo_box.value);
};
var button_container = DocumentCreateElement("div");
ElementSetStyle(button_container,"display:table-cell; width:50px;");
container.appendChild(button_container);
var button = DocumentCreateElement("input");
button.type = "button";
ElementSetStyle(button,"width:100%; padding:2px 0px;");
button.value = label;
button_container.appendChild(button);
button.onclick = function(){
_this.onclick();
};
})();
}
// ------------------------------
// 掲示板拡張用リスト
// ------------------------------
function UI_ExpandBbsList(parent){
var _this = this;
// ------------------------------
// カスタムオブジェクトを関連付け
// ------------------------------
_this.attachExpandBbsData = function(obj){
_expand_bbs = obj;
// リストに登録
var i;
var num = _expand_bbs.length;
for(i=0;i<num;i++){
attachItem(i);
}
};
// ------------------------------
// クリア
// ------------------------------
_this.clear = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
removeItem(a[i]);
}
};
// ------------------------------
// 表示更新
// ------------------------------
_this.update = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
updateItem(a[i]);
}
};
// ------------------------------
// 追加
// ------------------------------
function addClick(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_add_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_add_dialog_name"));
var parent = container.getElement();
var text_input_name = new UI_TextInput(parent);
// 既存のURLマッピング設定から複製する
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_add_dialog_copy_define"));
var parent = container.getElement();
var list_box_expand_bbs = new UI_ListBox(parent);
var i;
var num = _expand_bbs.length;
for(i=0;i<num;i++){
var urlmap = ProjectObjectGetActiveData(_expand_bbs[i]);
list_box_expand_bbs.attachItem(LocaleObjectGetString(urlmap.name),_expand_bbs[i].id);
}
list_box_expand_bbs.attachItem(_i18n.getMessage("menu_setting_expand_bbs_add_dialog_define_list_box_item_new"),"");
list_box_expand_bbs.setValue("");
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(v){
// 辞書作成
var dic = new Object();
var i;
var num = _expand_bbs.length;
for(i=0;i<num;i++){
dic[_expand_bbs[i].id] = _expand_bbs[i];
}
// ユニーク名を作成
i = 0;
while(dic["user" + i]){
i++;
}
var id = "user" + i;
var obj;
if(dic[list_box_expand_bbs.getValue()]){
// 設定を複製
obj = ObjectCopy(dic[list_box_expand_bbs.getValue()]);
// プリセットを昇格
if(!(obj.user)) obj.user = obj.preset;
// プリセットを破棄
delete obj.preset;
}else{
// 新規作成
obj = createExpandBbsData();
}
// 名前をセット
var c = ProjectObjectGetActiveData(obj);
c.name = LocaleObjectCreate();
LocaleObjectSetString(c.name,text_input_name.getValue());
// IDをセット
obj.id = id;
// 先頭に挿入
_expand_bbs.unshift(obj);
// 再構築
_this.clear();
_this.attachExpandBbsData(_expand_bbs);
projectModify();
// 選択
_this.select(0);
}
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// 削除
// ------------------------------
function deleteClick(){
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
var item = a[i];
if(item.selected){
var c = _dictionary[item.value];
if(c.preset){
// プリセットに降格
delete c.user;
}else{
// 抹消
_expand_bbs.splice(i,1);
removeItem(item);
}
}
}
_this.update();
_this.onselect(_list.selectedIndex);
projectModify();
}
// ------------------------------
// 優先度アップ(内部用 )
// ------------------------------
function prioUpClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 先頭が選択されている
if(a[0].selected) return;
for(i=1;i<num;i++){
if(a[i].selected){
var c = a[i];
var t = c.previousSibling;
DomNodeRemove(c);
_list.insertBefore(c,t);
var j = i;
var k = (i-1);
t = _expand_bbs[k];
_expand_bbs[k] = _expand_bbs[j];
_expand_bbs[j] = t;
}
}
_this.update();
projectModify();
}
// ------------------------------
// 優先度ダウン(内部用 )
// ------------------------------
function prioDownClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 先頭が選択されている
if(a[num - 1].selected) return;
for(i=num - 2;i>=0;i--){
if(a[i].selected){
var c = a[i];
var t = c.nextSibling;
DomNodeRemove(c);
_list.insertBefore(c,t.nextSibling);
var j = i;
var k = (i+1);
t = _expand_bbs[k];
_expand_bbs[k] = _expand_bbs[j];
_expand_bbs[j] = t;
}
}
_this.update();
projectModify();
}
// ------------------------------
// エクスポート(内部用 )
// ------------------------------
function exportClick(){
var proj = page_expand_project.getObject();
var export_obj = new Object();
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
ary.push(ObjectCopy(_expand_bbs[i]));
}
}
export_obj.version = proj.version;
export_obj.setting_export = {
type:"expand_bbs"
};
export_obj.expand_bbs = ary;
// プリセットを除去
export_obj = PageExpandProjectObjectRemovePreset(export_obj);
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_export_dialog"));
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_export_dialog_export"));
var parent = container.getElement();
var text_area = new UI_TextArea(parent);
text_area.setValue(JsonStringify(export_obj));
new UI_TextHint(parent,_i18n.getMessage("menu_setting_expand_bbs_export_dialog_export_hint"));
// Ok ボタン
var yes_no_button = new UI_OkButton(dialog_parent);
yes_no_button.onclick = function(v){
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// インポート(内部用 )
// ------------------------------
function importClick(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_import_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_import_dialog_explanation"));
var parent = container.getElement();
var unordered_list = new UI_UnorderedList(parent);
unordered_list.addListItem(_i18n.getMessage("menu_setting_expand_bbs_import_dialog_explanation_0"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_expand_bbs_import_dialog_explanation_1"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_expand_bbs_import_dialog_explanation_2"));
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_import_dialog_import"));
var parent = container.getElement();
var text_area_import = new UI_TextArea(parent);
new UI_TextHint(parent,_i18n.getMessage("menu_setting_expand_bbs_import_dialog_import_hint"));
// 実行しますか?
var container = new UI_LineContainer(dialog_parent,null);
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_expand_bbs_import_dialog_confirm"));
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(!v){
// ダイアログ終了
dialog.close();
return;
}
function ExpandBbsImportFailure(message){
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_import_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_expand_bbs_import_alert_failure"));
new UI_Text(alert_dialog.getElement(),message);
alert_dialog.oncomplete = function(){
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
}
try{
var proj_obj = page_expand_project.getObject();
var import_obj = JsonParse(text_area_import.getValue());
// バージョンが一致しない
if(import_obj.version > proj_obj.version){
throw "Error: It is a version not supported.";
}
// 出力タイプチェック
var error = true;
try{
switch(import_obj.setting_export.type){
case "expand_bbs":
error = false;
break;
}
}catch(e){}
if(error){
throw "Error: It is a type not supported.";
}
// 定義をインポート
PageExpandProjectObjectImportExpandBbs(proj_obj,import_obj);
projectSave(function(e){
if(!e.result){
ExpandBbsImportFailure(e.message);
return;
}
text_area_import.setValue("");
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_expand_bbs_import_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_expand_bbs_import_alert_success"));
alert_dialog.oncomplete = function(){
// フェードアウト完了後
dialog.oncomplete = function(){
// リロード
_this.onreload();
};
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
});
}catch(e){
ExpandBbsImportFailure(e);
}
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// 選択されたアイテムをすべて取得
// ------------------------------
_this.getSelectedIndices = function(){
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
ary.push(i);
}
}
return ary;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// 選択イベント
// ------------------------------
_this.onselect = function(){};
// ------------------------------
// リロードイベント
// ------------------------------
_this.onreload = function(){};
// ------------------------------
// リストを選択
// ------------------------------
_this.select = function(id){
_list.selectedIndex = _select_id = _select_mouse = id;
_this.onselect(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
var dic = new Object();
var i;
var num = _expand_bbs.length;
for(i=0;i<num;i++){
dic[_expand_bbs[i].id] = i;
}
num = list.length;
var index = dic[list[num - 1]];
if(index !== undefined){
_list.selectedIndex = _select_id = index;
}
var a = _list.options;
for(i=0;i<num;i++){
if(dic[list[i]] !== undefined){
var o = a[dic[list[i]]];
if(o) o.selected = true;
}
}
if(index !== undefined){
_this.onselect(index);
}
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
var selected_defines = new Array();
var a = _this.getSelectedIndices();
var i;
var num = a.length;
for(i=0;i<num;i++){
selected_defines.push(_expand_bbs[a[i]].id);
}
if(_expand_bbs[_select_id]){
selected_defines.push(_expand_bbs[_select_id].id);
}
// 履歴更新
_history_state.selected_defines = selected_defines;
delete _history_state.selected_filters;
};
// ------------------------------
// アイテム追加(内部用 )
// ------------------------------
function attachItem(id){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
item.value = _expand_bbs[id].id;
_dictionary[item.value] = _expand_bbs[id];
_list.appendChild(item);
item.onmousedown = item.onmouseup = function(){
_select_mouse = id;
};
updateItem(item);
}
// ------------------------------
// アイテム更新(内部用 )
// ------------------------------
function updateItem(item){
var urlmap;
var c = _dictionary[item.value];
if(c.preset){
item.style.color = "#ccc";
}
if(c.user){
item.style.color = "#000";
}
urlmap = ProjectObjectGetActiveData(c);
ElementSetTextContent(item,LocaleObjectGetString(urlmap.name));
}
// ------------------------------
// アイテム削除(内部用 )
// ------------------------------
function removeItem(item){
var c = _dictionary[item.value];
DomNodeRemove(item);
delete _dictionary[item.value];
}
// ------------------------------
// プライベート変数
// ------------------------------
var _expand_bbs;
var _dictionary;
var _list;
var _select_id;
var _select_mouse;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_dictionary = new Object();
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px; display:table; width:100%;");
parent.appendChild(container);
var list_container = DocumentCreateElement("div");
ElementSetStyle(list_container,"display:table-cell; vertical-align:top; width:auto;");
container.appendChild(list_container);
// リスト
_list = DocumentCreateElement("select");
_list.size = 10;
_list.multiple = true;
ElementSetStyle(_list,"width:100%; font-size:14px; background:#fff;");
list_container.appendChild(_list);
_list.onchange = function(e){
_select_id = _list.selectedIndex;
var o = _list.options[_select_mouse];
if(o !== undefined){
if(o.selected){
_select_id = _select_mouse;
}
}
_this.onselect(_select_id);
_this.replaceHistory();
};
var button_container = DocumentCreateElement("div");
ElementSetStyle(button_container,"display:table-cell; vertical-align:top; width:150px;");
container.appendChild(button_container);
var button_add = DocumentCreateElement("input");
button_add.type = "button";
button_add.value = _i18n.getMessage("menu_setting_expand_bbs_button_add");
ElementSetStyle(button_add,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_add);
button_add.onclick = function(){
addClick();
};
var button_delete = DocumentCreateElement("input");
button_delete.type = "button";
button_delete.value = _i18n.getMessage("menu_setting_expand_bbs_button_delete");
ElementSetStyle(button_delete,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_delete);
button_delete.onclick = function(){
deleteClick();
};
var button_prio_up = DocumentCreateElement("input");
button_prio_up.type = "button";
button_prio_up.value = _i18n.getMessage("menu_setting_expand_bbs_button_prio_up");
ElementSetStyle(button_prio_up,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_prio_up);
button_prio_up.onclick = function(){
prioUpClick();
};
var button_prio_down = DocumentCreateElement("input");
button_prio_down.type = "button";
button_prio_down.value = _i18n.getMessage("menu_setting_expand_bbs_button_prio_down");
ElementSetStyle(button_prio_down,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_prio_down);
button_prio_down.onclick = function(){
prioDownClick();
};
var button_export = DocumentCreateElement("input");
button_export.type = "button";
button_export.value = _i18n.getMessage("menu_setting_expand_bbs_button_export");
ElementSetStyle(button_export,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_export);
button_export.onclick = function(){
exportClick();
};
var button_import = DocumentCreateElement("input");
button_import.type = "button";
button_import.value = _i18n.getMessage("menu_setting_expand_bbs_button_import");
ElementSetStyle(button_import,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_import);
button_import.onclick = function(){
importClick();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_expand_bbs_list_hint"));
})();
}
// ------------------------------
// URLマッピング用リスト
// ------------------------------
function UI_UrlMapList(parent){
var _this = this;
// ------------------------------
// カスタムオブジェクトを関連付け
// ------------------------------
_this.attachUrlMapData = function(obj){
_urlmap = obj;
// リストに登録
var i;
var num = _urlmap.length;
for(i=0;i<num;i++){
attachItem(i);
}
};
// ------------------------------
// クリア
// ------------------------------
_this.clear = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
removeItem(a[i]);
}
};
// ------------------------------
// 表示更新
// ------------------------------
_this.update = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
updateItem(a[i]);
}
};
// ------------------------------
// 追加
// ------------------------------
function addClick(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_urlmap_add_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_urlmap_add_dialog_name"));
var parent = container.getElement();
var text_input_name = new UI_TextInput(parent);
// 既存のURLマッピング設定から複製する
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_urlmap_add_dialog_copy_define"));
var parent = container.getElement();
var list_box_urlmap = new UI_ListBox(parent);
var i;
var num = _urlmap.length;
for(i=0;i<num;i++){
var urlmap = ProjectObjectGetActiveData(_urlmap[i]);
list_box_urlmap.attachItem(LocaleObjectGetString(urlmap.name),_urlmap[i].id);
}
list_box_urlmap.attachItem(_i18n.getMessage("menu_setting_urlmap_add_dialog_define_list_box_item_new"),"");
list_box_urlmap.setValue("");
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(v){
// 辞書作成
var dic = new Object();
var i;
var num = _urlmap.length;
for(i=0;i<num;i++){
dic[_urlmap[i].id] = _urlmap[i];
}
// ユニーク名を作成
i = 0;
while(dic["user" + i]){
i++;
}
var id = "user" + i;
var obj;
if(dic[list_box_urlmap.getValue()]){
// 設定を複製
obj = ObjectCopy(dic[list_box_urlmap.getValue()]);
// プリセットを昇格
if(!(obj.user)) obj.user = obj.preset;
// プリセットを破棄
delete obj.preset;
}else{
// 新規作成
obj = createUrlMapData();
}
// 名前をセット
var c = ProjectObjectGetActiveData(obj);
c.name = LocaleObjectCreate();
LocaleObjectSetString(c.name,text_input_name.getValue());
// IDをセット
obj.id = id;
// 先頭に挿入
_urlmap.unshift(obj);
// 再構築
_this.clear();
_this.attachUrlMapData(_urlmap);
projectModify();
// 選択
_this.select(0);
}
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// 削除
// ------------------------------
function deleteClick(){
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
var item = a[i];
if(item.selected){
var c = _dictionary[item.value];
if(c.preset){
// プリセットに降格
delete c.user;
}else{
// 抹消
_urlmap.splice(i,1);
removeItem(item);
}
}
}
_this.update();
_this.onselect(_list.selectedIndex);
projectModify();
}
// ------------------------------
// 優先度アップ(内部用 )
// ------------------------------
function prioUpClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 先頭が選択されている
if(a[0].selected) return;
for(i=1;i<num;i++){
if(a[i].selected){
var c = a[i];
var t = c.previousSibling;
DomNodeRemove(c);
_list.insertBefore(c,t);
var j = i;
var k = (i-1);
t = _urlmap[k];
_urlmap[k] = _urlmap[j];
_urlmap[j] = t;
}
}
_this.update();
projectModify();
}
// ------------------------------
// 優先度ダウン(内部用 )
// ------------------------------
function prioDownClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 先頭が選択されている
if(a[num - 1].selected) return;
for(i=num - 2;i>=0;i--){
if(a[i].selected){
var c = a[i];
var t = c.nextSibling;
DomNodeRemove(c);
_list.insertBefore(c,t.nextSibling);
var j = i;
var k = (i+1);
t = _urlmap[k];
_urlmap[k] = _urlmap[j];
_urlmap[j] = t;
}
}
_this.update();
projectModify();
}
// ------------------------------
// 選択されたアイテムをすべて取得
// ------------------------------
_this.getSelectedIndices = function(){
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
ary.push(i);
}
}
return ary;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// 選択イベント
// ------------------------------
_this.onselect = function(){};
// ------------------------------
// リストを選択
// ------------------------------
_this.select = function(id){
_list.selectedIndex = id;
_this.onselect(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
var dic = new Object();
var i;
var num = _urlmap.length;
for(i=0;i<num;i++){
dic[_urlmap[i].id] = i;
}
num = list.length;
var index = dic[list[num - 1]];
if(index !== undefined){
_list.selectedIndex = _select_id = index;
}
var a = _list.options;
for(i=0;i<num;i++){
if(dic[list[i]] !== undefined){
var o = a[dic[list[i]]];
if(o) o.selected = true;
}
}
if(index !== undefined){
_this.onselect(index);
}
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
var selected_defines = new Array();
var a = _this.getSelectedIndices();
var i;
var num = a.length;
for(i=0;i<num;i++){
selected_defines.push(_urlmap[a[i]].id);
}
if(_urlmap[_select_id]){
selected_defines.push(_urlmap[_select_id].id);
}
// 履歴更新
_history_state.selected_defines = selected_defines;
delete _history_state.selected_filters;
};
// ------------------------------
// アイテム追加(内部用 )
// ------------------------------
function attachItem(id){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
item.value = _urlmap[id].id;
_dictionary[item.value] = _urlmap[id];
_list.appendChild(item);
item.onmousedown = item.onmouseup = function(){
_select_mouse = id;
};
updateItem(item);
}
// ------------------------------
// アイテム更新(内部用 )
// ------------------------------
function updateItem(item){
var urlmap;
var c = _dictionary[item.value];
if(c.preset){
item.style.color = "#ccc";
}
if(c.user){
item.style.color = "#000";
}
urlmap = ProjectObjectGetActiveData(c);
ElementSetTextContent(item,LocaleObjectGetString(urlmap.name));
}
// ------------------------------
// アイテム削除(内部用 )
// ------------------------------
function removeItem(item){
var c = _dictionary[item.value];
DomNodeRemove(item);
delete _dictionary[item.value];
}
// ------------------------------
// プライベート変数
// ------------------------------
var _urlmap;
var _dictionary;
var _list;
var _select_id;
var _select_mouse;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_dictionary = new Object();
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px; display:table; width:100%;");
parent.appendChild(container);
var list_container = DocumentCreateElement("div");
ElementSetStyle(list_container,"display:table-cell; vertical-align:top; width:auto;");
container.appendChild(list_container);
// リスト
_list = DocumentCreateElement("select");
_list.size = 10;
_list.multiple = true;
ElementSetStyle(_list,"width:100%; font-size:14px; background:#fff;");
list_container.appendChild(_list);
_list.onchange = function(e){
_select_id = _list.selectedIndex;
var o = _list.options[_select_mouse];
if(o !== undefined){
if(o.selected){
_select_id = _select_mouse;
}
}
_this.onselect(_select_id);
_this.replaceHistory();
};
var button_container = DocumentCreateElement("div");
ElementSetStyle(button_container,"display:table-cell; vertical-align:top; width:150px;");
container.appendChild(button_container);
var button_add = DocumentCreateElement("input");
button_add.type = "button";
button_add.value = _i18n.getMessage("menu_setting_urlmap_button_add");
ElementSetStyle(button_add,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_add);
button_add.onclick = function(){
addClick();
};
var button_delete = DocumentCreateElement("input");
button_delete.type = "button";
button_delete.value = _i18n.getMessage("menu_setting_urlmap_button_delete");
ElementSetStyle(button_delete,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_delete);
button_delete.onclick = function(){
deleteClick();
};
var button_prio_up = DocumentCreateElement("input");
button_prio_up.type = "button";
button_prio_up.value = _i18n.getMessage("menu_setting_urlmap_button_prio_up");
ElementSetStyle(button_prio_up,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_prio_up);
button_prio_up.onclick = function(){
prioUpClick();
};
var button_prio_down = DocumentCreateElement("input");
button_prio_down.type = "button";
button_prio_down.value = _i18n.getMessage("menu_setting_urlmap_button_prio_down");
ElementSetStyle(button_prio_down,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_prio_down);
button_prio_down.onclick = function(){
prioDownClick();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_urlmap_list_hint"));
})();
}
// ------------------------------
// 定義用リスト
// ------------------------------
function UI_DefineList(parent){
var _this = this;
// ------------------------------
// カスタムオブジェクトを関連付け
// ------------------------------
_this.attachDefineData = function(obj){
_define = obj;
// リストに登録
var i;
var num = _define.length;
for(i=0;i<num;i++){
attachItem(i);
}
};
// ------------------------------
// 定義の識別名をセット
// ------------------------------
_this.setDefineAssetName = function(asset){
_define_id = asset;
};
// ------------------------------
// 新規データ作成用関数をセット
// ------------------------------
_this.setFunctionForNewData = function(f){
_new_data_func = f;
};
// ------------------------------
// クリア
// ------------------------------
_this.clear = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
removeItem(a[i]);
}
};
// ------------------------------
// 表示更新
// ------------------------------
_this.update = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
updateItem(a[i]);
}
};
// ------------------------------
// 追加
// ------------------------------
function addClick(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_define_add_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_define_add_dialog_name"));
var parent = container.getElement();
var text_input_name = new UI_TextInput(parent);
// 既存のURLマッピング設定から複製する
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_define_add_dialog_copy_define"));
var parent = container.getElement();
var list_box_define = new UI_ListBox(parent);
var i;
var num = _define.length;
for(i=0;i<num;i++){
var define = ProjectObjectGetActiveData(_define[i]);
list_box_define.attachItem(LocaleObjectGetString(define.name),_define[i].id);
}
list_box_define.attachItem(_i18n.getMessage("menu_setting_define_add_dialog_define_list_box_item_new"),"");
list_box_define.setValue("");
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(v){
// 辞書作成
var dic = new Object();
var i;
var num = _define.length;
for(i=0;i<num;i++){
dic[_define[i].id] = _define[i];
}
// ユニーク名を作成
i = 0;
while(dic["user" + i]){
i++;
}
var id = "user" + i;
var obj;
if(dic[list_box_define.getValue()]){
// 設定を複製
obj = ObjectCopy(dic[list_box_define.getValue()]);
// プリセットを昇格
if(!(obj.user)) obj.user = obj.preset;
// プリセットを破棄
delete obj.preset;
}else{
// 新規作成
obj = _new_data_func();
}
// 名前をセット
var c = ProjectObjectGetActiveData(obj);
c.name = LocaleObjectCreate();
LocaleObjectSetString(c.name,text_input_name.getValue());
// IDをセット
obj.id = id;
// 先頭に挿入
_define.unshift(obj);
// 再構築
_this.clear();
_this.attachDefineData(_define);
projectModify();
// 選択
_this.select(0);
}
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// 削除
// ------------------------------
function deleteClick(){
var proj = page_expand_project.getObject();
var urlmap = proj.urlmap;
// 削除対象をスタックに登録
var stack = new Array();
(function(){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
var item = a[i];
if(item.selected){
stack.push({item:item,id:i});
}
}
})();
// 代替リスト
var alive = new Array();
(function(){
var dictionary = new Object();
var i;
var num;
num = stack.length;
for(i=0;i<num;i++){
var p = _dictionary[stack[i].item.value];
if(p.preset){
}else{
dictionary[p.id] = p;
}
}
num = _define.length;
for(i=0;i<num;i++){
var p = _define[i];
if(!dictionary[p.id]){
alive.push(p);
}
}
})();
// 逐次実行
function execute(){
while(true){
var param = stack.pop();
if(!param){
_this.update();
_this.onselect(_list.selectedIndex);
projectModify();
return;
}
// プリセットを保有するなら降格
var define = _dictionary[param.item.value];
if(define.preset){
// プリセットに降格
delete define.user;
continue;
}
// URLマッピングで使用中か調べる
var urlmap_use = new Array();
(function(){
var i;
var num = urlmap.length;
for(i=0;i<num;i++){
var c = ProjectObjectGetActiveData(urlmap[i]);
if(!c) continue;
var d = c[_define_id];
if(d.enable){
if((d.id) && (typeof(d.id) == "object")){
var ary = d.id;
var j;
var ary_num = ary.length;
for(j=0;j<ary_num;j++){
if(ary[j] == define.id){
urlmap_use.push(urlmap[i]);
break;
}
}
}else{
if(d.id == define.id){
urlmap_use.push(urlmap[i]);
}
}
}
}
})();
// ダイアログを表示して確認
if(urlmap_use.length){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_define_delete_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_define_delete_dialog_name"));
var parent = container.getElement();
var text_name = new UI_TextDynamic(parent);
text_name.setValue(LocaleObjectGetString(define.user.name));
// 既存のURLマッピング設定から複製する
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_define_delete_dialog_change_define"));
var parent = container.getElement();
var list_box_define = new UI_ListBox(parent);
// 代替リスト
(function(){
var i;
var num = alive.length;
for(i=0;i<num;i++){
var d = ProjectObjectGetActiveData(alive[i]);
list_box_define.attachItem(LocaleObjectGetString(d.name),alive[i].id);
}
list_box_define.attachItem(_i18n.getMessage("menu_setting_define_delete_dialog_define_list_box_item_no_use"),"");
list_box_define.setValue("");
})();
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(v){
var i;
var num = urlmap_use.length;
for(i=0;i<num;i++){
var c = urlmap_use[i].user;
if(!c) continue;
var d = c[_define_id];
if((d.id) && (typeof(d.id) == "object")){
var ary = d.id;
var j;
var ary_num = ary.length;
for(j=ary_num-1;j>=0;j--){
if(ary[j] == define.id){
if(list_box_define.getValue()){
ary[j] = list_box_define.getValue();
}else{
ary.splice(j,1);
}
}
}
if(!(ary.length)){
d.enable = false;
}
}else{
if(list_box_define.getValue()){
d.id = list_box_define.getValue();
d.enable = true;
}else{
d.id = "";
d.enable = false;
}
}
}
// 抹消
_define.splice(param.id,1);
removeItem(param.item);
// 実行再開
execute();
}
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
// 表示更新
_this.update();
_this.onselect(_list.selectedIndex);
projectModify();
return;
}else{
// 抹消
_define.splice(param.id,1);
removeItem(param.item);
}
}
}
// 実行開始
execute();
}
// ------------------------------
// 上に移動(内部用 )
// ------------------------------
function moveUpClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 先頭が選択されている
if(a[0].selected) return;
for(i=1;i<num;i++){
if(a[i].selected){
var c = a[i];
var t = c.previousSibling;
DomNodeRemove(c);
_list.insertBefore(c,t);
var j = i;
var k = (i-1);
t = _define[k];
_define[k] = _define[j];
_define[j] = t;
}
}
_this.update();
projectModify();
}
// ------------------------------
// 下に移動(内部用 )
// ------------------------------
function moveDownClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 先頭が選択されている
if(a[num - 1].selected) return;
for(i=num - 2;i>=0;i--){
if(a[i].selected){
var c = a[i];
var t = c.nextSibling;
DomNodeRemove(c);
_list.insertBefore(c,t.nextSibling);
var j = i;
var k = (i+1);
t = _define[k];
_define[k] = _define[j];
_define[j] = t;
}
}
_this.update();
projectModify();
}
// ------------------------------
// エクスポート(内部用 )
// ------------------------------
function exportClick(){
var proj = page_expand_project.getObject();
var export_obj = new Object();
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
ary.push(ObjectCopy(_define[i]));
}
}
export_obj.version = proj.version;
export_obj.setting_export = {
type:"define",
asset:_define_id
};
export_obj[_define_id] = ary;
// プリセットを除去
export_obj = PageExpandProjectObjectRemovePreset(export_obj);
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_define_export_dialog"));
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_define_export_dialog_export"));
var parent = container.getElement();
var text_area = new UI_TextArea(parent);
text_area.setValue(JsonStringify(export_obj));
new UI_TextHint(parent,_i18n.getMessage("menu_setting_define_export_dialog_export_hint"));
// Ok ボタン
var yes_no_button = new UI_OkButton(dialog_parent);
yes_no_button.onclick = function(v){
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// インポート(内部用 )
// ------------------------------
function importClick(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_define_import_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_define_import_dialog_explanation"));
var parent = container.getElement();
var unordered_list = new UI_UnorderedList(parent);
unordered_list.addListItem(_i18n.getMessage("menu_setting_define_import_dialog_explanation_0"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_define_import_dialog_explanation_1"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_define_import_dialog_explanation_2"));
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_define_import_dialog_import"));
var parent = container.getElement();
var text_area_import = new UI_TextArea(parent);
new UI_TextHint(parent,_i18n.getMessage("menu_setting_define_import_dialog_import_hint"));
// 実行しますか?
var container = new UI_LineContainer(dialog_parent,null);
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_define_import_dialog_confirm"));
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(!v){
// ダイアログ終了
dialog.close();
return;
}
function DefineImportFailure(message){
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_define_import_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_define_import_alert_failure"));
new UI_Text(alert_dialog.getElement(),message);
alert_dialog.oncomplete = function(){
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
}
try{
var proj_obj = page_expand_project.getObject();
var import_obj = JsonParse(text_area_import.getValue());
// バージョンが一致しない
if(import_obj.version > proj_obj.version){
throw "Error: It is a version not supported.";
}
// 出力タイプチェック
var error = true;
try{
switch(import_obj.setting_export.type){
case "setting":
case "define":
error = false;
break;
}
}catch(e){}
if(error){
throw "Error: It is a type not supported.";
}
// 定義をインポート
PageExpandProjectObjectImportDefine(proj_obj,import_obj,_define_id);
projectSave(function(e){
if(!e.result){
DefineImportFailure(e.message);
return;
}
text_area_import.setValue("");
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_define_import_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_define_import_alert_success"));
alert_dialog.oncomplete = function(){
// フェードアウト完了後
dialog.oncomplete = function(){
// リロード
_this.onreload();
};
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
});
}catch(e){
DefineImportFailure(e);
}
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// 選択されたアイテムを取得
// ------------------------------
_this.getSelectedIndex = function(){
return _select_id = _list.selectedIndex;
};
// ------------------------------
// 選択されたアイテムをすべて取得
// ------------------------------
_this.getSelectedIndices = function(){
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
ary.push(i);
}
}
return ary;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// 選択イベント
// ------------------------------
_this.onselect = function(){};
// ------------------------------
// リロードイベント
// ------------------------------
_this.onreload = function(){};
// ------------------------------
// リストを選択
// ------------------------------
_this.select = function(id){
_list.selectedIndex = _select_id = _select_mouse = id;
_this.onselect(id);
};
// ------------------------------
// リストから選択
// ------------------------------
_this.selectFromIdList = function(list){
var dic = new Object();
var i;
var num = _define.length;
for(i=0;i<num;i++){
dic[_define[i].id] = i;
}
num = list.length;
var index = dic[list[num - 1]];
if(index !== undefined){
_list.selectedIndex = _select_id = index;
}
var a = _list.options;
for(i=0;i<num;i++){
if(dic[list[i]] !== undefined){
var o = a[dic[list[i]]];
if(o) o.selected = true;
}
}
if(index !== undefined){
_this.onselect(index);
}
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
var selected_defines = new Array();
var a = _this.getSelectedIndices();
var i;
var num = a.length;
for(i=0;i<num;i++){
selected_defines.push(_define[a[i]].id);
}
if(_define[_select_id]){
selected_defines.push(_define[_select_id].id);
}
// 履歴更新
_history_state.selected_defines = selected_defines;
delete _history_state.selected_filters;
};
// ------------------------------
// アイテム追加(内部用 )
// ------------------------------
function attachItem(id){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
item.value = _define[id].id;
_dictionary[item.value] = _define[id];
_list.appendChild(item);
item.onmousedown = item.onmouseup = function(){
_select_mouse = id;
};
updateItem(item);
}
// ------------------------------
// アイテム更新(内部用 )
// ------------------------------
function updateItem(item){
var define;
var c = _dictionary[item.value];
if(c.preset){
item.style.color = "#ccc";
}
if(c.user){
item.style.color = "#000";
}
if(c.id == "wildcard"){
if(c.preset){
item.style.color = "#f88";
}
if(c.user){
item.style.color = "#c00";
}
}
define = ProjectObjectGetActiveData(c);
ElementSetTextContent(item,LocaleObjectGetString(define.name));
}
// ------------------------------
// アイテム削除(内部用 )
// ------------------------------
function removeItem(item){
var c = _dictionary[item.value];
DomNodeRemove(item);
delete _dictionary[item.value];
}
// ------------------------------
// プライベート変数
// ------------------------------
var _define;
var _define_id;
var _new_data_func;
var _dictionary;
var _list;
var _select_id;
var _select_mouse;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_dictionary = new Object();
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px; display:table; width:100%;");
parent.appendChild(container);
var list_container = DocumentCreateElement("div");
ElementSetStyle(list_container,"display:table-cell; vertical-align:top; width:auto;");
container.appendChild(list_container);
// リスト
_list = DocumentCreateElement("select");
_list.size = 10;
_list.multiple = true;
ElementSetStyle(_list,"width:100%; font-size:14px; background:#fff;");
list_container.appendChild(_list);
_list.onchange = function(e){
_select_id = _list.selectedIndex;
var o = _list.options[_select_mouse];
if(o !== undefined){
if(o.selected){
_select_id = _select_mouse;
}
}
_this.onselect(_select_id);
_this.replaceHistory();
};
var button_container = DocumentCreateElement("div");
ElementSetStyle(button_container,"display:table-cell; vertical-align:top; width:150px;");
container.appendChild(button_container);
var button_add = DocumentCreateElement("input");
button_add.type = "button";
button_add.value = _i18n.getMessage("menu_setting_define_button_add");
ElementSetStyle(button_add,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_add);
button_add.onclick = function(){
addClick();
};
var button_delete = DocumentCreateElement("input");
button_delete.type = "button";
button_delete.value = _i18n.getMessage("menu_setting_define_button_delete");
ElementSetStyle(button_delete,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_delete);
button_delete.onclick = function(){
deleteClick();
};
var button_move_up = DocumentCreateElement("input");
button_move_up.type = "button";
button_move_up.value = _i18n.getMessage("menu_setting_define_button_move_up");
ElementSetStyle(button_move_up,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_move_up);
button_move_up.onclick = function(){
moveUpClick();
};
var button_move_down = DocumentCreateElement("input");
button_move_down.type = "button";
button_move_down.value = _i18n.getMessage("menu_setting_define_button_move_down");
ElementSetStyle(button_move_down,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_move_down);
button_move_down.onclick = function(){
moveDownClick();
};
var button_export = DocumentCreateElement("input");
button_export.type = "button";
button_export.value = _i18n.getMessage("menu_setting_define_button_export");
ElementSetStyle(button_export,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_export);
button_export.onclick = function(){
exportClick();
};
var button_import = DocumentCreateElement("input");
button_import.type = "button";
button_import.value = _i18n.getMessage("menu_setting_define_button_import");
ElementSetStyle(button_import,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_import);
button_import.onclick = function(){
importClick();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_define_list_hint"));
})();
}
// ------------------------------
// フィルタ用リスト
// ------------------------------
function UI_FilterList(parent){
var _this = this;
// ------------------------------
// フィルタを関連付け
// ------------------------------
_this.attachDefinitions = function(ary,active){
// 全てクリア
_this.clear();
_definitions = ary;
_definition_active = active;
_definition_multiple = false;
if(_definitions.length > 1){
_definition_multiple = true;
}
_definitions_min = 0x7fffffff;
_definitions_max = 0;
var i;
var num = _definitions.length;
for(i=0;i<num;i++){
var filter = ProjectObjectGetActiveData(_definitions[i]).filter;
if(filter.length > _definitions_max) _definitions_max = filter.length;
if(filter.length < _definitions_min) _definitions_min = filter.length;
}
for(i=0;i<_definitions_max;i++){
attachItem(i);
}
};
// ------------------------------
// アクティブなフィルタを取得
// ------------------------------
_this.getDefinitionActive = function(){
return _definition_active;
};
// ------------------------------
// 定義の識別名をセット
// ------------------------------
_this.setDefineAssetName = function(asset){
_define_id = asset;
};
// ------------------------------
// 新規定義データ作成用関数をセット
// ------------------------------
_this.setFunctionForNewDefineData = function(f){
_new_define_data_func = f;
};
// ------------------------------
// 新規フィルタデータ作成用関数をセット
// ------------------------------
_this.setFunctionForNewFilterData = function(f){
_new_filter_data_func = f;
};
// ------------------------------
// クリア
// ------------------------------
_this.clear = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
removeItem(a[i]);
}
};
// ------------------------------
// 表示更新
// ------------------------------
_this.update = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
updateItem(a[i]);
}
};
// ------------------------------
// 表示更新(内部用)
// ------------------------------
function update(){
_this.attachDefinitions(_definitions,_definition_active);
}
// ------------------------------
// フィルタを書き込み更新
// ------------------------------
_this.writeDefinitions = function(func){
var c;
var p;
var i;
var num = _definitions.length;
for(i=0;i<num;i++){
c = _definitions[i];
if(c.user){
p = c.user;
}else{
if(c.preset){
// プリセットを昇格
p = c.user = ObjectCopy(c.preset);
}
}
if(p) func(p);
}
};
// ------------------------------
// フィルタを書き込み更新
// ------------------------------
_this.writeFilters = function(func){
var ary = _this.getSelectedIndices();
var i;
var num = ary.length;
_this.writeDefinitions(function(c){
var filter = c.filter;
for(i=0;i<num;i++){
if(ary[i] < filter.length){
func(filter[ary[i]]);
}
}
});
};
// ------------------------------
// 追加
// ------------------------------
function addClick(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_filter_add_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_filter_add_dialog_name"));
var parent = container.getElement();
var text_input_name = new UI_TextInput(parent);
// 既存のURLマッピング設定から複製する
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_filter_add_dialog_copy_define"));
var parent = container.getElement();
var list_box_filter = new UI_ListBox(parent);
var dictionary = new Object();
var unique = 0;
var i;
var j;
var num = _definitions.length;
for(i=0;i<num;i++){
var filters = ProjectObjectGetActiveData(_definitions[i]).filter;
var filters_num = filters.length;
for(j=0;j<filters_num;j++){
var filter = filters[j];
list_box_filter.attachItem(LocaleObjectGetString(filter.name),unique);
dictionary[unique] = filter;
unique ++;
}
}
list_box_filter.attachItem(_i18n.getMessage("menu_setting_filter_add_dialog_define_list_box_item_new"),"");
list_box_filter.setValue("");
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(v){
var filter = dictionary[list_box_filter.getValue()];
if(filter){
_this.writeDefinitions(function(c){
var filter_copy = ObjectCopy(filter);
c.filter.unshift(filter_copy);
filter_copy.name = LocaleObjectCreate();
LocaleObjectSetString(filter_copy.name,text_input_name.getValue());
});
}else{
_this.writeDefinitions(function(c){
if(_new_filter_data_func){
var filter_new = _new_filter_data_func();
c.filter.unshift(filter_new);
filter_new.name = LocaleObjectCreate();
LocaleObjectSetString(filter_new.name,text_input_name.getValue());
}
});
}
update();
projectModify();
_this.select(0);
_this.onchange();
}
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// 削除
// ------------------------------
function deleteClick(){
var a = _list.options;
var i;
var j;
var num = a.length;
for(i=num-1;i>=0;i--){
var item = a[i];
if(item.selected){
var id = parseInt(item.value);
_this.writeDefinitions(function(c){
var filter = c.filter;
if(filter.length > id){
filter.splice(id,1);
}
});
removeItem(item);
}
}
update();
projectModify();
_this.onselect(_list.selectedIndex);
_this.onchange();
}
// ------------------------------
// 優先度アップ(内部用 )
// ------------------------------
function prioUpClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 複数選択オーバー
for(i=_definitions_min;i<num;i++){
if(a[i].selected){
return;
}
}
// 先頭が選択されている
if(a[0].selected) return;
for(i=1;i<num;i++){
if(a[i].selected){
var c = a[i];
var t = c.previousSibling;
t.selected = true;
c.selected = false;
var j = i;
var k = (i-1);
_this.writeDefinitions(function(c){
var filter = c.filter;
t = filter[k];
filter[k] = filter[j];
filter[j] = t;
});
}
}
_this.update();
projectModify();
_this.onchange();
}
// ------------------------------
// 優先度ダウン(内部用 )
// ------------------------------
function prioDownClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 複数選択オーバー
for(i=_definitions_min;i<num;i++){
if(a[i].selected){
return;
}
}
// 先頭が選択されている
if(a[_definitions_min - 1].selected) return;
for(i=num - 2;i>=0;i--){
if(a[i].selected){
var c = a[i];
var t = c.nextSibling;
t.selected = true;
c.selected = false;
var j = i;
var k = (i+1);
_this.writeDefinitions(function(c){
var filter = c.filter;
t = filter[k];
filter[k] = filter[j];
filter[j] = t;
});
}
}
_this.update();
projectModify();
_this.onchange();
}
// ------------------------------
// エクスポート(内部用 )
// ------------------------------
function exportClick(){
var proj = page_expand_project.getObject();
var export_obj = new Object();
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
var filter = ProjectObjectGetActiveData(_definition_active).filter;
for(i=0;i<num;i++){
if(a[i].selected){
if(filter[i]){
ary.push(ObjectCopy(filter[i]));
}
}
}
export_obj.version = proj.version;
export_obj.setting_export = {
type:"filter",
asset:_define_id
};
var define = _new_define_data_func();
define.id = PageExpandProjectObjectDefineGenerateNewUserId(_definitions);
define.user.filter = ary;
export_obj[_define_id] = [define];
// プリセットを除去
export_obj = PageExpandProjectObjectRemovePreset(export_obj);
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_filter_export_dialog"));
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_filter_export_dialog_export"));
var parent = container.getElement();
var text_area = new UI_TextArea(parent);
text_area.setValue(JsonStringify(export_obj));
new UI_TextHint(parent,_i18n.getMessage("menu_setting_filter_export_dialog_export_hint"));
// Ok ボタン
var yes_no_button = new UI_OkButton(dialog_parent);
yes_no_button.onclick = function(v){
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// インポート(内部用 )
// ------------------------------
function importClick(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_filter_import_dialog"));
// 名前
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_filter_import_dialog_explanation"));
var parent = container.getElement();
var unordered_list = new UI_UnorderedList(parent);
unordered_list.addListItem(_i18n.getMessage("menu_setting_filter_import_dialog_explanation_0"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_filter_import_dialog_explanation_1"));
unordered_list.addListItem(_i18n.getMessage("menu_setting_filter_import_dialog_explanation_2"));
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_filter_import_dialog_import"));
var parent = container.getElement();
var text_area_import = new UI_TextArea(parent);
new UI_TextHint(parent,_i18n.getMessage("menu_setting_filter_import_dialog_import_hint"));
// 実行しますか?
var container = new UI_LineContainer(dialog_parent,null);
var parent = container.getElement();
new UI_Text(parent,_i18n.getMessage("menu_setting_filter_import_dialog_confirm"));
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(!v){
// ダイアログ終了
dialog.close();
return;
}
function ExpandBbsImportFailure(message){
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_filter_import_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_filter_import_alert_failure"));
new UI_Text(alert_dialog.getElement(),message);
alert_dialog.oncomplete = function(){
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
}
try{
var proj_obj = page_expand_project.getObject();
var import_obj = JsonParse(text_area_import.getValue());
// バージョンが一致しない
if(import_obj.version > proj_obj.version){
throw "Error: It is a version not supported.";
}
// 出力タイプチェック
var error = false;
try{
var setting_export = import_obj.setting_export;
if(setting_export.type != "filter"){
error = true;
}
if(setting_export.asset != _define_id){
error = true;
}
}catch(e){
error = true;
}
if(error){
throw "Error: It is a type not supported.";
}
// 最新のフィルタを追加
var filter_latest = PageExpandProjectObjectGetDefineFilterLatest(import_obj,_define_id);
_this.writeDefinitions(function(c){
var filter = c.filter;
c.filter = c.filter.concat(filter_latest);
});
projectSave(function(e){
if(!e.result){
ExpandBbsImportFailure(e.message);
return;
}
text_area_import.setValue("");
// 結果を表示
var alert_dialog = new UI_AlertDialog(dialog_parent,_i18n.getMessage("menu_setting_filter_import_alert"));
new UI_Text(alert_dialog.getElement(),_i18n.getMessage("menu_setting_filter_import_alert_success"));
alert_dialog.oncomplete = function(){
// フェードアウト完了後
dialog.oncomplete = function(){
update();
projectModify();
_this.onchange();
};
// ダイアログ終了
dialog.close();
};
alert_dialog.open();
});
}catch(e){
ExpandBbsImportFailure(e);
}
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// 選択されたアイテムをすべて取得
// ------------------------------
_this.getSelectedIndices = function(){
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
ary.push(i);
}
}
return ary;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// 選択イベント
// ------------------------------
_this.onselect = function(){};
// ------------------------------
// リストを選択
// ------------------------------
_this.select = function(id){
_list.selectedIndex = _select_id = _select_mouse = id;
_this.onselect(id);
};
// ------------------------------
// リストを選択
// ------------------------------
_this.selectFromList = function(list){
var dic = new Object();
var i;
var num = list.length;
var index = list[num - 1];
if(_definitions[index] !== undefined){
_list.selectedIndex = _select_id = index;
}
var a = _list.options;
for(i=0;i<num;i++){
var o = a[list[i]];
if(o) o.selected = true;
}
if(index !== undefined){
_this.onselect(index);
}
};
// ------------------------------
// 履歴を上書き
// ------------------------------
_this.replaceHistory = function(){
var selected_filters = new Array();
var a = _this.getSelectedIndices();
var i;
var num = a.length;
for(i=0;i<num;i++){
selected_filters.push(a[i]);
}
if(_definitions[_select_id]){
selected_filters.push(_select_id);
}
// 履歴更新
_history_state.selected_filters = selected_filters;
};
// ------------------------------
// アイテム追加(内部用 )
// ------------------------------
function attachItem(id){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
item.value = id;
_list.appendChild(item);
item.onmousedown = item.onmouseup = function(){
_select_mouse = id;
};
updateItem(item);
}
// ------------------------------
// アイテム更新(内部用 )
// ------------------------------
function updateItem(item){
item.style.color = "#000";
var id = parseInt(item.value);
if(_definition_multiple){
if(_definitions_min <= id){
item.style.color = "#ccc";
}
var filter = ProjectObjectGetActiveData(_definition_active).filter;
if(filter.length <= id){
ElementSetTextContent(item," *");
}else{
ElementSetTextContent(item,LocaleObjectGetString(filter[id].name) + " *");
}
}else{
var filter = ProjectObjectGetActiveData(_definition_active).filter;
ElementSetTextContent(item,LocaleObjectGetString(filter[id].name));
}
}
// ------------------------------
// アイテム削除(内部用 )
// ------------------------------
function removeItem(item){
DomNodeRemove(item);
}
// ------------------------------
// プライベート変数
// ------------------------------
var _definitions;
var _definitions_min;
var _definitions_max;
var _definition_active;
var _definition_multiple;
var _list;
var _define_id;
var _select_id;
var _select_mouse;
var _new_define_data_func;
var _new_filter_data_func;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px; display:table; width:100%;");
parent.appendChild(container);
var list_container = DocumentCreateElement("div");
ElementSetStyle(list_container,"display:table-cell; vertical-align:top; width:auto;");
container.appendChild(list_container);
// リスト
_list = DocumentCreateElement("select");
_list.size = 10;
_list.multiple = true;
ElementSetStyle(_list,"width:100%; font-size:14px; background:#fff;");
list_container.appendChild(_list);
_list.onchange = function(e){
_select_id = _list.selectedIndex;
var o = _list.options[_select_mouse];
if(o !== undefined){
if(o.selected){
_select_id = _select_mouse;
}
}
_this.onselect(_select_id);
_this.replaceHistory();
};
var button_container = DocumentCreateElement("div");
ElementSetStyle(button_container,"display:table-cell; vertical-align:top; width:150px;");
container.appendChild(button_container);
var button_add = DocumentCreateElement("input");
button_add.type = "button";
button_add.value = _i18n.getMessage("menu_setting_filter_button_add");
ElementSetStyle(button_add,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_add);
button_add.onclick = function(){
addClick();
};
var button_delete = DocumentCreateElement("input");
button_delete.type = "button";
button_delete.value = _i18n.getMessage("menu_setting_filter_button_delete");
ElementSetStyle(button_delete,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_delete);
button_delete.onclick = function(){
deleteClick();
};
var button_prio_up = DocumentCreateElement("input");
button_prio_up.type = "button";
button_prio_up.value = _i18n.getMessage("menu_setting_filter_button_prio_up");
ElementSetStyle(button_prio_up,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_prio_up);
button_prio_up.onclick = function(){
prioUpClick();
};
var button_prio_down = DocumentCreateElement("input");
button_prio_down.type = "button";
button_prio_down.value = _i18n.getMessage("menu_setting_filter_button_prio_down");
ElementSetStyle(button_prio_down,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_prio_down);
button_prio_down.onclick = function(){
prioDownClick();
};
var button_export = DocumentCreateElement("input");
button_export.type = "button";
button_export.value = _i18n.getMessage("menu_setting_filter_button_export");
ElementSetStyle(button_export,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_export);
button_export.onclick = function(){
exportClick();
};
var button_import = DocumentCreateElement("input");
button_import.type = "button";
button_import.value = _i18n.getMessage("menu_setting_filter_button_import");
ElementSetStyle(button_import,"width:100%; padding:4px 0px; margin:0px;");
button_container.appendChild(button_import);
button_import.onclick = function(){
importClick();
};
new UI_TextHint(parent,_i18n.getMessage("menu_setting_filter_list_hint"));
})();
}
// ------------------------------
// 定義複数選択用リスト
// ------------------------------
function UI_DefineMultiSelectList(parent){
var _this = this;
// ------------------------------
// 識別名をセット
// ------------------------------
_this.setAsset = function(asset){
_asset = asset;
};
// ------------------------------
// メニュー番号をセット
// ------------------------------
_this.setMenuId = function(id){
_menu_id = id;
};
// ------------------------------
// 定義データをセット
// ------------------------------
_this.setDefineData = function(define_data){
_define_data = define_data;
_define_dictionary = new Object();
var i;
var num = define_data.length;
for(i=0;i<num;i++){
var d = define_data[i];
var p = ProjectObjectGetActiveData(d);
_define_dictionary[d.id] = p;
}
};
// ------------------------------
// URLマップを関連付け
// ------------------------------
_this.attachUrlMaps = function(ary,active){
// 全てクリア
_this.clear();
_urlmaps = ary;
_urlmap_active = active;
_urlmap_multiple = false;
if(_urlmaps.length > 1){
_urlmap_multiple = true;
}
_urlmaps_min = 0x7fffffff;
_urlmaps_max = 0;
var i;
var num = _urlmaps.length;
for(i=0;i<num;i++){
var p = ProjectObjectGetActiveData(_urlmaps[i])[_asset];
if(p.enable){
var l = p.id.length;
if(l > _urlmaps_max) _urlmaps_max = l;
if(l < _urlmaps_min) _urlmaps_min = l;
}else{
_urlmaps_min = 0;
}
}
for(i=0;i<_urlmaps_max;i++){
attachItem(i);
}
updateUI();
};
// ------------------------------
// アクティブなフィルタを取得
// ------------------------------
_this.getUrlmapActive = function(){
return _urlmap_active;
};
// ------------------------------
// クリア
// ------------------------------
_this.clear = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=num-1;i>=0;i--){
removeItem(a[i]);
}
updateUI();
};
// ------------------------------
// 表示更新
// ------------------------------
_this.update = function(){
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
updateItem(a[i]);
}
updateUI();
};
// ------------------------------
// 表示更新(内部用)
// ------------------------------
function update(){
_this.attachUrlMaps(_urlmaps,_urlmap_active);
}
// ------------------------------
// UI 表示更新(内部用)
// ------------------------------
function updateUI(){
var _selected_index = _this.getSelectedIndex();
var disabled = (_selected_index < 0);
_button_prio_up.disabled = disabled;
_button_prio_down.disabled = disabled;
var a = _list.options;
var num = a.length;
if(num){
if(a[0].selected){
_button_prio_up.disabled = true;
}
if(a[num-1].selected){
_button_prio_down.disabled = true;
}
}
var display = "";
if(disabled) display = "none";
_button_prio_up.style.display = display;
_button_prio_down.style.display = display;
_button_delete.style.display = display;
num += 1;
if(num < 3) num = 3;
if(num > 10) num = 10;
if(!disabled){
if(num < 6) num = 6;
}
_list.size = num;
}
// ------------------------------
// 書き込み更新
// ------------------------------
_this.writeUrlmaps = function(func){
var c;
var p;
var i;
var num = _urlmaps.length;
for(i=0;i<num;i++){
c = _urlmaps[i];
if(c.user){
p = c.user;
}else{
if(c.preset){
// プリセットを昇格
p = c.user = ObjectCopy(c.preset);
}
}
if(p) func(p);
}
};
// ------------------------------
// 追加
// ------------------------------
function addClick(){
// モーダルダイアログ作成
var dialog = new UI_ModalDialog(_content_window);
var dialog_parent = dialog.getElement();
dialog.setWidth(600);
// タイトル
var title = new UI_Title(dialog_parent,_i18n.getMessage("menu_setting_define_multi_select_add_dialog"));
// 定義の一覧
var container = new UI_LineContainer(dialog_parent,_i18n.getMessage("menu_setting_define_multi_select_add_dialog_list"));
var parent = container.getElement();
var list_box_filter = new UI_ListBox(parent);
list_box_filter.setMultiple(true);
var i;
var num = _define_data.length;
for(i=0;i<num;i++){
if(_define_data[i].id == "wildcard") continue;
var c = ProjectObjectGetActiveData(_define_data[i]);
list_box_filter.attachItem(LocaleObjectGetString(c.name),i);
}
// Yes No ボタン
var yes_no_button = new UI_YesNoButton(dialog_parent);
yes_no_button.onclick = function(v){
if(v){
var indeices = list_box_filter.getSelectedValues();
_this.writeUrlmaps(function(c){
var i;
var num = indeices.length;
for(i=0;i<num;i++){
var p = _define_data[indeices[i]];
if(c[_asset].enable){
c[_asset].id.push(p.id);
}else{
c[_asset].id = [p.id];
c[_asset].enable = true;
}
}
});
update();
onchange();
projectModify();
}
// ダイアログ終了
dialog.close();
};
// ダイアログ開始
dialog.open();
}
// ------------------------------
// 削除
// ------------------------------
function deleteClick(){
var a = _list.options;
var i;
var j;
var num = a.length;
for(i=num-1;i>=0;i--){
var item = a[i];
if(item.selected){
var id = parseInt(item.value);
_this.writeUrlmaps(function(c){
var ary = c[_asset].id;
if(ary.length > id){
ary.splice(id,1);
}
if(!(ary.length)){
c[_asset].enable = false;
}
});
removeItem(item);
}
}
update();
onchange();
projectModify();
}
// ------------------------------
// 編集(内部用 )
// ------------------------------
function editClick(){
var _selected_index = _this.getSelectedIndex();
var selected_defines = new Array();
if(_selected_index >= 0){
var ary = ProjectObjectGetActiveData(_urlmap_active)[_asset].id;
var a = _this.getSelectedIndices();
var i;
var num = a.length;
for(i=0;i<num;i++){
selected_defines.push(ary[a[i]]);
}
if(ary[_selected_index]){
selected_defines.push(ary[_selected_index]);
}
}
_config.pushHistory(_menu_id);
var content = _config.MenuItemSelect(_menu_id);
content.selectFromIdList(selected_defines);
content.replaceHistory();
}
// ------------------------------
// 優先度アップ(内部用 )
// ------------------------------
function prioUpClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 複数選択オーバー
for(i=_urlmaps_min;i<num;i++){
if(a[i].selected){
return;
}
}
// 先頭が選択されている
if(a[0].selected) return;
for(i=1;i<num;i++){
if(a[i].selected){
var c = a[i];
var t = c.previousSibling;
t.selected = true;
c.selected = false;
var j = i;
var k = (i-1);
_this.writeUrlmaps(function(c){
var ary = c[_asset].id;
t = ary[k];
ary[k] = ary[j];
ary[j] = t;
});
}
}
_this.update();
onchange();
projectModify();
}
// ------------------------------
// 優先度ダウン(内部用 )
// ------------------------------
function prioDownClick(){
var t;
var a = _list.options;
var i;
var num = a.length;
// アイテムなし
if(!num) return;
// 複数選択オーバー
for(i=_urlmaps_min;i<num;i++){
if(a[i].selected){
return;
}
}
// 先頭が選択されている
if(a[_urlmaps_min - 1].selected) return;
for(i=num - 2;i>=0;i--){
if(a[i].selected){
var c = a[i];
var t = c.nextSibling;
t.selected = true;
c.selected = false;
var j = i;
var k = (i+1);
_this.writeUrlmaps(function(c){
var ary = c[_asset].id;
t = ary[k];
ary[k] = ary[j];
ary[j] = t;
});
}
}
_this.update();
onchange();
projectModify();
}
// ------------------------------
// 選択されたアイテムを取得
// ------------------------------
_this.getSelectedIndex = function(){
return _select_id = _list.selectedIndex;
};
// ------------------------------
// 選択されたアイテムをすべて取得
// ------------------------------
_this.getSelectedIndices = function(){
var ary = new Array();
var a = _list.options;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(a[i].selected){
ary.push(i);
}
}
return ary;
};
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// 更新イベント(内部用)
// ------------------------------
function onchange(){
if(_this.onchange){
_this.onchange();
}
}
// ------------------------------
// 選択イベント
// ------------------------------
_this.onselect = function(){};
// ------------------------------
// リストを選択
// ------------------------------
_this.select = function(id){
_list.selectedIndex = _select_id = _select_mouse = id;
_this.onselect(id);
};
// ------------------------------
// アイテム追加(内部用 )
// ------------------------------
function attachItem(id){
var item = DocumentCreateElement("option");
ElementSetStyle(item,"margin:2px 0px;");
item.value = id;
_list.appendChild(item);
item.onmousedown = item.onmouseup = function(){
_select_mouse = id;
};
updateItem(item);
}
// ------------------------------
// アイテム更新(内部用 )
// ------------------------------
function updateItem(item){
item.style.color = "#000";
var id = parseInt(item.value);
if(_urlmap_multiple){
if(_urlmaps_min <= id){
item.style.color = "#ccc";
}
var p = ProjectObjectGetActiveData(_urlmap_active)[_asset];
var ary = p.id;
var l = ary.length;
if(!(p.enable)) l = 0;
if(l <= id){
ElementSetTextContent(item," *");
}else{
ElementSetTextContent(item,LocaleObjectGetString(_define_dictionary[ary[id]].name) + " *");
}
}else{
var ary = ProjectObjectGetActiveData(_urlmap_active)[_asset].id;
ElementSetTextContent(item,LocaleObjectGetString(_define_dictionary[ary[id]].name));
}
}
// ------------------------------
// アイテム削除(内部用 )
// ------------------------------
function removeItem(item){
DomNodeRemove(item);
}
// ------------------------------
// プライベート変数
// ------------------------------
var _urlmaps;
var _urlmaps_min;
var _urlmaps_max;
var _urlmap_active;
var _urlmap_multiple;
var _list;
var _select_id;
var _select_mouse;
var _asset;
var _menu_id;
var _define_dictionary;
var _define_data;
var _button_add;
var _button_delete;
var _button_edit;
var _button_prio_up;
var _button_prio_down;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var container = DocumentCreateElement("div");
ElementSetStyle(container,"margin:0px 0px 5px 0px; display:table; width:100%;");
parent.appendChild(container);
var list_container = DocumentCreateElement("div");
ElementSetStyle(list_container,"display:table-cell; vertical-align:top; width:auto;");
container.appendChild(list_container);
// リスト
_list = DocumentCreateElement("select");
_list.multiple = true;
ElementSetStyle(_list,"width:100%; font-size:14px; background:#fff;");
list_container.appendChild(_list);
_list.onchange = function(e){
_select_id = _list.selectedIndex;
var o = _list.options[_select_mouse];
if(o !== undefined){
if(o.selected){
_select_id = _select_mouse;
}
}
updateUI();
_this.onselect(_select_id);
};
var button_container = DocumentCreateElement("div");
ElementSetStyle(button_container,"display:table-cell; vertical-align:top; width:50px; line-height:0;");
container.appendChild(button_container);
_button_add = DocumentCreateElement("input");
_button_add.type = "button";
_button_add.value = _i18n.getMessage("menu_setting_urlmap_define_button_add");
ElementSetStyle(_button_add,"width:100%; padding:1px 0px; margin:0px;");
button_container.appendChild(_button_add);
_button_add.onclick = function(){
addClick();
};
_button_delete = DocumentCreateElement("input");
_button_delete.type = "button";
_button_delete.value = _i18n.getMessage("menu_setting_urlmap_define_button_remove");
ElementSetStyle(_button_delete,"width:100%; padding:1px 0px; margin:0px;");
button_container.appendChild(_button_delete);
_button_delete.onclick = function(){
deleteClick();
};
_button_edit = DocumentCreateElement("input");
_button_edit.type = "button";
_button_edit.value = _i18n.getMessage("menu_setting_urlmap_define_button_edit");
ElementSetStyle(_button_edit,"width:100%; padding:1px 0px; margin:0px;");
button_container.appendChild(_button_edit);
_button_edit.onclick = function(){
editClick();
};
_button_prio_up = DocumentCreateElement("input");
_button_prio_up.type = "button";
_button_prio_up.value = _i18n.getMessage("menu_setting_urlmap_define_button_prio_up");
ElementSetStyle(_button_prio_up,"width:100%; padding:1px 0px; margin:0px;");
button_container.appendChild(_button_prio_up);
_button_prio_up.onclick = function(){
prioUpClick();
};
_button_prio_down = DocumentCreateElement("input");
_button_prio_down.type = "button";
_button_prio_down.value = _i18n.getMessage("menu_setting_urlmap_define_button_prio_down");
ElementSetStyle(_button_prio_down,"width:100%; padding:1px 0px; margin:0px;");
button_container.appendChild(_button_prio_down);
_button_prio_down.onclick = function(){
prioDownClick();
};
updateUI();
})();
}
// ------------------------------
// URL エディットコンテナ
// ------------------------------
function UI_UrlEditContainer(parent){
var _this = this;
// ------------------------------
// カスタムオブジェクトを関連付け
// ------------------------------
_this.attachObject = function(obj){
// クリア
_this.clear();
_filter_container = ObjectCopy(obj);
update();
};
// ------------------------------
// クリア
// ------------------------------
_this.clear = function(){
_text_area_filter_url.setValue("");
_regexp_list_filter.clear();
};
// ------------------------------
// 表示更新
// ------------------------------
function update(){
_form_container_asterisk.setVisible(false);
_form_container_regexp.setVisible(false);
_combo_box_type.setValue(_filter_container.type);
switch(_filter_container.type){
case "asterisk":
_text_area_filter_url.joinArray(_filter_container.asterisk.filter,"\n");
_form_container_asterisk.setVisible(true);
break;
case "regexp":
_regexp_list_filter.attachArray(_filter_container.regexp.filter);
_form_container_regexp.setVisible(true);
break;
}
}
// ------------------------------
// 更新イベント
// ------------------------------
_this.onchange = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _filter_container;
var _combo_box_type;
var _regexp_list_filter;
var _text_area_filter_url;
var _form_container_asterisk;
var _form_container_regexp;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_combo_box_type = new UI_ComboBox(parent);
_combo_box_type.attachItem(_i18n.getMessage("menu_setting_url_edit_container_combo_box_item_asterisk"),"asterisk");
_combo_box_type.attachItem(_i18n.getMessage("menu_setting_url_edit_container_combo_box_item_regexp"),"regexp");
_combo_box_type.onchange = function(v){
_filter_container.type = v;
update();
_this.onchange(_filter_container);
};
_form_container_asterisk = new UI_FormContainer(parent);
_form_container_asterisk.setVisible(false);
var form_parent_asterisk = _form_container_asterisk.getElement();
// アスタリスクリスト
_text_area_filter_url = new UI_TextArea(form_parent_asterisk);
_text_area_filter_url.oninput = function(v){
_filter_container.asterisk.filter = _text_area_filter_url.spiritByLine();
_this.onchange(_filter_container);
};
new UI_TextHint(form_parent_asterisk,_i18n.getMessage("menu_setting_url_edit_container_type_asterisk_hint"));
_form_container_regexp = new UI_FormContainer(parent);
_form_container_regexp.setVisible(false);
var form_parent_regexp = _form_container_regexp.getElement();
// 正規表現リスト
_regexp_list_filter = new UI_RegExpList(form_parent_regexp);
_regexp_list_filter.onchange = function(v){
_filter_container.regexp.filter = ObjectCopy(v);
_this.onchange(_filter_container);
};
})();
}
// ------------------------------
// プロジェクト用データからアクティブなオブジェクトを取得
// ------------------------------
function ProjectObjectGetActiveData(obj){
if(obj.user) return obj.user;
if(obj.preset) return obj.preset;
return null;
}
// ------------------------------
// ロケールオブジェクトを作成
// ------------------------------
function LocaleObjectCreate(){
return {
standard:"",
locales:{}
};
}
// ------------------------------
// ロケールオブジェクトから文字を取得
// ------------------------------
function LocaleObjectGetString(obj){
var language = page_expand_project.getLanguage();
if(obj.locales.hasOwnProperty(language)){
return obj.locales[language];
}else{
return obj.standard;
}
}
// ------------------------------
// ロケールオブジェクトに文字をセット
// ------------------------------
function LocaleObjectSetString(obj,str){
obj.locales[page_expand_project.getLanguage()] = str;
obj.standard = str;
}
// ------------------------------
// 掲示板拡張設定を生成(内部)
// ------------------------------
function createExpandBbsData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
enable:true,
filter:{
type:"asterisk",
asterisk:{
filter:[]
},
regexp:{
filter:[]
}
},
script_initialize:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// work:Object 型(自由に書き込み可能)
// ------------------------------
var work = info.work;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]",
script_callback:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// element:Element オブジェクト
// work:Object 型(自由に書き込み可能)
// ------------------------------
var element = info.element;
var work = info.work;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// useful:Boolean 型(エレメントが有用であった場合に true を指定)
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({useful:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]",
popup:{
origin_type:"adsorb_top_bottom",
position_type:"absolute",
enable_animation:true,
percent:{x:50,y:50},
time_wait_open:0,
time_wait_close:0,
style_sheet:""
}
}
};
}
// ------------------------------
// URLマッピング設定を生成(内部)
// ------------------------------
function createUrlMapData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
enable:false,
filter:{
type:"asterisk",
asterisk:{
filter:[]
},
regexp:{
filter:[]
}
},
enable_unsecure:false,
enable_mixed_content:false,
access_block:{enable:false,id:[]},
replacement_to_element:{enable:false,id:[]},
replacement_to_text:{enable:false,id:[]},
replacement_to_anchor:{enable:false,id:[]},
replacement_to_link:{enable:false,id:[]},
replacement_to_referer:{enable:false,id:[]},
replacement_to_useragent:{enable:false,id:[]},
make_link_to_text:{enable:false,id:""},
expand_short_url:{enable:false,id:""},
expand_text:{enable:false,id:""},
expand_image:{enable:false,id:""},
expand_sound:{enable:false,id:""},
expand_video:{enable:false,id:""},
expand_iframe:{enable:false,id:""},
style_sheet:{enable:false,id:""},
experimental:{enable:false,id:""}
}
};
}
// ------------------------------
// アクセス遮断設定を生成(内部)
// ------------------------------
function createAccessBlockData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
filter:{
type:"asterisk",
asterisk:{
filter:[]
},
regexp:{
filter:[]
}
}
}
};
}
// ------------------------------
// エレメント置換設定を生成(内部)
// ------------------------------
function createPlacementToElementData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
script:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// element:HTMLElement オブジェクト
// ------------------------------
var element = info.element;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// url:String 型(省略可、展開先のアドレスを指定)
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
}
};
}
// ------------------------------
// テキスト置換設定を生成(内部)
// ------------------------------
function createPlacementToTextData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
script:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// text_node:Text オブジェクト (DOM)
// ------------------------------
var text_node = info.text_node;
// ------------------------------
// 第02引数 function
// 引数:なし
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response();
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
}
};
}
// ------------------------------
// アンカー置換設定を生成(内部)
// ------------------------------
function createPlacementToAnchorData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
script:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// anchor_element:HTMLAnchorElement オブジェクト
// event_dispatcher:EventDispatcher オブジェクト
// ------------------------------
var anchor_element = info.anchor_element;
var event_dispatcher = info.event_dispatcher;
// ------------------------------
// 第02引数 function
// 引数:なし
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response();
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
}
};
}
// ------------------------------
// ハイパーリンク置換設定を生成(内部)
// ------------------------------
function createPlacementToLinkData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
filter:[]
}
};
}
// ------------------------------
// ハイパーリンク置換設定のフィルタアイテムを生成(内部)
// ------------------------------
function createPlacementToLinkFilterItemData(){
return {
name:{
standard:"",
locales:{
ja:"",
en:""
}
},
filter:{
type:"asterisk",
asterisk:{
filter:[]
},
regexp:{
filter:[]
}
},
enable_reflect_to_anchor:false,
enable_cache:false,
script:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// anchor_element:HTMLAnchorElement オブジェクト
// ------------------------------
var anchor_element = info.anchor_element;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// url:String 型(省略可、展開先のアドレスを変更したい場合に指定)
// content_type:Array 型(省略可、展開先のコンテンツタイプを通知したい場合に指定)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
};
}
// ------------------------------
// リファラ置換設定を生成(内部)
// ------------------------------
function createPlacementToRefererData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
filter:[]
}
};
}
// ------------------------------
// リファラ置換設定のフィルタアイテムを生成(内部)
// ------------------------------
function createPlacementToRefererFilterItemData(){
return {
name:{
standard:"",
locales:{
ja:"",
en:""
}
},
filter:{
type:"asterisk",
asterisk:{
filter:[]
},
regexp:{
filter:[]
}
},
send_referer:{
type:"default",
custom:"",
regexp:{
pattern:"",
flags:{i:false,g:false}
},
replacement:""
}
};
}
// ------------------------------
// ユーザーエージェント置換設定を生成(内部)
// ------------------------------
function createPlacementToUserAgentData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
filter:[]
}
};
}
// ------------------------------
// ユーザーエージェント置換設定のフィルタアイテムを生成(内部)
// ------------------------------
function createPlacementToUserAgentFilterItemData(){
return {
name:{
standard:"",
locales:{
ja:"",
en:""
}
},
filter:{
type:"asterisk",
asterisk:{
filter:[]
},
regexp:{
filter:[]
}
},
send_useragent:{
custom:""
}
};
}
// ------------------------------
// ハイパーリンク化設定を生成(内部)
// ------------------------------
function createMakeLinkToTextData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
script:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// text_node:Text オブジェクト (DOM)
// ------------------------------
var text_node = info.text_node;
// ------------------------------
// 第02引数 function
// 引数:なし
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response();
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
}
};
}
// ------------------------------
// 短縮 URL の展開設定を生成(内部)
// ------------------------------
function createExpandShortUrlData(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
filter:{
type:"asterisk",
asterisk:{
filter:[]
},
regexp:{
filter:[]
}
}
}
};
}
// ------------------------------
// テキストの展開設定を生成(内部)
// ------------------------------
function createExpandText(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
inline:{
disable_same_text:false,
script_allow:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// url:String 型(展開先のアドレス)
// content_type:Array 型(コンテンツタイプ)
// ------------------------------
var current_element = info.current_element;
var url = info.url;
var content_type = info.content_type;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]",
script_insert:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// textarea_element:HTMLTextAreaElement オブジェクト
// event_dispatcher:EventDispatcher オブジェクト
// ------------------------------
var current_element = info.current_element;
var textarea = info.textarea_element;
var event_dispatcher = info.event_dispatcher;
// ------------------------------
// 第02引数 function
// 引数:なし
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response();
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
}
}
};
}
// ------------------------------
// イメージの展開設定を生成(内部)
// ------------------------------
function createExpandImage(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
thumbnail:{
enable_thumbnail:false,
enable_popup_mouseover:false,
disable_same_image:false,
load_type:"preload",
script_allow:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// url:String 型(展開先のアドレス)
// content_type:Array 型(コンテンツタイプ)
// ------------------------------
var current_element = info.current_element;
var url = info.url;
var content_type = info.content_type;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]",
script_insert:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// image_element:HTMLImageElement オブジェクト
// event_dispatcher:EventDispatcher オブジェクト
// ------------------------------
var current_element = info.current_element;
var image = info.image_element;
var event_dispatcher = info.event_dispatcher;
// ------------------------------
// 第02引数 function
// 引数:なし
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response();
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
},
popup:{
enable_popup_mouseover:false,
enable_animation_scale:false,
enable_animation_alpha:false,
load_type:"preload",
origin_type:"center",
position_type:"absolute",
scale_percent:100,
time_wait_open:0,
time_wait_close:0,
script_allow:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// url:String 型(展開先のアドレス)
// content_type:Array 型(コンテンツタイプ)
// ------------------------------
var current_element = info.current_element;
var url = info.url;
var content_type = info.content_type;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
},
reduced_image:{
enable_popup:false,
popup_allow_slcale_less_then:0
},
load:{
enable_notify:false,
enable_unload:false,
src_type:"mixed_content",
unload_allow_size_more_then:0
}
}
};
}
// ------------------------------
// サウンドの展開設定を生成(内部)
// ------------------------------
function createExpandSound(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
inline:{
disable_same_audio:false,
sound_max:10,
script_allow:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// url:String 型(展開先のアドレス)
// content_type:Array 型(コンテンツタイプ)
// ------------------------------
var current_element = info.current_element;
var url = info.url;
var content_type = info.content_type;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]",
script_insert:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// element:HTMLElement オブジェクト(オーディオ)
// event_dispatcher:EventDispatcher オブジェクト
// ------------------------------
var current_element = info.current_element;
var audio = info.element;
var event_dispatcher = info.event_dispatcher;
// ------------------------------
// 第02引数 function
// 引数:なし
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response();
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
},
audio_element:{
script_allow:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// url:String 型(展開先のアドレス)
// content_type:Array 型(コンテンツタイプ)
// ------------------------------
var current_element = info.current_element;
var url = info.url;
var content_type = info.content_type;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
},
soundcloud:{
visible_player_flash:false,
visible_player_html5:false
},
mixcloud:{
visible_player:false
}
}
};
}
// ------------------------------
// ビデオの展開設定を生成(内部)
// ------------------------------
function createExpandVideo(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
inline:{
disable_same_video:false,
video_max:10,
script_allow:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// url:String 型(展開先のアドレス)
// content_type:Array 型(コンテンツタイプ)
// ------------------------------
var current_element = info.current_element;
var url = info.url;
var content_type = info.content_type;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]",
script_insert:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// element:HTMLElement オブジェクト(ビデオ)
// event_dispatcher:EventDispatcher オブジェクト
// ------------------------------
var current_element = info.current_element;
var video = info.element;
var event_dispatcher = info.event_dispatcher;
// ------------------------------
// 第02引数 function
// 引数:なし
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response();
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
},
video_element:{
script_allow:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// url:String 型(展開先のアドレス)
// content_type:Array 型(コンテンツタイプ)
// ------------------------------
var current_element = info.current_element;
var url = info.url;
var content_type = info.content_type;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
},
youtube:{
visible_video:false
},
nicovideo:{
visible_video:false,
visible_thumbnail_video:false,
visible_thumbnail_mylist:false,
visible_thumbnail_user:false,
visible_thumbnail_community:false,
visible_thumbnail_live:false,
visible_thumbnail_seiga:false
},
ustream:{
visible_video_live:false,
visible_video_record:false
},
dailymotion:{
visible_video:false
},
vimeo:{
visible_video:false
},
fc2video:{
visible_video:false
},
liveleak:{
visible_video:false
}
}
};
}
// ------------------------------
// インラインフレームの展開設定を生成(内部)
// ------------------------------
function createExpandIframe(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
inline:{
disable_same_iframe:false,
script_allow:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// url:String 型(展開先のアドレス)
// content_type:Array 型(コンテンツタイプ)
// ------------------------------
var current_element = info.current_element;
var url = info.url;
var content_type = info.content_type;
// ------------------------------
// 第02引数 function
// 引数:Object 型
// result:Boolean 型(true で許可、false で拒否)
// 必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response({result:false});
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]",
script_insert:
"[\n\t" +
function(info,response){
// ------------------------------
// 第01引数 Object 型
// current_element:HTMLElement オブジェクト
// iframe_element:HTMLIFrameElement オブジェクト
// event_dispatcher:EventDispatcher オブジェクト
// ------------------------------
var current_element = info.current_element;
var iframe = info.iframe_element;
var event_dispatcher = info.event_dispatcher;
// ------------------------------
// 第02引数 function
// 引数:なし
// 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。
// ------------------------------
response();
// ------------------------------
// 戻り値 Boolean 型
// true :関数の実行を完了
// false:次の関数を実行
// ------------------------------
return true;
}.toString() +
"\n]"
}
}
};
}
// ------------------------------
// スタイルシート設定を生成(内部)
// ------------------------------
function createStyleSheet(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
},
expand_text:{
inline:""
},
expand_image:{
thumbnail:"",
popup:""
},
expand_sound:{
inline:{
audio_element:{
audio:""
},
soundcloud:{
player_flash:"",
player_html5:""
},
mixcloud:{
player:""
}
}
},
expand_video:{
inline:{
video_element:{
video:""
},
youtube:{
video:""
},
nicovideo:{
video:"",
thumbnail_video:"",
thumbnail_mylist:"",
thumbnail_user:"",
thumbnail_community:"",
thumbnail_live:"",
thumbnail_seiga:""
},
ustream:{
video_live:"",
video_record:""
},
dailymotion:{
video:""
},
vimeo:{
video:""
},
fc2video:{
video:""
},
liveleak:{
video:""
}
}
},
expand_iframe:{
inline:""
}
}
};
}
// ------------------------------
// 試験運用設定を生成(内部)
// ------------------------------
function createExperimental(){
return {
id:null,
user:{
name:{
standard:"",
locales:{}
}
}
};
}
// ------------------------------
// プロジェクトを修正(内部用)
// ------------------------------
function projectModify(){
projectSave(function(e){});
}
// ------------------------------
// ロード(内部用)
// ------------------------------
function projectLoad(func){
if(!page_expand_project){
// プロジェクト
page_expand_project = new PageExpandProject();
// ローカルストレージからロード
page_expand_project.loadLocalStorage(function(e){
func(e);
});
}else{
func({result:false});
}
}
// ------------------------------
// セーブ(内部用)
// ------------------------------
function projectSave(func){
// ローカルストレージに保存
page_expand_project.saveLocalStorage(function(e){
func(e);
});
}
// ------------------------------
// 破棄(内部用)
// ------------------------------
function projectDelete(func){
page_expand_project.removeLocalStorage(function(e){
func(e);
});
}
// ------------------------------
// 同期ストレージロード(内部用)
// ------------------------------
function projectLoadFromSyncStorage(func){
}
// ------------------------------
// 同期ストレージセーブ(内部用)
// ------------------------------
function projectSaveFromSyncStorage(func){
}
// ------------------------------
// 同期ストレージ破棄(内部用)
// ------------------------------
function projectDeleteFromSyncStorage(func){
}
// ------------------------------
// プライベート変数
// ------------------------------
var _menu_window;
var _content_window;
var _i18n;
var _menu_items;
var _history_state;
var _history_state_list;
var _menu_item_param = [
{asset:"menu_setting_standard",callback:ContentSettingStandard,bgcolor:0xFFFFFFFF},
{asset:"menu_setting_access_block",callback:ContentSettingAccessBlock,bgcolor:0xFFFFE0F0},
{asset:"menu_setting_replacement_to_referer",callback:ContentSettingReplacementToReferer,bgcolor:0xFFFFE0F0},
{asset:"menu_setting_replacement_to_useragent",callback:ContentSettingReplacementToUserAgent,bgcolor:0xFFFFE0F0},
{asset:"menu_setting_replacement_to_element",callback:ContentSettingReplacementToElement,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_replacement_to_text",callback:ContentSettingReplacementToText,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_replacement_to_anchor",callback:ContentSettingReplacementToAnchor,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_replacement_to_link",callback:ContentSettingReplacementToLink,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_make_link_to_text",callback:ContentSettingMakeLinkToText,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_expand_short_url",callback:ContentSettingExpandShortUrl,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_expand_text",callback:ContentSettingExpandText,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_expand_image",callback:ContentSettingExpandImage,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_expand_sound",callback:ContentSettingExpandSound,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_expand_video",callback:ContentSettingExpandVideo,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_expand_iframe",callback:ContentSettingExpandIframe,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_style_sheet",callback:ContentSettingStyleSheet,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_experimental",callback:ContentSettingExperimental,bgcolor:0xFFE0E0FF},
{asset:"menu_setting_urlmap",callback:ContentSettingUrlMap,bgcolor:0xFFFFF0D8},
{asset:"menu_setting_expand_bbs",callback:ContentSettingExpandBbs,bgcolor:0xFFFFFFFF},
{asset:"menu_setting_download",callback:ContentSettingDownload,bgcolor:0xFFFFFFFF},
{asset:"menu_setting_language",callback:ContentSettingLanguage,bgcolor:0xFFFFFFFF},
{asset:"menu_credit",callback:ContentCredit,bgcolor:0xFFFFFFFF}
];
var _menu_support_param = [
{menu:true,urlmap:true},
{menu:false,urlmap:false},
{menu:false,urlmap:false},
{menu:false,urlmap:false},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true},
{menu:true,urlmap:true}
];
// ------------------------------
// 初期化関数(内部用)
// ------------------------------
function initialize(){
_menu_items = new Array();
// 履歴オブジェクト
_history_state_list = new Array();
_history_state_list[0] = _history_state = {index:0};
// エレメントを全てクリア
var child_nodes = document.childNodes;
var i;
var num = child_nodes.length;
for(i=num-1;i >= 0;i--){
var node = child_nodes[i];
DomNodeRemove(node);
}
// HTML
var html = DocumentCreateElement("html");
document.appendChild(html);
// ボディ
var body = DocumentCreateElement("body");
ElementSetStyle(body,'background-color:#CCC; font-family:"Meiryo"; margin:0px; padding:0px; overflow-y:scroll;');
html.appendChild(body);
// ロケール
_i18n = new InternationalMessage(page_expand_project.getLanguage());
// タイトル
document.title = _i18n.getMessage("page_expand_config");
// ヘッダ
var head_window = DocumentCreateElement("div");
ElementSetStyle(head_window,"background-color:#000; color:#fff; font-size:12px; font-weight:bold; padding:2px 5px; margin:0px 0px 20px;");
ElementSetTextContent(head_window,_i18n.getMessage("page_expand_config"));
body.appendChild(head_window);
// 外周
var out_window = DocumentCreateElement("div");
ElementSetStyle(out_window,"margin:0px 15px 15px 5px;");
body.appendChild(out_window);
// 外周
var out_table = DocumentCreateElement("div");
ElementSetStyle(out_table,"width:100%; display:table;");
out_window.appendChild(out_table);
// メニュー部
_menu_window = DocumentCreateElement("div");
ElementSetStyle(_menu_window,"width:250px; display:table-cell; vertical-align:top; user-select:none; -webkit-user-select:none; -moz-user-select:none; -khtml-user-select:none; margin:20px;");
out_table.appendChild(_menu_window);
// メニュー上部
var menu_item_top = DocumentCreateElement("div");
ElementSetStyle(menu_item_top,"height:10px;");
_menu_window.appendChild(menu_item_top);
{
// メニュー
var i;
var num = _menu_item_param.length;
for(i=0;i<num;i++){
var param = _menu_item_param[i];
var item = new MenuItemCreate(_i18n.getMessage(param.asset),i);
item.setBackgroundColor(param.bgcolor);
item.setSupport(_menu_support_param[i].menu);
_menu_items.push(item);
}
}
// メニュー下部
var menu_item_bottom = DocumentCreateElement("div");
ElementSetStyle(menu_item_bottom,"height:50px;");
_menu_window.appendChild(menu_item_bottom);
// コンテンツ部
_content_window = DocumentCreateElement("div");
ElementSetStyle(_content_window,"width:auto; min-width:500px; display:table-cell; vertical-align:top; padding:10px 20px 50px; background-color:#FFF; border-radius:5px; box-shadow:3px 3px 3px #888;");
out_table.appendChild(_content_window);
// 基本設定
_config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_STANDARD);
// ------------------------------
// 履歴復元
// ------------------------------
window.onpopstate = function(e){
var state = e.state;
if(!state) return;
// 履歴オブジェクト変更
_history_state = _history_state_list[state.index];
if(!_history_state){
_history_state_list[state.index] = _history_state = { index:state.index , selected_menu:state.menu };
}
var content;
if(_history_state.selected_menu !== undefined){
content = _config.MenuItemSelect(_history_state.selected_menu);
}
if(_history_state.selected_defines !== undefined){
content.selectFromIdList(_history_state.selected_defines);
}
if(_history_state.selected_filters !== undefined){
if(content.selectFilterFromList){
content.selectFilterFromList(_history_state.selected_filters);
}
}
if(_history_state.scroll_pos !== undefined){
WindowSetScrollPosition(window,_history_state.scroll_pos);
}
};
// ------------------------------
// スクロール
// ------------------------------
window.onscroll = function(e){
_history_state.scroll_pos = WindowGetScrollPosition(window);
};
}
// ------------------------------
// 初期化関数
// ------------------------------
_config.initialize = function(func){
// フレームは動作させない
if (WindowIsChild(window)){
func(false);
return;
}
// BODY が存在しない
var body = document.body;
if(!body){
func(false);
return;
}
// プロジェクトをロード
projectLoad(function(e){
initialize();
func(true);
});
};
return _config;
}
// ------------------------------
// 定数
// ------------------------------
PageExpandConfig.MENU_TYPE_SETTING_STANDARD = 0;
PageExpandConfig.MENU_TYPE_SETTING_ACCESS_BLOCK = 1;
PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_REFERER = 2;
PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_USERAGENT = 3;
PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_ELEMENT = 4;
PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_TEXT = 5;
PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_ANCHOR = 6;
PageExpandConfig.MENU_TYPE_SETTING_REPLACEMENT_TO_LINK = 7;
PageExpandConfig.MENU_TYPE_SETTING_MAKE_LINK_TO_TEXT = 8;
PageExpandConfig.MENU_TYPE_SETTING_EXPAND_SHORT_URL = 9;
PageExpandConfig.MENU_TYPE_SETTING_EXPAND_TEXT = 10;
PageExpandConfig.MENU_TYPE_SETTING_EXPAND_IMAGE = 11;
PageExpandConfig.MENU_TYPE_SETTING_EXPAND_SOUND = 12;
PageExpandConfig.MENU_TYPE_SETTING_EXPAND_VIDEO = 13;
PageExpandConfig.MENU_TYPE_SETTING_EXPAND_IFRAME = 14;
PageExpandConfig.MENU_TYPE_SETTING_STYLE_SHEET = 15;
PageExpandConfig.MENU_TYPE_SETTING_EXPERIMENTAL = 16;
PageExpandConfig.MENU_TYPE_SETTING_URL_MAPPING = 17;
PageExpandConfig.MENU_TYPE_SETTING_EXPAND_BBS = 18;
PageExpandConfig.MENU_TYPE_SETTING_DOWNLOAD = 19;
PageExpandConfig.MENU_TYPE_SETTING_LANGUAGE = 20;
PageExpandConfig.MENU_TYPE_CREDIT = 21;
// ------------------------------
// ポップアップメニュー
// ------------------------------
function PageExpandPopupMenu(){
var _this = this;
// ------------------------------
// リロード
// ------------------------------
_this.reload = function (){
// プロジェクト読み込み
projectLoad(function(e){
// エレメントを全てクリア
var child_nodes = document.body.childNodes;
var i;
var num = child_nodes.length;
for(i=num-1;i >= 0;i--){
var node = child_nodes[i];
DomNodeRemove(node);
}
// ロケール
_i18n = new InternationalMessage(page_expand_project.getLanguage());
initialize();
});
};
// ------------------------------
// ロード(内部用)
// ------------------------------
function projectLoad(func){
var proj = new PageExpandProject();
// プロジェクトをロード
proj.loadLocalStorage(function(e){
// プロジェクトを更新
page_expand_project = proj;
project = new Project();
getActiveURL(function(url){
project.importObjectForBackground(page_expand_project.getProject(url));
func(e);
});
});
}
// ------------------------------
// クリック(内部用)
// ------------------------------
function click(command){
}
// ------------------------------
// アクティブページのURLを取得(内部用)
// ------------------------------
function getActiveURL(func){
}
// ------------------------------
// ラインボタン(内部用)
// ------------------------------
function UI_LineButton(parent,label){
var _this = this;
// ------------------------------
// 通常状態(内部用)
// ------------------------------
function normal(){
_style.color = "#222";
_style.background = "none";
}
// ------------------------------
// マウスオーバー状態(内部用)
// ------------------------------
function mouse_over(){
_style.color = "#fff";
_style.background = "#4281F4";
}
// ------------------------------
// マウスオーバー状態(内部用)
// ------------------------------
function mouse_down(){
_style.color = "#fff";
_style.background = "#4281F4";
}
// ------------------------------
// クリックイベント
// ------------------------------
_this.onclick = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _item;
var _style;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_item = DocumentCreateElement("a");
_item.href = "javascript:void(0);";
_style = _item.style;
// ElementSetStyle(_item,"font-size:12px; color:#000; margin:0px 0px 2px; padding:2px 20px; border-radius:5px; box-shadow:0px 0px 2px #888;");
ElementSetStyle(_item,"display:block; text-decoration: none; font-size:13px; color:#000; margin:0px 0px 2px; padding:4px 20px; border-radius:5px;");
ElementSetTextContent(_item,label);
parent.appendChild(_item);
_item.onclick = function(){
_this.onclick();
};
_item.onmouseover = function(){
mouse_over();
};
_item.onmousedown = function(){
mouse_down();
};
_item.onmouseup = function(){
mouse_over();
};
_item.onmouseout = function(){
normal();
};
normal();
})();
}
// ------------------------------
// セパレータ(内部用)
// ------------------------------
function UI_Separator(parent){
var _this = this;
// ------------------------------
// プライベート変数
// ------------------------------
var _item;
var _style;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_item = DocumentCreateElement("div");
ElementSetStyle(_item,"height: 0px; border-top:1px solid #ddd; margin:2px 0px;");
parent.appendChild(_item);
})();
}
// ------------------------------
// 初期化(内部用)
// ------------------------------
function initialize(){
// タイトル
document.title = _i18n.getMessage("page_expand_popup_menu");
// ボディ
var body = document.body;
ElementSetStyle(body,'background-color:#ccc; font-family:"Meiryo"; margin:0px; padding:0px; width:300px; border:0px solid #000;');
// ヘッダ
var head_window = DocumentCreateElement("div");
ElementSetStyle(head_window,"background-color:#000; color:#fff; font-size:12px; font-weight:bold; padding:2px 5px; margin:0px;");
ElementSetTextContent(head_window,_i18n.getMessage("page_expand_popup_menu"));
body.appendChild(head_window);
// ボディ
var body_window = DocumentCreateElement("div");
ElementSetStyle(body_window,"border:2px inset #f0f0f0; background-color:#fcfcfc;");
body.appendChild(body_window);
// 外周
var out_window = DocumentCreateElement("div");
ElementSetStyle(out_window,"margin:5px 5px 5px 5px;");
body_window.appendChild(out_window);
// 外周
var out_table = DocumentCreateElement("div");
ElementSetStyle(out_table,"width:100%; display:table;");
out_window.appendChild(out_table);
// メニュー部
var _menu_window = DocumentCreateElement("div");
ElementSetStyle(_menu_window,"display:table-cell; vertical-align:top; user-select:none; -webkit-user-select:none; -moz-user-select:none; -khtml-user-select:none; margin:0px;");
out_table.appendChild(_menu_window);
// 一括ダウンロード(画像)
var button_config = new UI_LineButton(_menu_window,_i18n.getMessage("context_menu_batch_download_image"));
button_config.onclick = function(){
click("batchDownloadImage");
};
// 一括ダウンロード(ユーザー)
var button_config = new UI_LineButton(_menu_window,_i18n.getMessage("context_menu_batch_download_user"));
button_config.onclick = function(){
click("batchDownloadUser");
};
new UI_Separator(_menu_window);
// 現在のページの設定を編集
var button_config = new UI_LineButton(_menu_window,_i18n.getMessage("context_menu_pageexpand_config_current_page"));
button_config.onclick = function(){
click("configCurrentPage");
};
// 掲示板拡張の設定
if(project.getEnableExpandBbs()){
var button_config = new UI_LineButton(_menu_window,_i18n.getMessage("context_menu_pageexpand_config_current_bbs"));
button_config.onclick = function(){
click("configCurrentBbs");
};
}
new UI_Separator(_menu_window);
// PageExpand の実行
if(!(project.getEnableStartup())){
var button_execute_pageexpand = new UI_LineButton(_menu_window,_i18n.getMessage("context_menu_pageexpand_execute"));
button_execute_pageexpand.onclick = function(){
click("executePageExpand");
};
}
// PageExpand の中止
var button_abort_pageexpand = new UI_LineButton(_menu_window,_i18n.getMessage("context_menu_pageexpand_abort"));
button_abort_pageexpand.onclick = function(){
click("abortPageExpand");
};
// PageExpand デバッグ
var button_execute_debug = new UI_LineButton(_menu_window,_i18n.getMessage("context_menu_pageexpand_debug"));
button_execute_debug.onclick = function(){
click("executeDebug");
};
}
// ------------------------------
// プライベート変数
// ------------------------------
var _i18n;
// ------------------------------
// 初期化
// ------------------------------
(function(){
// プロジェクト読み込み
projectLoad(function(e){
// ロケール
_i18n = new InternationalMessage(page_expand_project.getLanguage());
initialize();
});
})();
}
// ------------------------------
// DOM オブジェクトの解析(ルート)
// ------------------------------
function DomNodeAnalyzeRoot(node){
var w;
var o;
var p;
var n;
var i = 0;
var c = 0;
var m = 100;
var q = new Object();
var nodes = node.childNodes;
q.p = q;
q.n = q;
// 解析無効化
w = analyze_work_dictionary.getAnalyzeWork(node);
if(w){
if(w.a_inv) return;
}
// 中断
function interrupt(){
c = 0;
execute_queue.attachFirstForInsertDomNode(analyze,null);
}
// 子孫抽出
function analyze(){
while(node){
if(nodes){
while(nodes[i]){
o = {node:nodes[i]};
n = q;
p = n.p;
o.p = p;
o.n = n;
p.n = o;
n.p = o;
i++;
c++;
if(c > m){
interrupt();
return;
}
}
}
switch(node.nodeType){
case 1:
execute_queue.attachForAnalyzeElement(DomNodeAnalyzePhaseAnalyzeElement,node);
break;
case 3:
DomNodeAnalyzePhaseAnalyzeTextNode(node);
break;
}
if(!(window.addEventListener)){
DomNodeSetInserted(node);
}
o = q.n;
p = o.p;
n = o.n;
p.n = n;
n.p = p;
node = o.node;
if(node){
i = 0;
nodes = node.childNodes;
// 解析無効化
w = analyze_work_dictionary.getAnalyzeWork(node);
if(w){
if(w.a_inv){
nodes = null;
}
}
}
c++;
if(c > m){
interrupt();
return;
}
}
}
analyze();
}
// ------------------------------
// エレメントの解析フェーズ
// ------------------------------
function DomNodeAnalyzePhaseAnalyzeElement(node){
// ゲスト検出
if(analyze_work_dictionary.verifyGuest(node)){
return;
}
// クローン検出
if(analyze_work_dictionary.verifyClone(node)){
// スクロール補正
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeRemoveElementBefore(node);
DomNodeRemove(node);
revise_scroll.executeRemoveElementAfter(node);
return;
}
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(node);
if(!work){
// 解析ワーク作成
work = AnalyzeWorkCreate(node);
}
if(!AnalyzeWorkGetInitializedObserverElement(work)){
// ------------------------------
// アンカー
// ------------------------------
if(node.tagName == "A"){
// 要素を監視
AnalyzeWorkObserveElement(work);
// アドレス変更監視
var observer_modify_element = document_observer_modify_node.createElement();
AnalyzeWorkSetObserverModifyAnchor(work,observer_modify_element);
observer_modify_element.setElement(node,"href");
observer_modify_element.setFunction(function (){
// 修正カウンタ加算
AnalyzeWorkAddModifyCount(work);
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
if(event_dispatcher){
// イベント発火
event_dispatcher.dispatchEvent("anchor_href_change",null);
event_dispatcher.dispatchEvent("release",null);
}
// 解析状況をクリア
AnalyzeWorkClearAnalyzedReplacementToAnchor(work);
AnalyzeWorkClearAnalyzedReplacementToLink(work);
AnalyzeWorkClearAnalyzedExpandShortUrl(work);
AnalyzeWorkClearAnalyzedExpandInlineText(work);
AnalyzeWorkClearAnalyzedExpandThumbnailImage(work);
AnalyzeWorkClearAnalyzedExpandPopupImage(work);
AnalyzeWorkClearAnalyzedExpandInlineSound(work);
AnalyzeWorkClearAnalyzedExpandInlineVideo(work);
AnalyzeWorkClearAnalyzedExpandInlineIframe(work);
AnalyzeWorkClearExpandUrl(work);
AnalyzeWorkClearExpandContentType(work);
// 再解析
DomNodeAnalyzePhaseAnalyzeElement(node);
});
// 破棄イベント
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var event_handler = event_dispatcher.createEventHandler("destructor");
event_handler.setFunction(function(){
// アドレス変更監視を破棄
if(observer_modify_element){
observer_modify_element.release();
observer_modify_element = null;
AnalyzeWorkClearObserverModifyAnchor(work);
}
});
// アンカー要素を登録
AnalyzeWorkSetAnchorElement(work,node);
// ------------------------------
// インラインフレーム
// ------------------------------
}else if(node.tagName == "IFRAME"){
// 要素を監視
AnalyzeWorkObserveElement(work);
}
}
var param = {
modify:AnalyzeWorkGetModifyCount(work),
work:work
};
// ------------------------------
// アドレスコレクション
// ------------------------------
ElementAnalyzeAddressCollection(param);
// ------------------------------
// インラインフレーム内コンテンツ
// ------------------------------
if(1){
// 解析済みチェック
if(!AnalyzeWorkGetAnalyzedExpandIframeContent(work)){
AnalyzeWorkSetAnalyzedExpandIframeContent(work);
execute_queue.attachForExpandElement(ElementAnalyzePhaseExpandIframeContent,param);
}
}
// ------------------------------
// 掲示板解析
// ------------------------------
if(project.getEnableExpandBbs()){
if(expand_bbs.initialized){
if(expand_bbs.enable){
execute_queue.attachForExpandBbs(ElementAnalyzeBbs,param);
}
}else{
expand_bbs.node_queue.push(param);
}
}
// ------------------------------
// アンカーを置換
// ------------------------------
if(project.getEnableReplacementToAnchor()){
execute_queue.attachForExpandElement(ElementAnalyzeReplacementToAnchor,param);
}else{
// 短縮URL展開関連のフェーズへ
ElementAnalyzePhaseExpandShortUrl(param);
}
// ------------------------------
// エレメントの置換
// ------------------------------
if(project.getEnableReplacementToElement()){
execute_queue.attachForExpandElement(ElementAnalyzeReplacementToElement,param);
}else{
// 縮小画像のポップアップのフェーズへ
ElementAnalyzePhasePopupReducedImage(param);
}
}
// ------------------------------
// テキストノードの解析フェーズ
// ------------------------------
function DomNodeAnalyzePhaseAnalyzeTextNode(node){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(node);
if(!work){
// 解析ワーク作成
work = AnalyzeWorkCreate(node);
}
var param = {
modify:AnalyzeWorkGetModifyCount(work),
work:work
};
// ------------------------------
// テキストの置換
// ------------------------------
if(project.getEnableReplacementToText()){
execute_queue.attachForAnalyzeTextNode(ElementAnalyzeReplacementToText,param);
}else{
// ハイパーリンク化のフェーズへ
ElementAnalyzePhaseMakeLinkToText(param);
}
}
// ------------------------------
// エレメントの解析フェーズ(短縮URLの展開)
// ------------------------------
function ElementAnalyzePhaseExpandShortUrl(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
// ------------------------------
// 短縮 URL の展開
// ------------------------------
if(project.getEnableExpandShortUrl()){
execute_queue.attachForExpandElement(ElementAnalyzeExpandShortUrl,param);
}else{
// ハイパーリンク展開関連のフェーズへ
ElementAnalyzePhaseReplacementToLink(param);
}
}
// ------------------------------
// エレメントの解析フェーズ(アンカーの置換)
// ------------------------------
function ElementAnalyzePhaseReplacementToAnchor(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
// ------------------------------
// アンカーを置換
// ------------------------------
if(project.getEnableReplacementToAnchor()){
execute_queue.attachForExpandElement(ElementAnalyzeReplacementToAnchor,param);
}else{
// ハイパーリンク展開関連のフェーズへ
ElementAnalyzePhaseReplacementToLink(param);
}
}
// ------------------------------
// エレメントの解析フェーズ(ハイパーリンクの置換)
// ------------------------------
function ElementAnalyzePhaseReplacementToLink(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
// ------------------------------
// アンカーを置換
// ------------------------------
if(project.getEnableReplacementToLink()){
execute_queue.attachForExpandElement(ElementAnalyzeReplacementToLink,param);
}else{
// 展開関連のフェーズへ
execute_queue.attachForExpandElement(ElementAnalyzePhaseExpand,param);
}
}
// ------------------------------
// エレメントの解析フェーズ(ハイパーリンク化)
// ------------------------------
function ElementAnalyzePhaseMakeLinkToText(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
// ------------------------------
// テキストのハイパーリンク化
// ------------------------------
if(project.getEnableMakeLinkToText()){
execute_queue.attachForAnalyzeTextNode(ElementAnalyzeMakeLinkToText,param);
}
}
// ------------------------------
// エレメントの解析フェーズ(展開関連)
// ------------------------------
function ElementAnalyzePhaseExpand(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var anchor = AnalyzeWorkGetAnchorElement(work);
if(!anchor) return;
// アンカー
if(anchor.tagName != "A") return;
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
// 実行対象外のタグ
var selector_result = ElementMatchesSelector(element,"head *,script *,style *");
if(selector_result === undefined){
var node = element;
var illegal = {HEAD:1,SCRIPT:1,STYLE:1};
while(node){
if(illegal[node.tagName]) return;
node = node.parentNode;
}
}else if(selector_result){
return;
}
// ------------------------------
// アドレス
// ------------------------------
if(!AnalyzeWorkGetExpandUrl(work)){
AnalyzeWorkSetExpandUrl(work,anchor.href);
}
// ------------------------------
// テキストの展開
// ------------------------------
if(project.getEnableExpandText()){
// 解析済みチェック
if(!AnalyzeWorkGetAnalyzedExpandInlineText(work)){
AnalyzeWorkSetAnalyzedExpandInlineText(work);
// 実行キューに登録
execute_queue.attachForExpandElement(ElementExpandInlineText,param);
}
}
// ------------------------------
// 画像の展開
// ------------------------------
if(project.getEnableExpandImage()){
// 解析済みチェック
if(!AnalyzeWorkGetAnalyzedExpandThumbnailImage(work)){
AnalyzeWorkSetAnalyzedExpandThumbnailImage(work);
if(project.getEnableThumbnailImage()){
// 実行キューに登録
execute_queue.attachForExpandElement(ElementExpandThumbnailImage,param);
}
}
// 解析済みチェック
if(!AnalyzeWorkGetAnalyzedExpandPopupImage(work)){
AnalyzeWorkSetAnalyzedExpandPopupImage(work);
if(project.getEnablePopupImage()){
// 実行キューに登録
execute_queue.attachForExpandElement(ElementExpandPopupImage,param);
}
}
}
// ------------------------------
// サウンドの展開
// ------------------------------
if(project.getEnableExpandSound()){
// 解析済みチェック
if(!AnalyzeWorkGetAnalyzedExpandInlineSound(work)){
AnalyzeWorkSetAnalyzedExpandInlineSound(work);
// 実行キューに登録
execute_queue.attachForExpandElement(ElementExpandInlineSound,param);
}
}
// ------------------------------
// ビデオの展開
// ------------------------------
if(project.getEnableExpandVideo()){
// 解析済みチェック
if(!AnalyzeWorkGetAnalyzedExpandInlineVideo(work)){
AnalyzeWorkSetAnalyzedExpandInlineVideo(work);
// 実行キューに登録
execute_queue.attachForExpandElement(ElementExpandInlineVideo,param);
}
}
// ------------------------------
// インラインの展開
// ------------------------------
if(project.getEnableExpandIframe()){
// 解析済みチェック
if(!AnalyzeWorkGetAnalyzedExpandInlineIframe(work)){
AnalyzeWorkSetAnalyzedExpandInlineIframe(work);
// 実行キューに登録
execute_queue.attachForExpandElement(ElementExpandInlineIframe,param);
}
}
}
// ------------------------------
// エレメントの解析フェーズ(縮小画像のポップアップ)
// ------------------------------
function ElementAnalyzePhasePopupReducedImage(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
// ------------------------------
// 縮小画像を解析
// ------------------------------
if(project.getEnablePopupReducedImage()){
execute_queue.attachForExpandElement(ElementAnalyzePopupReducedImage,param);
}
// ------------------------------
// アンカーを置換
// ------------------------------
var element = AnalyzeWorkGetDomNode(work);
if(AnalyzeWorkGetOverrodeAnchorElement(work) && AnalyzeWorkGetAnchorElement(work)){
if(project.getEnableReplacementToAnchor()){
execute_queue.attachForExpandElement(ElementAnalyzeReplacementToAnchor,param);
}else{
// 短縮URL展開関連のフェーズへ
ElementAnalyzePhaseExpandShortUrl(param);
}
}
}
// ------------------------------
// エレメントの解析フェーズ(インラインフレーム内コンテンツの展開)
// ------------------------------
function ElementAnalyzePhaseExpandIframeContent(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
// インラインフレーム
if(element.tagName != "IFRAME") return;
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
ElementExpandIframeContent(param);
}
// ------------------------------
// エレメントの解析(アドレスコレクション)
// ------------------------------
function ElementAnalyzeAddressCollection(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var tag_name = element.tagName;
if(tag_name == "IMG"){
if(element.src.search(new RegExp("^(http|https)://")) == 0){
// ------------------------------
// イメージのアドレスを調べる
// ------------------------------
if(project.getDisableSameThumbnailImage()){
if(element.src){
address_collection.addAddress("image",element.src);
}
}
// ------------------------------
// ダウンロードリストに登録
// ------------------------------
var item = download_list_image.createItem();
item.setURL(element.src);
item.setFileName(element.src);
}
}
// ------------------------------
// サウンドのアドレスを調べる
// ------------------------------
if(project.getDisableSameInlineSound()){
if(tag_name == "AUDIO"){
if(element.src){
address_collection.addAddress("sound",element.src);
}
}
}
// ------------------------------
// ビデオのアドレスを調べる
// ------------------------------
if(project.getDisableSameInlineVideo()){
if(tag_name == "EMBED"){
if(element.src){
address_collection.addAddress("video",element.src);
}
}
if(tag_name == "OBJECT"){
if(element.src){
address_collection.addAddress("video",element.src);
}
}
if(tag_name == "IFRAME"){
if(element.src){
address_collection.addAddress("video",element.src);
}
}
}
// ------------------------------
// インラインフレームのアドレスを調べる
// ------------------------------
if(project.getDisableSameInlineIframe()){
if(tag_name == "IFRAME"){
if(element.src){
address_collection.addAddress("iframe",element.src);
}
}
}
}
// ------------------------------
// エレメントの解析(エレメント置換用)
// ------------------------------
function ElementAnalyzeReplacementToElement(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
ElementReplacementToElement(param);
}
// ------------------------------
// エレメントの解析(テキスト置換用)
// ------------------------------
function ElementAnalyzeReplacementToText(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var text_node = AnalyzeWorkGetDomNode(work);
var element = text_node.parentNode;
if(!element) return;
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
// 実行対象外のタグ
var selector_result = ElementMatchesSelector(element,"script *,style *,script,style");
if(selector_result === undefined){
var node = text_node;
var illegal = {SCRIPT:1,STYLE:1};
while(node){
if(illegal[node.tagName]) return;
node = node.parentNode;
}
}else if(selector_result){
return;
}
ElementReplacementToText(param);
}
// ------------------------------
// エレメントの解析(アンカー置換用)
// ------------------------------
function ElementAnalyzeReplacementToAnchor(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var anchor = AnalyzeWorkGetAnchorElement(work);
if(!anchor) return;
// アンカー
if(anchor.tagName != "A") return;
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
// 実行対象外のタグ
var selector_result = ElementMatchesSelector(element,"head *,script *,style *");
if(selector_result === undefined){
var node = element;
var illegal = {HEAD:1,SCRIPT:1,STYLE:1};
while(node){
if(illegal[node.tagName]) return;
node = node.parentNode;
}
}else if(selector_result){
return;
}
if((anchor.name) && !(anchor.href)) return;
ElementReplacementToAnchor(param);
}
// ------------------------------
// エレメントの解析(リンク置換用)
// ------------------------------
function ElementAnalyzeReplacementToLink(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var anchor = AnalyzeWorkGetAnchorElement(work);
if(!anchor) return;
// アンカー
if(anchor.tagName != "A") return;
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
// 実行対象外のタグ
var selector_result = ElementMatchesSelector(element,"head *,script *,style *");
if(selector_result === undefined){
var node = element;
var illegal = {HEAD:1,SCRIPT:1,STYLE:1};
while(node){
if(illegal[node.tagName]) return;
node = node.parentNode;
}
}else if(selector_result){
return;
}
if(!(anchor.href)) return;
ElementReplacementToLink(param);
}
// ------------------------------
// エレメントの解析(テキストからハイパーリンクを生成用)
// ------------------------------
function ElementAnalyzeMakeLinkToText(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var text_node = AnalyzeWorkGetDomNode(work);
var element = text_node.parentNode;
if(!element) return;
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
// 実行対象外のタグ
var selector_result = ElementMatchesSelector(element,"script *,style *,a *,textarea *,script,style,a,textarea");
if(selector_result === undefined){
var node = text_node;
var illegal = {SCRIPT:1,STYLE:1,A:1,TEXTAREA:1};
while(node){
if(illegal[node.tagName]) return;
node = node.parentNode;
}
}else if(selector_result){
return;
}
ElementMakeLinkToText(param);
}
// ------------------------------
// エレメントの解析(短縮 URL の展開用)
// ------------------------------
function ElementAnalyzeExpandShortUrl(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var anchor = AnalyzeWorkGetAnchorElement(work);
if(!anchor) return;
// アンカー
if(anchor.tagName != "A") return;
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
// 実行対象外のタグ
var selector_result = ElementMatchesSelector(element,"head *,script *,style *");
if(selector_result === undefined){
var node = element;
var illegal = {HEAD:1,SCRIPT:1,STYLE:1};
while(node){
if(illegal[node.tagName]) return;
node = node.parentNode;
}
}else if(selector_result){
return;
}
if(!(anchor.href)) return;
ElementExpandShortUrl(param);
}
// ------------------------------
// エレメントの解析(縮小画像のポップアップ用)
// ------------------------------
function ElementAnalyzePopupReducedImage(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
// イメージ
if(element.tagName != "IMG") return;
// document に未登録
if(!DomNodeGetAttachedDocument(element)) return;
ElementPopupReducedImage(param);
}
// ------------------------------
// エレメントの解析(掲示板用)
// ------------------------------
function ElementAnalyzeBbs(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var dom_node = AnalyzeWorkGetDomNode(work);
// document に未登録
if(!DomNodeGetAttachedDocument(dom_node)) return;
// 実行対象外のタグ
var selector_result = ElementMatchesSelector(dom_node,"head *,script *,style *");
if(selector_result === undefined){
var node = dom_node;
var illegal = {HEAD:1,SCRIPT:1,STYLE:1};
while(node){
if(illegal[node.tagName]) return;
node = node.parentNode;
}
}else if(selector_result){
return;
}
ElementExpandBbs(param);
}
// ------------------------------
// エレメントを置換
// ------------------------------
function ElementReplacementToElement(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var completed = false;
function response(result){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(completed) return;
completed = true;
if(result.url){
// ------------------------------
// アンカーのオーバーライド
// ------------------------------
if(!AnalyzeWorkGetOverrodeAnchorElement(work)){
// アンカーを作成
var anchor = DocumentCreateElement("a");
anchor.href = result.url;
// アンカー要素を登録
AnalyzeWorkSetAnchorElement(work,anchor);
// オーバーライド済み
AnalyzeWorkSetOverrodeAnchorElement(work);
}
// ------------------------------
// 要素を監視
// ------------------------------
AnalyzeWorkObserveElement(work);
}
// 縮小画像のポップアップのフェーズへ
ElementAnalyzePhasePopupReducedImage(param);
}
// 解析済みチェック
if(AnalyzeWorkGetAnalyzedReplacementToElement(work)){
return;
}
AnalyzeWorkSetAnalyzedReplacementToElement(work);
// コールバック関数を実行
project.executeScriptReplacementToElement(element,response);
}
// ------------------------------
// テキストを置換
// ------------------------------
function ElementReplacementToText(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var text_node = AnalyzeWorkGetDomNode(work);
var completed = false;
function response(){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(completed) return;
completed = true;
// ハイパーリンク化のフェーズへ
ElementAnalyzePhaseMakeLinkToText(param);
}
// 解析済みチェック
if(AnalyzeWorkGetAnalyzedReplacementToText(work)){
return;
}
AnalyzeWorkSetAnalyzedReplacementToText(work);
// コールバック関数を実行
project.executeScriptReplacementToText(text_node,response);
}
// ------------------------------
// アンカーを置換
// ------------------------------
function ElementReplacementToAnchor(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var anchor = AnalyzeWorkGetAnchorElement(work);
var completed = false;
function response(){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(completed) return;
completed = true;
// 短縮URL展開済み
if(AnalyzeWorkGetAnalyzedExpandShortUrl(work)){
// ハイパーリンク展開関連のフェーズへ
ElementAnalyzePhaseReplacementToLink(param);
}else{
// 短縮URL展開関連のフェーズへ
ElementAnalyzePhaseExpandShortUrl(param);
}
}
// 解析済みチェック
if(AnalyzeWorkGetAnalyzedReplacementToAnchor(work)){
return;
}
AnalyzeWorkSetAnalyzedReplacementToAnchor(work);
// コールバック関数を実行
project.executeScriptReplacementToAnchor(anchor,work.event_dispatcher,response);
}
// ------------------------------
// リンクを置換
// ------------------------------
function ElementReplacementToLink(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var anchor = AnalyzeWorkGetAnchorElement(work);
var replacement_to_link = project.getReplacementToLink(anchor);
var completed = false;
function response(r){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(completed) return;
completed = true;
var obj = r.getResult();
//リンクの変更をアンカーに反映する
if(r.getEnableReflectToAnchor()){
if(obj.result){
var monitor_element = AnalyzeWorkGetObserverModifyAnchor(work);
if(monitor_element){
monitor_element.setBaseValue(obj.url);
}
anchor.href = obj.url;
}
}
if(obj.result){
if(obj.url){
AnalyzeWorkSetExpandUrl(work,obj.url);
}
if(obj.content_type){
try{
var a = obj.content_type;
var i;
var num = a.length;
for(i=0;i<num;i++){
if(typeof(a[i]) == "string"){
AnalyzeWorkAddContentType(work,a[i]);
}
}
}catch(e){
}
}
}
// 展開関連のフェーズへ
execute_queue.attachForExpandElement(ElementAnalyzePhaseExpand,param);
}
// 解析済みチェック
if(AnalyzeWorkGetAnalyzedReplacementToLink(work)){
return;
}
AnalyzeWorkSetAnalyzedReplacementToLink(work);
// 結果を取得
replacement_to_link.getResult(response);
}
// ------------------------------
// テキストからハイパーリンクを生成
// ------------------------------
function ElementMakeLinkToText(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var text_node = AnalyzeWorkGetDomNode(work);
var completed = false;
function response(){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(completed) return;
completed = true;
}
// 解析済みチェック
if(AnalyzeWorkGetAnalyzedMakeLinkToText(work)){
return;
}
AnalyzeWorkSetAnalyzedMakeLinkToText(work);
// コールバック関数を実行
project.executeScriptMakeLinkToText(text_node,response);
}
// ------------------------------
// 短縮 URL の展開
// ------------------------------
function ElementExpandShortUrl(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var anchor = AnalyzeWorkGetAnchorElement(work);
var completed = false;
function response(result){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(completed) return;
completed = true;
if(result){
// 解析フラグをクリア
AnalyzeWorkClearAnalyzedReplacementToAnchor(work);
// アンカーの置換フェーズへ
execute_queue.attachForExpandElement(ElementAnalyzePhaseReplacementToAnchor,param);
}else{
// ハイパーリンク展開関連のフェーズへ
ElementAnalyzePhaseReplacementToLink(param);
}
}
// 解析済みチェック
if(AnalyzeWorkGetAnalyzedExpandShortUrl(work)){
return;
}
AnalyzeWorkSetAnalyzedExpandShortUrl(work);
// アドレスチェック
var url = anchor.href;
if(!url){
response(false);
return;
}
// フィルタ
if(project.checkExpandShortUrl(url)){
var loader = new Loader();
// ロード完了時に実行されるイベント
loader.onload = function(v){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var monitor_element = AnalyzeWorkGetObserverModifyAnchor(work);
if(monitor_element){
monitor_element.setBaseValue(v);
}
// 取得結果をセット
anchor.href = v;
// 終了通知
if(url != v){
response(true);
}else{
response(false);
}
};
// ロード失敗時に実行されるイベント
loader.onerror = function(){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
// 終了通知
response(false);
};
loader.setURL(url);
loader.setSendData(null);
loader.loadFinalURL();
}else{
response(false);
}
}
// ------------------------------
// テキストの展開
// ------------------------------
function ElementExpandInlineText(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
var content_type = AnalyzeWorkGetContentType(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
function response_allow(param){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(!(param.result)){
complete();
return;
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var text_area = null;
var text_area_analyze_work = null;
var text_url = url;
var event_handler = null;
var observer_remove = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// テキストエリアを破棄
function releaseTextarea(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// アドレスの登録を外す
if(text_url){
address_collection.removeAddress("text",text_url);
text_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
if(text_area_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(text_area_analyze_work);
text_area_analyze_work = null;
}
// テキストエリアを外す
if(text_area){
DomNodeRemove(text_area);
text_area = null;
}
}
// 重複チェック
if(project.getDisableSameInlineText()){
if(address_collection.hasAddress("text",text_url)){
text_url = null;
releaseTextarea();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("text",text_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseTextarea);
// テキストの読み込み
loader = new Loader();
loader.onload = function(str){
complete();
// テキストエリアを生成
text_area = DocumentCreateElement("textarea");
text_area.value = str;
// スタイルをセット
ElementSetStyle(text_area,project.getStyleSheetExpandTextInline());
// 解析ワーク作成
text_area_analyze_work = AnalyzeWorkCreate(text_area);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(text_area_analyze_work,attach_options);
// テキストエリアのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(text_area);
observer_remove.setFunction(dispatchEventRelease);
function responseInsert(){
}
// コールバック関数を実行
project.executeScriptInsertInlineText(element,text_area,work.event_dispatcher,responseInsert);
};
loader.onerror = function(){
complete();
};
loader.setMethod("GET");
loader.setURL(text_url);
loader.loadText();
}
// コールバック関数を実行
project.executeScriptAllowInlineText(element,url,content_type,response_allow);
}
// ------------------------------
// サムネイルイメージ
// ------------------------------
function ElementExpandThumbnailImage(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
var content_type = AnalyzeWorkGetContentType(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
function response_allow(param){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(!(param.result)){
complete();
return;
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var popup_image = null;
var thumbnail_image = null;
var thumbnail_analyze_work = null;
var thumbnail_url = url;
var event_handler = null;
var observer_remove = null;
var limitter_element = null;
var notify_element = null;
// サムネイルイメージを破棄(ElementLimiter 用)
function releaseThumbnailImageForElementLimiter(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// ポップアップイメージを破棄
releasePopupImage();
// アドレスの登録を外す
if(thumbnail_url){
address_collection.removeAddress("image",thumbnail_url);
thumbnail_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 通知破棄
if(notify_element){
notify_element.release();
notify_element = null;
}
// 解析辞書除外
if(thumbnail_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(thumbnail_analyze_work);
thumbnail_analyze_work = null;
}
// サムネイルイメージを破棄
if(thumbnail_image){
var revise_scroll = new DocumentReviseScroll();
revise_scroll.executeRemoveElementBefore(thumbnail_image);
DomNodeRemove(thumbnail_image);
revise_scroll.executeRemoveElementAfter(thumbnail_image);
thumbnail_image = null;
}
initializeLimitterElement();
}
// ポップアップイメージを破棄
function releasePopupImage(e){
// ポップアップイメージを破棄
if(popup_image){
popup_image.suicide();
popup_image = null;
}
}
// サムネイルイメージを破棄
function releaseThumbnailImage(e){
releaseThumbnailImageForElementLimiter();
AnalyzeWorkClearPopupImage(work);
if(limitter_element){
limitter_element.release();
limitter_element = null;
}
}
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// 制限初期化
function initializeLimitterElement(){
if(limitter_element){
limitter_element.onattach = function(){
createThumbnailImage();
};
limitter_element.onremove = function(){
releaseThumbnailImageForElementLimiter();
};
limitter_element.setElementHitArea(element);
limitter_element.setEnablePreload(project.getEnablePreLoadThumbnailImage());
}
}
// サムネイルイメージを登録
function createThumbnailImage(e){
if(project.getEnableLoadNotifyExpandImage()){
notify_element = notify_progress.createElement();
}
if(notify_element){
notify_element.setElementHitArea(element);
notify_element.setNotify(NotifyProgress.NOTIFY_TYPE_LOADING);
}
// 画像の読み込み
loader = new Loader();
loader.onload = function(image){
thumbnail_image = image;
// 解析ワーク作成
thumbnail_analyze_work = AnalyzeWorkCreate(thumbnail_image);
// 解析済み
AnalyzeWorkSetAnalyzedPopupReducedImage(thumbnail_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(thumbnail_analyze_work,attach_options);
complete();
// 成功通知
if(notify_element){
notify_element.setNotify(NotifyProgress.NOTIFY_TYPE_COMPLETE);
notify_element.release();
notify_element = null;
}
// ダウンロードリストに登録
var item = download_list_image.createItem();
item.setURL(thumbnail_url);
item.setFileName(thumbnail_url);
// 画像サイズをセット
var image_size = ImageGetNaturalSize(thumbnail_image);
limitter_element.setByteSize(image_size.width * image_size.height * 4);
// 古い要素を破棄
element_limitter_image.removeOldElements();
if(!thumbnail_image) return;
// スタイルをセット
ElementSetStyle(thumbnail_image,project.getStyleSheetExpandImageThumbnail());
function responseInsert(){
if(!thumbnail_image) return;
// ポップアップイメージを生成
function createPopupImage(){
// 縮小画像のポップアップ
if(project.getEnablePopupMouseoverToThumbnailImage()){
// 既存の PopupImage を全て破棄
PopupReducedImageReleaseAll(element);
// イメージを複製
var image_clone = ImageClone(thumbnail_image);
// ロード完了
ImageGetLoaded(image_clone,function(){
if(!thumbnail_image) return;
// ポップアップイメージ
popup_image = new PopupImage(image_clone);
popup_image.setElementParent(document.body);
popup_image.setElementAnchor(thumbnail_image);
popup_image.setElementHitArea(thumbnail_image);
popup_image.setElementBeginArea(thumbnail_image);
popup_image.setOriginalURL(thumbnail_url);
AnalyzeWorkSetPopupImage(work,popup_image);
});
}
}
// イメージのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(thumbnail_image);
observer_remove.setFunction(dispatchEventRelease);
// サムネイルソース
var image_src = thumbnail_image.src;
// コールバックを変更
limitter_element.onattach = function(){
thumbnail_image.src = image_src;
createPopupImage();
};
limitter_element.onremove = function(){
thumbnail_image.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEHAAAALAAAAAABAAEAAAICRAEAOw==";
releasePopupImage();
};
limitter_element.setElementHitArea(thumbnail_image);
createPopupImage();
}
// コールバック関数を実行
project.executeScriptInsertThumbnailImage(element,thumbnail_image,work.event_dispatcher,responseInsert);
};
loader.onerror = function(){
complete();
// 失敗通知
if(notify_element){
notify_element.setNotify(NotifyProgress.NOTIFY_TYPE_ERROR);
}
};
loader.setMethod("GET");
loader.setURL(thumbnail_url);
loader.loadImage();
}
// 重複チェック
if(project.getDisableSameThumbnailImage()){
if(address_collection.hasAddress("image",thumbnail_url)){
thumbnail_url = null;
releaseThumbnailImage();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("image",thumbnail_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseThumbnailImage);
// イメージ管理
limitter_element = element_limitter_image.createElement();
initializeLimitterElement();
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptAllowThumbnailImage(element,url,content_type,response_allow);
}
// ------------------------------
// ポップアップイメージ
// ------------------------------
function ElementExpandPopupImage(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
var content_type = AnalyzeWorkGetContentType(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
function response_allow(param){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(!(param.result)){
complete();
return;
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var popup_image = null;
var begin_area = null;
var event_handler = null;
var observer_remove = null;
var limitter_element = null;
var notify_element = null;
// ポップアップイメージを破棄(ElementLimiter 用)
function releasePopupImageForElementLimiter(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// ワークを破棄
if(popup_image){
popup_image.suicide();
popup_image = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 通知破棄
if(notify_element){
notify_element.release();
notify_element = null;
}
}
// ポップアップイメージを破棄
function releasePopupImage(e){
releasePopupImageForElementLimiter(e);
AnalyzeWorkClearPopupImage(work);
if(limitter_element){
limitter_element.release();
limitter_element = null;
}
}
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// ポップアップイメージを登録
function createPopupImage(e){
if(project.getEnableLoadNotifyExpandImage()){
notify_element = notify_progress.createElement();
}
if(notify_element){
notify_element.setElementHitArea(element);
notify_element.setNotify(NotifyProgress.NOTIFY_TYPE_LOADING);
}
// 画像の読み込み
loader = new Loader();
loader.onload = function(image){
complete();
// ダウンロードリストに登録
var item = download_list_image.createItem();
item.setURL(url);
item.setFileName(url);
// 画像サイズをセット
var image_size = ImageGetNaturalSize(image);
limitter_element.setByteSize(image_size.width * image_size.height * 4);
// 古い要素を破棄
element_limitter_image.removeOldElements();
if(!loader) return;
// 1ドット画像を排除
if(image_size.width > 1){
}else if(image_size.height > 1){
}else{
releasePopupImage();
return;
}
// 画像を1つだけ保有するなら画像を開始矩形とする
(function(){
var begin_element = null;
if(element.tagName == "IMG"){
if(ElementGetVisibility(element)){
begin_element = element;
}
}
var nodes = ElementGetElementsByTagName(element,"img");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
var node = nodes[i];
if(ElementGetVisibility(node)){
if(begin_element) return;
begin_element = node;
}
}
if(begin_element){
begin_area = begin_element;
}
})();
// 矩形が画像サイズより小さいか
if(!begin_area){
var r = DomTreeGetBoundingClientRect(element);
if((r.bottom - r.top) > image_size.height){
}else if((r.right - r.left) > image_size.width){
}else{
begin_area = element;
}
}
// 既存の PopupImage を全て破棄
PopupReducedImageReleaseAll(element);
// 開始矩形エレメントを監視
if(begin_area){
observer_remove = new DomNodeObserverRemoveFromDocument(begin_area);
}
// 開始範囲のリムーブ監視
if(observer_remove){
observer_remove.setFunction(dispatchEventRelease);
}
// ポップアップイメージを作成
popup_image = new PopupImage(image);
popup_image.setElementParent(document.body);
popup_image.setElementAnchor(element);
popup_image.setElementHitArea(element);
popup_image.setElementBeginArea(begin_area);
popup_image.setOriginalURL(url);
AnalyzeWorkSetPopupImage(work,popup_image);
// 成功通知
if(notify_element){
notify_element.setNotify(NotifyProgress.NOTIFY_TYPE_COMPLETE);
notify_element.release();
notify_element = null;
}
// ポップアップ
if(ElementHitTestMousePosition(element,input_mouse.getPositionClient(),true)){
popup_image.popup();
}
};
loader.onerror = function(){
complete();
// 失敗通知
if(notify_element){
notify_element.setNotify(NotifyProgress.NOTIFY_TYPE_ERROR);
}
};
loader.setMethod("GET");
loader.setURL(url);
loader.loadImage();
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releasePopupImage);
// イメージ管理
limitter_element = element_limitter_image.createElement();
limitter_element.onattach = function(){
createPopupImage();
};
limitter_element.onremove = function(){
releasePopupImageForElementLimiter();
};
limitter_element.setElementHitArea(element);
limitter_element.setEnablePreload(project.getEnablePreLoadPopupImage());
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptAllowPopupImage(element,url,content_type,response_allow);
}
// ------------------------------
// インラインサウンド
// ------------------------------
function ElementExpandInlineSound(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
var content_type = AnalyzeWorkGetContentType(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
function response_allow(response){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(!(response.result)){
complete();
return;
}
// AudioElement
ElementExpandInlineAudioElement(param);
// SoundCloud
ElementExpandInlinePlayerSoundcloud(param);
// MixCloud
ElementExpandInlinePlayerMixcloud(param);
}
// コールバック関数を実行
project.executeScriptAllowInlineSound(element,url,content_type,response_allow);
}
// ------------------------------
// インライン AudioElement
// ------------------------------
function ElementExpandInlineAudioElement(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
var content_type = AnalyzeWorkGetContentType(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
function response_allow(param){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(!(param.result)){
complete();
return;
}
// アンセキュアチェック
if(!project.checkAllowUnsecure(url)){
complete();
return;
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var audio = null;
var audio_analyze_work = null;
var audio_url = url;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// オーディオエレメントを破棄
function releaseAudioElement(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// アドレスの登録を外す
if(audio_url){
address_collection.removeAddress("sound",audio_url);
audio_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(audio_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(audio_analyze_work);
audio_analyze_work = null;
}
// オーディオエレメントを外す
if(audio){
DomNodeRemove(audio);
audio = null;
}
}
// 重複チェック
if(project.getDisableSameInlineSound()){
if(address_collection.hasAddress("sound",audio_url)){
audio_url = null;
releaseAudioElement();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("sound",audio_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseAudioElement);
// オーディオの読み込み
loader = new Loader();
loader.onload = function(audio_element){
audio = audio_element;
// 解析ワーク作成
audio_analyze_work = AnalyzeWorkCreate(audio);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(audio_analyze_work,attach_options);
complete();
// スタイルをセット
ElementSetStyle(audio,project.getStyleSheetExpandSoundInlineAudioElement());
// オーディオエレメントのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(audio);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(audio);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!audio) return;
limitter_element = element_limitter_sound.createElement();
limitter_element.onattach = function(){
audio.preload = "metadata";
audio.src = audio_url;
audio.load();
};
limitter_element.onremove = function(){
audio.preload = "none";
audio.src = "";
audio.load();
};
limitter_element.setElementHitArea(audio);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineSound(element,audio,work.event_dispatcher,responseInsert);
};
loader.onerror = function(){
complete();
};
loader.setMethod("GET");
loader.setURL(audio_url);
loader.loadAudio();
}
// コールバック関数を実行
project.executeScriptAllowAudioElement(element,url,content_type,response_allow);
}
// ------------------------------
// インラインプレイヤー Soundcloud
// ------------------------------
function ElementExpandInlinePlayerSoundcloud(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// soundcloud.com 内では動作禁止
var deny_list = [
"*://soundcloud.com/*",
"*://*.soundcloud.com/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
// 動画を展開
function expand_player(){
// 展開処理の完了
function expand_player_complete(){
}
if(project.getVisiblePlayerFlashSoundcloud()){
(function(){
var iframe_url = "https://player.soundcloud.com/player.swf?url=" + encodeURIComponent(url);
var height = 166;
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframeFlash(e){
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("sound",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframeFlash();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineSound()){
if(address_collection.hasAddress("sound",iframe_url)){
iframe_url = null;
releaseIframeFlash();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("sound",iframe_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframeFlash);
// インラインフレームを作成
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandSoundSoundcloudInlinePlayerFlash());
if(height){
// 高さを設定
iframe.style.height = parseInt(height) + "px";
}
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(iframe);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsertFlash(){
if(!iframe) return;
limitter_element = element_limitter_sound.createElement();
limitter_element.onattach = function(){
iframe.src = iframe_url;
};
limitter_element.onremove = function(){
iframe.src = "";
};
limitter_element.setElementHitArea(iframe);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineSound(element,iframe,work.event_dispatcher,responseInsertFlash);
})();
}
if(project.getVisiblePlayerHtml5Soundcloud()){
(function(){
var iframe_url = "https://w.soundcloud.com/player/?url=" + encodeURIComponent(url);
var height = 166;
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframeHtml5(e){
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("sound",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframeHtml5();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineSound()){
if(address_collection.hasAddress("sound",iframe_url)){
iframe_url = null;
releaseIframeHtml5();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("sound",iframe_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframeHtml5);
// インラインフレームを作成
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandSoundSoundcloudInlinePlayerHtml5());
if(height){
// 高さを設定
iframe.style.height = parseInt(height) + "px";
}
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(iframe);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsertHtml5(){
if(!iframe) return;
limitter_element = element_limitter_sound.createElement();
limitter_element.onattach = function(){
iframe.src = iframe_url;
};
limitter_element.onremove = function(){
iframe.src = "";
};
limitter_element.setElementHitArea(iframe);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineSound(element,iframe,work.event_dispatcher,responseInsertHtml5);
})();
}
}
if(project.getVisiblePlayerFlashSoundcloud() || project.getVisiblePlayerHtml5Soundcloud()){
// soundcloud.com へのリンク
var allow_list = [
"(http|https)://soundcloud\\.com/.+?/.+([?]|$)"
];
num = allow_list.length;
for(i=0;i<num;i++){
if(url.match(new RegExp(allow_list[i],"i"))){
expand_player();
return;
}
}
}
// 完了
complete();
}
// ------------------------------
// インラインプレイヤー Mixcloud
// ------------------------------
function ElementExpandInlinePlayerMixcloud(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// www.mixcloud.com 内では動作禁止
var deny_list = [
"*://mixcloud.com/*",
"*://*.mixcloud.com/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
// 動画を展開
function expand_player(){
// 展開処理の完了
function expand_player_complete(){
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var iframe = null;
var iframe_analyze_work = null;
var iframe_url = null;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("sound",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
// テキストの読み込み
loader = new Loader();
loader.onload = function(str){
var m = str.match(new RegExp("<meta[^>]+name[ \n\r\t]*=[ \n\r\t]*\"twitter:player\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m){
iframe_url = m[1];
iframe_url = iframe_url.replace(new RegExp("^//"),"https://");
}
}
// アドレス取得失敗
if(!iframe_url){
releaseIframe();
return;
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineSound()){
if(address_collection.hasAddress("sound",iframe_url)){
iframe_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("sound",iframe_url);
}
// インラインフレームを作成
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandSoundMixcloudInlinePlayer());
// 高さを設定
var m = str.match(new RegExp("<meta[^>]+name[ \n\r\t]*=[ \n\r\t]*\"twitter:player:height\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i"));
if(m){
iframe.style.height = parseInt(m[1]) + "px";
}
}
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(iframe);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
limitter_element = element_limitter_sound.createElement();
limitter_element.onattach = function(){
iframe.src = iframe_url;
};
limitter_element.onremove = function(){
iframe.src = "";
};
limitter_element.setElementHitArea(iframe);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineSound(element,iframe,work.event_dispatcher,responseInsert);
};
// ロードエラー
loader.onerror = function(){
expand_player_complete();
complete();
};
loader.setMethod("GET");
loader.setURL(url);
loader.loadText();
}
if(project.getVisiblePlayerMixcloud()){
// mixcloud.com へのリンク
var allow_list = [
"^(http|https)://[^.]+\\.mixcloud\\.com/[^/]+/[^/]+(/$|[?]|$)",
"^(http|https)://i\\.mixcloud\\.com/[a-zA-Z0-9]+$"
];
num = allow_list.length;
for(i=0;i<num;i++){
if(url.match(new RegExp(allow_list[i],"i"))){
expand_player();
return;
}
}
}
// 完了
complete();
}
// ------------------------------
// インラインビデオ
// ------------------------------
function ElementExpandInlineVideo(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
var content_type = AnalyzeWorkGetContentType(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
function response_allow(response){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(!(response.result)){
complete();
return;
}
// VideoElement
ElementExpandInlineVideoElement(param);
// youtube
ElementExpandInlineVideoYoutube(param);
// nicovideo
ElementExpandInlineVideoNicovideo(param);
// ustream
ElementExpandInlineVideoUstream(param);
// dailymotion
ElementExpandInlineVideoDailymotion(param);
// vimeo
ElementExpandInlineVideoVimeo(param);
// fc2_video
ElementExpandInlineVideoFc2video(param);
// liveleak
ElementExpandInlineVideoLiveleak(param);
}
// コールバック関数を実行
project.executeScriptAllowInlineVideo(element,url,content_type,response_allow);
}
// ------------------------------
// インライン VideoElement
// ------------------------------
function ElementExpandInlineVideoElement(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
var content_type = AnalyzeWorkGetContentType(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
function response_allow(param){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(!(param.result)){
complete();
return;
}
// アンセキュアチェック
if(!project.checkAllowUnsecure(url)){
complete();
return;
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var video = null;
var video_analyze_work = null;
var video_url = url;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// ビデオエレメントを破棄
function releaseVideoElement(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// アドレスの登録を外す
if(video_url){
address_collection.removeAddress("video",video_url);
video_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(video_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(video_analyze_work);
video_analyze_work = null;
}
// ビデオエレメントを外す
if(video){
DomNodeRemove(video);
video = null;
}
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",video_url)){
video_url = null;
releaseVideoElement();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",video_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseVideoElement);
// ビデオの読み込み
loader = new Loader();
loader.onload = function(video_element){
video = video_element;
// 解析ワーク作成
video_analyze_work = AnalyzeWorkCreate(video);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(video_analyze_work,attach_options);
complete();
// スタイルをセット
ElementSetStyle(video,project.getStyleSheetExpandVideoInlineVideoElement());
// ビデオエレメントのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(video);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(video);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!video) return;
limitter_element = element_limitter_video.createElement();
limitter_element.onattach = function(){
video.preload = "metadata";
video.src = video_url;
video.load();
};
limitter_element.onremove = function(){
video.preload = "none";
video.src = "";
video.load();
};
limitter_element.setElementHitArea(video);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,video,work.event_dispatcher,responseInsert);
};
loader.onerror = function(){
complete();
};
loader.setMethod("GET");
loader.setURL(video_url);
loader.loadVideo();
}
// コールバック関数を実行
project.executeScriptAllowVideoElement(element,url,content_type,response_allow);
}
// ------------------------------
// インラインビデオ youtube
// ------------------------------
function ElementExpandInlineVideoYoutube(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// youtube.com 内では動作禁止
var deny_list = [
"*://*.youtube.com/*",
"*://youtube.com/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
// 動画を展開
function expand_video(url){
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var iframe_url = url;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("video",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",iframe_url)){
iframe_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",iframe_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
// インラインフレームを作成
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoYoutubeInlineVideo());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(iframe);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
limitter_element = element_limitter_video.createElement();
limitter_element.onattach = function(){
iframe.src = iframe_url;
};
limitter_element.onremove = function(){
iframe.src = "";
};
limitter_element.setElementHitArea(iframe);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
}
function getHashQuery(url){
var q = new Object();
var m = url.match(new RegExp("[#](.*?)([?]|$)"));
if(!m) return q;
var a = m[1].split('&');
var i;
var num = a.length;
for(i=0;i<num;i++){
var b = a[i].split('=');
if(b.length == 2){
q[b[0]] = b[1];
}
}
return q;
}
function getIframeURL(url,v){
var q = StringGetQuery(url);
var h = getHashQuery(url);
var start = q["t"] || h["t"];
if(start){
if(!start.match(/[0-9]+/)){
start = "";
}
}
var protocol = project.getSecureCurrent() ? "https" : "http";
var iframe_url = protocol + "://www.youtube-nocookie.com/embed/" + v;
if(start) iframe_url += "?start=" + start;
return iframe_url;
}
if(project.getVisibleVideoYoutube()){
// youtube へのリンク
var allow_list_query = [
"*://www.youtube.com/watch?*",
"*://www.youtube.com/watch_popup?*",
"*://m.youtube.com/watch?*",
"*://m.youtube.com/#/watch?*"
];
num = allow_list_query.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_query[i])){
var query = StringGetQuery(url);
if(query.v){
expand_video(getIframeURL(url,query.v));
return;
}
}
}
// 短縮 URL など
var allow_list_regexp = [
"(http|https)://www\\.youtube\\.com/v/",
"(http|https)://youtu\\.be/"
];
num = allow_list_regexp.length;
for(i=0;i<num;i++){
if(url.match(new RegExp(allow_list_regexp[i],"i"))){
if(RegExp.rightContext.match(new RegExp("^([a-zA-Z0-9]+)","i"))){
expand_video(getIframeURL(url,RegExp.$1));
return;
}
}
}
}
// 完了
complete();
}
// ------------------------------
// インラインビデオ nicovideo
// ------------------------------
function ElementExpandInlineVideoNicovideo(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// アンセキュアチェック
if(!project.checkAllowUnsecure(url)){
complete();
return;
}
// .nicovideo.jp 内では動作禁止
var deny_list = [
"*://nicovideo.jp/*",
"*://*.nicovideo.jp/*",
"*://niconico.com/*",
"*://*.niconico.com/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
// 動画を展開
function expand_video(video_id,language){
(function(){
// 展開処理の完了
function expand_video_complete(){
// ビデオサムネイル展開
if(project.getVisibleThumbnailVideoNicovideo()){
expand_thumbnail_video(video_id,language);
}
}
var script_url = "http://ext.nicovideo.jp/thumb_watch/" + video_id;
if(language){
script_url += "?cc=" + language;
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var video = null;
var video_analyze_work = null;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// エレメントを破棄
function releaseElement(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// アドレスの登録を外す
if(script_url){
address_collection.removeAddress("video",script_url);
script_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(video_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(video_analyze_work);
video_analyze_work = null;
}
// エレメントを外す
if(video){
DomNodeRemove(video);
video = null;
}
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",script_url)){
script_url = null;
releaseElement();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",script_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseElement);
// テキストの読み込み
loader = new Loader();
loader.onload = function(str){
var num = str.length;
// url を抽出
var player_url;
(function(){
var w = "Nicovideo.playerUrl = ";
var s = str.indexOf(w);
if(s < 0){
// 未対応
return;
}
s += w.length;
// コーテーション開始
while(s < num){
w = str.charAt(s);
if(w == '\'') break;
if(w == '\"') break;
s++;
}
if(s >= num) return;
s += 1;
// コーテーション終了
var c;
var e = s;
while(e < num){
c = str.charAt(e);
if(c == w) break;
if(c == '\\'){
e++;
}
e++;
}
if(e >= num) return;
player_url = str.substring(s,e);
})();
// flashvars を抽出
var flashvars = "";
var variables = new Object();
(function(){
var w = "new Nicovideo.MiniPlayer";
var s = str.lastIndexOf(w);
if(s < 0){
// 未対応
return;
}
s += w.length;
// 中括弧開始
while(s < num){
if(str.charAt(s) == '{') break;
s++;
}
if(s >= num) return;
s += 1;
// 中括弧終了
var c;
var check = false;
var e = s;
while(e < num){
c = str.charAt(e);
if(check){
if(c == w){
check = false;
}else if(c == '\\'){
e++;
}
}else{
if(c == '}') break;
if(c == '\'' || c == '\"'){
w = c;
check = true;
}
}
e++;
}
if(e >= num) return;
var buf = str.substring(s,e);
buf = buf.replace(new RegExp("\\\\/","gi"),"/");
buf = buf.replace(new RegExp("\\\\u","gi"),"%u");
var buf_num = buf.length;
var p = 0;
var step = 0;
var name;
while(p < buf_num){
switch(step){
case 0:
w = buf.charAt(p);
if((w == '\'') || (w == '\"')){
step = 1;
s = p + 1;
}
break;
case 1:
c = buf.charAt(p);
if(c == '\\'){
p += 1;
}else if(c == w){
step = 2;
name = buf.substring(s,p);
}
break;
case 2:
c = buf.charAt(p);
if(c == ':'){
step = 3;
}
break;
case 3:
w = buf.charAt(p);
if((w == '\'') || (w == '\"')){
step = 4;
s = p + 1;
}
break;
case 4:
c = buf.charAt(p);
if(c == '\\'){
p += 1;
}else if(c == w){
step = 5;
flashvars += name + "=" + buf.substring(s,p);
variables[name] = buf.substring(s,p);
}
break;
case 5:
c = buf.charAt(p);
if(c == ','){
flashvars += "&";
step = 0;
}
break;
}
p ++;
}
// アンエスケープ
var unescape_list = [
"title",
"description",
"thumbTitle",
"thumbDescription",
"category",
"categoryGroup"
];
var i;
var list_num = unescape_list.length;
for(i=0;i<list_num;i++){
var name = unescape_list[i];
if(variables[name]){
variables[name] = unescape(variables[name]);
}
}
var count = 0;
for(var p in variables){
if(count) flashvars += "&" + p + "=" + variables[p];
else flashvars = p + "=" + variables[p];
count ++;
}
})();
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandEmbedElement(player_url))){
// 解析失敗
expand_video_complete();
return;
}
if(player_url && flashvars){
}else{
// 解析失敗
expand_video_complete();
return;
}
var embed;
video = DocumentCreateElement('div');
// スタイルをセット
ElementSetStyle(video,project.getStyleSheetExpandVideoNicovideoInlineVideo());
// 解析ワーク作成
video_analyze_work = AnalyzeWorkCreate(video);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(video_analyze_work,attach_options);
// エレメントのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(video);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(video);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!video) return;
limitter_element = element_limitter_video.createElement();
limitter_element.onattach = function(){
if(!embed){
embed = DocumentCreateElement('embed');
embed.type = "application/x-shockwave-flash";
embed.width = "100%";
embed.height = "100%";
embed.setAttribute("allowScriptAccess","sameDomain");
embed.setAttribute("bgcolor","#000000");
embed.setAttribute("quality","high");
embed.setAttribute("flashVars",flashvars);
embed.src = player_url;
video.appendChild(embed);
}
};
limitter_element.onremove = function(){
if(embed){
DomNodeRemove(embed);
embed = null;
}
};
limitter_element.setElementHitArea(video);
// 更新
limitter_element.update();
expand_video_complete();
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,video,work.event_dispatcher,responseInsert);
};
// ロードエラー
loader.onerror = function(){
expand_video_complete();
complete();
};
loader.setMethod("GET");
loader.setURL(script_url);
loader.loadText();
})();
}
// ビデオサムネイルを展開
function expand_thumbnail_video(video_id,language){
(function(){
if(!language) language = "ext";
var thumbnail_video_url = "http://" + language + ".nicovideo.jp/thumb/" + video_id;
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var event_handler = null;
var observer_remove = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(thumbnail_video_url){
address_collection.removeAddress("video",thumbnail_video_url);
thumbnail_video_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(thumbnail_video_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",thumbnail_video_url)){
thumbnail_video_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",thumbnail_video_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// 読み込み開始
iframe.src = thumbnail_video_url;
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoNicovideoInlineThumbnailVideo());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
})();
}
// マイリストサムネイルを展開
function expand_thumbnail_mylist(mylist_id){
(function(){
var thumbnail_mylist_url = "http://ext.nicovideo.jp/thumb_mylist/" + mylist_id;
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var event_handler = null;
var observer_remove = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(thumbnail_mylist_url){
address_collection.removeAddress("video",thumbnail_mylist_url);
thumbnail_mylist_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(thumbnail_mylist_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",thumbnail_mylist_url)){
thumbnail_mylist_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",thumbnail_mylist_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// 読み込み開始
iframe.src = thumbnail_mylist_url;
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoNicovideoInlineThumbnailMylist());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
})();
}
// ユーザーサムネイルを展開
function expand_thumbnail_user(user_id){
(function(){
var thumbnail_user_url = "http://ext.nicovideo.jp/thumb_user/" + user_id;
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var event_handler = null;
var observer_remove = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(thumbnail_user_url){
address_collection.removeAddress("video",thumbnail_user_url);
thumbnail_user_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(thumbnail_user_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",thumbnail_user_url)){
thumbnail_user_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",thumbnail_user_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// 読み込み開始
iframe.src = thumbnail_user_url;
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoNicovideoInlineThumbnailUser());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
})();
}
// コミュニティサムネイルを展開
function expand_thumbnail_community(community_id){
(function(){
var thumbnail_community_url = "http://ext.nicovideo.jp/thumb_community/" + community_id;
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var event_handler = null;
var observer_remove = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(thumbnail_community_url){
address_collection.removeAddress("video",thumbnail_community_url);
thumbnail_community_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(thumbnail_community_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",thumbnail_community_url)){
thumbnail_community_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",thumbnail_community_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// 読み込み開始
iframe.src = thumbnail_community_url;
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoNicovideoInlineThumbnailCommunity());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
})();
}
// 生放送サムネイルを展開
function expand_thumbnail_live(live_id){
(function(){
var thumbnail_live_url = "http://live.nicovideo.jp/embed/" + live_id;
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var event_handler = null;
var observer_remove = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(thumbnail_live_url){
address_collection.removeAddress("video",thumbnail_live_url);
thumbnail_live_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(thumbnail_live_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",thumbnail_live_url)){
thumbnail_live_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",thumbnail_live_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// 読み込み開始
iframe.src = thumbnail_live_url;
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoNicovideoInlineThumbnailLive());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
})();
}
// 静画サムネイルを展開
function expand_thumbnail_seiga(seiga_id){
(function(){
var thumbnail_seiga_url = "http://ext.seiga.nicovideo.jp/thumb/" + seiga_id;
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var event_handler = null;
var observer_remove = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(thumbnail_seiga_url){
address_collection.removeAddress("video",thumbnail_seiga_url);
thumbnail_seiga_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(thumbnail_seiga_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",thumbnail_seiga_url)){
thumbnail_seiga_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",thumbnail_seiga_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// 読み込み開始
iframe.src = thumbnail_seiga_url;
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoNicovideoInlineThumbnailSeiga());
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
})();
}
// マイリスト
if(project.getVisibleThumbnailMylistNicovideo()){
var allow_list_mylist = [
"*://*.nicovideo.jp/mylist/*",
"*://nicovideo.jp/mylist/*",
"*://nico.ms/mylist/*"
];
num = allow_list_mylist.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_mylist[i])){
var w = "/mylist/";
var s = url.indexOf(w);
if(s >= 0){
s += w.length;
var e = url.indexOf("?",s);
var mylist_id;
if(e >= 0) mylist_id = url.substring(s,e);
else mylist_id = url.substring(s);
// 数値
if(mylist_id.match(/([0-9]+$)/i)){
expand_thumbnail_mylist(RegExp.$1);
return;
}
}
}
}
}
// ユーザー
if(project.getVisibleThumbnailUserNicovideo()){
var allow_list_user = [
"*://*.nicovideo.jp/user/*",
"*://nicovideo.jp/user/*",
"*://*.niconico.com/user/*",
"*://niconico.com/user/*",
"*://nico.ms/user/*"
];
num = allow_list_user.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_user[i])){
var w = "/user/";
var s = url.indexOf(w);
if(s >= 0){
s += w.length;
var e = url.indexOf("?",s);
var user_id;
if(e >= 0) user_id = url.substring(s,e);
else user_id = url.substring(s);
// 数値
if(user_id.match(/([0-9]+$)/i)){
expand_thumbnail_user(RegExp.$1);
return;
}
}
}
}
}
// コミュニティ
if(project.getVisibleThumbnailCommunityNicovideo()){
var allow_list_community = [
"*://*.nicovideo.jp/community/*",
"*://nicovideo.jp/community/*",
"*://*.niconico.com/community/*",
"*://niconico.com/community/*",
"*://nico.ms/community/*"
];
num = allow_list_community.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_community[i])){
if(url.match(/community\/(co[0-9]+)/i)){
expand_thumbnail_community(RegExp.$1);
return;
}
}
}
}
// ライブ
if(project.getVisibleThumbnailLiveNicovideo()){
var allow_list_live = [
"*://live.nicovideo.jp/watch/lv*",
"*://live.niconico.com/watch/lv*",
"*://nico.ms/lv*"
];
num = allow_list_live.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_live[i])){
if(url.match(/\/(lv[0-9]+)/i)){
expand_thumbnail_live(RegExp.$1);
return;
}
}
}
var allow_list_nsen = [
"*://live.nicovideo.jp/watch/nsen/*"
];
num = allow_list_nsen.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_nsen[i])){
if(url.match(/(nsen\/.+)/i)){
expand_thumbnail_live(RegExp.$1);
return;
}
}
}
}
// 静画
if(project.getVisibleThumbnailSeigaNicovideo()){
var allow_list_seiga = [
"*://seiga.nicovideo.jp/watch/mg*",
"*://nico.ms/mg*"
];
num = allow_list_seiga.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_seiga[i])){
if(url.match(/\/(mg[0-9]+)/i)){
expand_thumbnail_seiga(RegExp.$1);
return;
}
}
}
}
// nicovideo.jp へのリンク
var allow_list_video = [
"(http|https)://.*\\.nicovideo\\.jp/watch/",
"(http|https)://nicovideo\\.jp/watch/",
"(http|https)://.*\\.niconico\\.com/watch/",
"(http|https)://niconico\\.com/watch/",
"(http|https)://nico\\.ms/.*/",
"(http|https)://nico\\.ms/"
];
num = allow_list_video.length;
for(i=0;i<num;i++){
if(url.match(new RegExp(allow_list_video[i],"i"))){
var language = null;
var video_id = RegExp.rightContext;
if(video_id.match(new RegExp("^(.*?)[?#]","i"))){
video_id = RegExp.$1;
}
// アルファベット2文字 + 数値
if(video_id.match(/([a-z]{2})([0-9]+$)/i)){
video_id = RegExp.$1 + RegExp.$2;
// 接尾辞
switch(RegExp.$1){
case "im":
case "mg":
case "lv":
case "bk":
case "nw":
case "co":
video_id = null;
break;
}
}
// nicovideo.jp サブドメイン
if(url.match(new RegExp("^(http|https)://([a-z]+?)\\.nicovideo\\.jp/","i"))){
// 対応言語
switch(RegExp.$2){
case "de":
case "es":
case "tw":
language = RegExp.$2;
break;
}
switch(RegExp.$2){
case "live":
case "news":
case "seiga":
video_id = null;
break;
}
}
if(video_id){
if(project.getVisibleVideoNicovideo()){
expand_video(video_id,language);
return;
}else if(project.getVisibleThumbnailVideoNicovideo()){
expand_thumbnail_video(video_id,language);
return;
}
}
}
}
// 完了
complete();
}
// ------------------------------
// インラインビデオ ustream
// ------------------------------
function ElementExpandInlineVideoUstream(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// ustream.tv 内では動作禁止
var deny_list = [
"*://*.ustream.tv/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
(function(){
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var iframe = null;
var iframe_analyze_work = null;
var iframe_url = null;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("video",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
function initialize(){
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
}
// 動画情報を読み込み
function load_video_info(url){
initialize();
// テキストの読み込み
var loader = new Loader();
loader.onload = function(str){
// og:video:secure_url を取得
if(str.match(/<meta[ ]+?property=\"og:video:secure_url\"[ ]+?content=\"(.*?)\"/i)){
iframe_url = RegExp.$1;
}
if(!iframe_url){
// og:video:secure_url を取得
if(str.match(/<meta[ ]+?property=\"og:video\"[ ]+?content=\"(.*?)\"/i)){
iframe_url = RegExp.$1;
}
}
if(iframe_url){
var query = StringGetQuery(iframe_url);
if(query.autoplay === undefined){
iframe_url = iframe_url + "&autoplay=false";
}
var check = false;
if(iframe_url.indexOf("/recorded/") >= 0){
if(project.getVisibleVideoRecordUstream()){
expand_video(false);
check = true;
}
}else{
if(project.getVisibleVideoLiveUstream()){
expand_video(true);
check = true;
}
}
if(!check){
releaseIframe();
}
}
};
loader.onerror = function(){
complete();
};
loader.setMethod("GET");
loader.setURL(url);
loader.loadText();
}
// 録画動画を展開
function expand_video_record(video_id){
if(project.getVisibleVideoRecordUstream()){
initialize();
iframe_url = "https://www.ustream.tv/embed/recorded/" + video_id;
expand_video(false);
}
}
// 動画を展開
function expand_video(live){
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",iframe_url)){
iframe_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",iframe_url);
}
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// スタイルをセット
if(live){
ElementSetStyle(iframe,project.getStyleSheetExpandVideoUstreamInlineVideoLive());
}else{
ElementSetStyle(iframe,project.getStyleSheetExpandVideoUstreamInlineVideoRecord());
}
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(iframe);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
limitter_element = element_limitter_video.createElement();
limitter_element.onattach = function(){
iframe.src = iframe_url;
};
limitter_element.onremove = function(){
iframe.src = "";
};
limitter_element.setElementHitArea(iframe);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
}
// 録画ビデオ用
if(project.getVisibleVideoRecordUstream()){
var allow_list_video = [
"*://*.ustream.tv/recorded/*"
];
num = allow_list_video.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_video[i])){
if(url.match("/recorded/([0-9]+?)([?]|[/]|[#]|$)","i")){
expand_video_record(RegExp.$1);
return;
}
}
}
}
// ustream.tv へのリンク
if(
project.getVisibleVideoLiveUstream() ||
project.getVisibleVideoRecordUstream()
){
var allow_list_live = [
"*://ustre.am/*",
"*://*.ustream.tv/*"
];
num = allow_list_live.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list_live[i])){
load_video_info(url);
return;
}
}
}
// 完了
complete();
})();
}
// ------------------------------
// インラインビデオ dailymotion
// ------------------------------
function ElementExpandInlineVideoDailymotion(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// www.dailymotion.com 内では動作禁止
var deny_list = [
"*//www.dailymotion.com/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
// 動画を展開
function expand_video(url){
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var iframe_url = url;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("video",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",iframe_url)){
iframe_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",iframe_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoDailymotionInlineVideo());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(iframe);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
limitter_element = element_limitter_video.createElement();
limitter_element.onattach = function(){
iframe.src = iframe_url;
};
limitter_element.onremove = function(){
iframe.src = "";
};
limitter_element.setElementHitArea(iframe);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
}
if(project.getVisibleVideoDailymotion()){
var allow_list = [
"*//www.dailymotion.com/video/*",
"*//touch.dailymotion.com/video/*"
];
num = allow_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list[i])){
var w = "/video/";
var s = url.indexOf(w);
if(s >= 0){
s += w.length;
var e = url.indexOf("_",s);
var video_id;
if(e >= 0) video_id = url.substring(s,e);
else video_id = url.substring(s);
if(video_id){
var protocol = project.getSecureCurrent() ? "https" : "http";
expand_video(protocol + "://www.dailymotion.com/embed/video/" + video_id);
return;
}
}
}
}
}
// 完了
complete();
}
// ------------------------------
// インラインビデオ vimeo
// ------------------------------
function ElementExpandInlineVideoVimeo(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// vimeo.com 内では動作禁止
var deny_list = [
"*//vimeo.com/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
// 動画を展開
function expand_video(url){
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var iframe = null;
var iframe_analyze_work = null;
var iframe_url = url;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("video",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",iframe_url)){
iframe_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",iframe_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoVimeoInlineVideo());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(iframe);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
limitter_element = element_limitter_video.createElement();
limitter_element.onattach = function(){
iframe.src = iframe_url;
};
limitter_element.onremove = function(){
iframe.src = "";
};
limitter_element.setElementHitArea(iframe);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
}
if(project.getVisibleVideoVimeo()){
var allow_list = [
"*//vimeo.com/*"
];
num = allow_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list[i])){
var w = "://vimeo.com/";
var s = url.indexOf(w);
if(s >= 0){
s += w.length;
var e = url.indexOf("?",s);
var video_id;
if(e >= 0) video_id = url.substring(s,e);
else video_id = url.substring(s);
if(video_id){
// すべて数値
if(video_id.match(/^[0-9]+$/)){
expand_video("https://player.vimeo.com/video/" + video_id);
return;
}
}
}
}
}
}
// 完了
complete();
}
// ------------------------------
// インラインビデオ fc2video
// ------------------------------
function ElementExpandInlineVideoFc2video(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// アンセキュアチェック
if(!project.checkAllowUnsecure(url)){
complete();
return;
}
// video.fc2.com 内では動作禁止
var deny_list = [
"*://video.fc2.com/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
// 動画を展開
function expand_video(url){
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var video = null;
var video_analyze_work = null;
var video_url = url;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseElement(e){
// アドレスの登録を外す
if(video_url){
address_collection.removeAddress("video",video_url);
video_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(video_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(video_analyze_work);
video_analyze_work = null;
}
// インラインフレームを外す
if(video){
DomNodeRemove(video);
video = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandEmbedElement(video_url))){
releaseElement();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",video_url)){
video_url = null;
releaseElement();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",video_url);
}
var embed;
video = DocumentCreateElement('div');
// スタイルをセット
ElementSetStyle(video,project.getStyleSheetExpandVideoFc2videoInlineVideo());
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseElement);
// 解析ワーク作成
video_analyze_work = AnalyzeWorkCreate(video);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(video_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(video);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(video);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!video) return;
limitter_element = element_limitter_video.createElement();
limitter_element.onattach = function(){
if(!embed){
embed = DocumentCreateElement('embed');
embed.type = "application/x-shockwave-flash";
embed.width = "100%";
embed.height = "100%";
embed.setAttribute("bgcolor","#ffffff");
embed.setAttribute("quality","high");
embed.setAttribute("wmode","transparent");
embed.setAttribute("align","middle");
embed.setAttribute("allowScriptAccess","sameDomain");
embed.setAttribute("pluginspage","http://www.macromedia.com/go/getflashplayer");
embed.setAttribute("allowFullScreen","true");
embed.src = video_url;
video.appendChild(embed);
}
};
limitter_element.onremove = function(){
if(embed){
DomNodeRemove(embed);
embed = null;
}
};
limitter_element.setElementHitArea(video);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,video,work.event_dispatcher,responseInsert);
}
if(project.getVisibleVideoFc2video()){
var allow_list = [
"*://video.fc2.com/content/*",
"*://video.fc2.com/*/content/*"
];
num = allow_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(url,allow_list[i])){
var w = "/content/";
var s = url.indexOf(w);
if(s >= 0){
s += w.length;
var m = url.substring(s).match(/^[0-9a-z]+/i);
if(m){
var video_id = m[0];
expand_video("http://video.fc2.com/flv2.swf?i=" + video_id);
return;
}
}
}
}
}
// 完了
complete();
}
// ------------------------------
// インラインビデオ liveleak
// ------------------------------
function ElementExpandInlineVideoLiveleak(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
// アンセキュアチェック
if(!project.checkAllowUnsecure(url)){
complete();
return;
}
// liveleak.com 内では動作禁止
var deny_list = [
"*://liveleak.com/*",
"*://*.liveleak.com/*"
];
var i;
var num = deny_list.length;
for(i=0;i<num;i++){
if(StringUrlMatchAsteriskWord(document.URL,deny_list[i])){
return;
}
}
// 動画を展開
function expand_video(video_id,language){
// 展開処理の完了
function expand_video_complete(){
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var iframe = null;
var iframe_analyze_work = null;
var iframe_url = null;
var event_handler = null;
var limitter_element = null;
var observer_remove = null;
var media_player_ui = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("video",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
if(limitter_element){
limitter_element.onremove = null;
limitter_element.release();
limitter_element = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// メディアプレイヤー UI を破棄
if(media_player_ui){
media_player_ui.release();
media_player_ui = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// テキストの読み込み
loader = new Loader();
loader.onload = function(str){
// video_id 抽出
if(str.match(new RegExp(".*generate_embed_code_generator_html[(][\'\"]([0-9a-z_]+)[\'\"][)].*","i"))){
iframe_url = "http://www.liveleak.com/ll_embed?f=" + RegExp.$1;
}
// アドレス取得失敗
if(!iframe_url){
expand_video_complete();
releaseIframe();
return;
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineVideo()){
if(address_collection.hasAddress("video",iframe_url)){
iframe_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("video",iframe_url);
}
// インラインフレームを作成
iframe = DocumentCreateElement('iframe');
iframe.frameBorder = "0";
iframe.scrolling = "no";
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandVideoLiveleakInlineVideo());
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
// メディアプレイヤー UI
media_player_ui = new MediaPlayerExtendUI(iframe);
var event_handler_close = media_player_ui.createEventHandler("close");
event_handler_close.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
limitter_element = element_limitter_video.createElement();
limitter_element.onattach = function(){
iframe.src = iframe_url;
};
limitter_element.onremove = function(){
iframe.src = "";
};
limitter_element.setElementHitArea(iframe);
// 更新
limitter_element.update();
}
// コールバック関数を実行
project.executeScriptInsertInlineVideo(element,iframe,work.event_dispatcher,responseInsert);
};
// ロードエラー
loader.onerror = function(){
expand_video_complete();
complete();
};
loader.setMethod("GET");
loader.setURL(url);
loader.loadText();
}
if(project.getVisibleVideoLiveleak()){
// www.liveleak.com へのリンク
var allow_list_video = [
"(http|https)://www\\.liveleak\\.com/view[?].*(i=[a-z0-9_]).*",
"(http|https)://.*?\\.liveleak\\.com/.*/view[?].*(i=[a-z0-9_]).*"
];
num = allow_list_video.length;
for(i=0;i<num;i++){
if(url.match(new RegExp(allow_list_video[i],"i"))){
expand_video(url);
}
}
}
// 完了
complete();
}
// ------------------------------
// インラインフレームの展開
// ------------------------------
function ElementExpandInlineIframe(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
var url = AnalyzeWorkGetExpandUrl(work);
var content_type = AnalyzeWorkGetContentType(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
function complete(){
}
function response_allow(param){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(!(param.result)){
complete();
return;
}
// アンセキュアチェック
if(!project.checkAllowUnsecure(url)){
complete();
return;
}
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
var loader = null;
var iframe = null;
var iframe_analyze_work = null;
var iframe_url = url;
var event_handler = null;
var observer_remove = null;
// 開放イベントを発行
function dispatchEventRelease(e){
event_dispatcher.dispatchEvent("release",null);
}
// インラインフレームを破棄
function releaseIframe(e){
// ローダーを中断
if(loader){
loader.onload = null;
loader.onerror = null;
loader = null;
}
// アドレスの登録を外す
if(iframe_url){
address_collection.removeAddress("iframe",iframe_url);
iframe_url = null;
}
// イベントハンドラを破棄
if(event_handler){
event_handler.release();
event_handler = null;
}
// 監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
if(iframe_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(iframe_analyze_work);
iframe_analyze_work = null;
}
// インラインフレームを外す
if(iframe){
DomNodeRemove(iframe);
iframe = null;
}
}
// 混在コンテンツの展開が可能か
if(!(project.checkAllowExpandIframeElement(iframe_url))){
releaseIframe();
complete();
return;
}
// 重複チェック
if(project.getDisableSameInlineIframe()){
if(address_collection.hasAddress("iframe",iframe_url)){
iframe_url = null;
releaseIframe();
complete();
return;
}
// アドレスを登録
address_collection.addAddress("iframe",iframe_url);
}
// イベントハンドラを作成
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframe);
// テキストの読み込み
loader = new Loader();
loader.onload = function(str){
complete();
// インラインフレームを生成
iframe = DocumentCreateElement("iframe");
iframe.frameBorder = "0";
iframe.src = iframe_url;
// スタイルをセット
ElementSetStyle(iframe,project.getStyleSheetExpandIframeInline());
// 解析ワーク作成
iframe_analyze_work = AnalyzeWorkCreate(iframe);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(iframe_analyze_work,attach_options);
// インラインフレームのリムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(iframe);
observer_remove.setFunction(dispatchEventRelease);
function responseInsert(){
if(!iframe) return;
}
// コールバック関数を実行
project.executeScriptInsertInlineIframe(element,iframe,work.event_dispatcher,responseInsert);
};
loader.onerror = function(){
complete();
};
loader.setMethod("GET");
loader.setURL(iframe_url);
loader.loadText();
}
// コールバック関数を実行
project.executeScriptAllowInlineIframe(element,url,content_type,response_allow);
}
// ------------------------------
// インラインフレーム内コンテンツの展開
// ------------------------------
function ElementExpandIframeContent(param){
var work = param.work;
var modify = param.modify;
var element = AnalyzeWorkGetDomNode(work);
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var event_dispatcher;
var event_handler;
var observer_modify_element;
var timer;
var expanded = false;
// 破棄
function releaseIframeContent(){
removeEvent();
// アドレス変更監視を破棄
if(observer_modify_element){
observer_modify_element.release();
observer_modify_element = null;
}
}
// イベントを除外
function removeEvent(){
if(timer){
timer.release();
timer = null;
}
try{
var window_obj = element.contentWindow;
if(window_obj.removeEventListener){
window_obj.removeEventListener("unload",unload);
}else if(window_obj.detachEvent){
window_obj.detachEvent("onunload",unload);
}
}catch(e){
}
}
// アンロード
function unload(){
expanded = false;
start();
}
// スタート
function start(){
if(expanded) return;
removeEvent();
timer = new Timer(1,1);
timer.oncomplete = function(){
if(expanded) return;
try{
var window_obj = element.contentWindow;
if(WindowIsExecutedByPageExpand(window_obj)){
// アンロード監視
if(window_obj.addEventListener){
window_obj.addEventListener("unload",unload);
}else if(window_obj.attachEvent){
window_obj.attachEvent("onunload",unload);
}
expanded = true;
PageExpand({execute_type:page_expand_arguments.execute_type,admin:admin,window:window_obj,page_expand_parent:page_expand_node});
}
}catch(e){
}
};
timer.start();
}
// 要素を監視
AnalyzeWorkObserveElement(work);
event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
// 開放イベント
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releaseIframeContent);
// アドレス変更監視
observer_modify_element = document_observer_modify_node.createElement();
observer_modify_element.setElement(element,"src");
observer_modify_element.setFunction(function (){
start();
});
start();
}
// ------------------------------
// 縮小画像のポップアップ
// ------------------------------
function ElementPopupReducedImage(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
// 解析済みチェック
if(AnalyzeWorkGetAnalyzedPopupReducedImage(work)){
return;
}
AnalyzeWorkSetAnalyzedPopupReducedImage(work);
var popup_image;
var event_dispatcher;
var event_handler;
var observer_modify_element;
var released = false;
// 縮小画像のポップアップを破棄
function releasePopupReducedImage(){
// アドレス変更監視を破棄
if(observer_modify_element){
observer_modify_element.release();
observer_modify_element = null;
}
// ポップアップイメージを破棄
if(popup_image){
popup_image.suicide();
popup_image = null;
}
released = true;
}
// 要素を監視
AnalyzeWorkObserveElement(work);
event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
// ポップアップイメージの破棄イベント
event_handler = event_dispatcher.createEventHandler("release_popup_image");
event_handler.setFunction(function(){
// ポップアップイメージを破棄
if(popup_image){
popup_image.release();
popup_image = null;
}
releasePopupReducedImage();
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
if(event_dispatcher){
if(!AnalyzeWorkGetOverrodeAnchorElement(work)){
event_dispatcher.dispatchEvent("destructor",null);
}
}
});
// 開放イベント
event_handler = event_dispatcher.createEventHandler("release");
event_handler.setFunction(releasePopupReducedImage);
// アドレス変更監視
observer_modify_element = document_observer_modify_node.createElement();
observer_modify_element.setElement(element,"src");
observer_modify_element.setFunction(function (){
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
if(event_dispatcher){
event_dispatcher.dispatchEvent("destructor",null);
}
// 再解析
DomNodeAnalyzePhaseAnalyzeElement(element);
});
// 読み込み完了
ImageGetLoaded(element,function(){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(released) return;
var allow = true;
if(allow){
try{
// ソースが無い
if(!(element.src)){
allow = false;
}
}catch(e){
allow = false;
}
}
if(allow){
// 画像の縮小率を調べる
var natural_size = ImageGetNaturalSize(element);
var scale = project.getScaleLessThenAllowPopupReducedImage();
if(element.width > natural_size.width / 100 * scale) allow = false;
if(element.height > natural_size.height / 100 * scale) allow = false;
}
if(allow){
// ブラウザで直接画像を閲覧している場合は除外
if(element.src == document.URL){
allow = false;
}
}
if(allow){
(function(){
var node = element;
while(node){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(node);
if(work){
// 祖先に PopupImage が存在する
if(AnalyzeWorkGetPopupImage(work)){
allow = false;
break;
}
}
node = node.parentNode;
}
})();
}
if(allow){
// ポップアップイメージ
var image = ImageClone(element);
// ロード完了
ImageGetLoaded(image,function(){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(released) return;
popup_image = new PopupImage(image);
popup_image.setElementParent(document.body);
popup_image.setElementAnchor(element);
popup_image.setElementHitArea(element);
popup_image.setElementBeginArea(element);
popup_image.setOriginalURL(image.src);
popup_image.ontrim = function (){
if(!popup_image) return;
var trim_check = false;
var trim_rect = new Object();
var bounding_rect = ElementGetBoundingClientRect(element);
var view_rect = ObjectCopy(bounding_rect);
var overflow_hidden_x = {"hidden":1};
var overflow_hidden_y = {"hidden":1};
var display_inline = {"inline":1,"none":1,"table-column":1,"table-column-group":1};
var node = element;
while(node){
var r = ElementGetBoundingClientRect(node);
if(!r) break;
if(node.tagName == "BODY") break;
var style = ElementGetComputedStyle(node,null);
if(style){
if(!display_inline[style.display]){
if(overflow_hidden_x[style.overflowX]){
if(r.right < view_rect.right ) view_rect.right = r.right;
if(r.left > view_rect.left ) view_rect.left = r.left;
trim_check = true;
}
if(overflow_hidden_y[style.overflowY]){
if(r.bottom < view_rect.bottom) view_rect.bottom = r.bottom;
if(r.top > view_rect.top ) view_rect.top = r.top;
trim_check = true;
}
}
}
node = node.parentNode;
}
if(trim_rect){
var natural_size = ImageGetNaturalSize(element);
var computed_style = ElementGetComputedStyle(element,null);
var boader_rect = ComputedStyleGetBoaderWidth(computed_style);
var padding_rect = ComputedStyleGetPaddingWidth(computed_style);
var px = bounding_rect.left + boader_rect.left + padding_rect.left;
var py = bounding_rect.top + boader_rect.top + padding_rect.top;
var w = (bounding_rect.right - px) - boader_rect.right + padding_rect.right;
var h = (bounding_rect.bottom - py) - boader_rect.bottom + padding_rect.bottom;
var sx = natural_size.width / w;
var sy = natural_size.height / h;
trim_rect.left = (view_rect.left - px) * sx;
trim_rect.top = (view_rect.top - py) * sy;
trim_rect.right = (view_rect.right - px) * sx;
trim_rect.bottom = (view_rect.bottom - py) * sy;
}
if(trim_check){
popup_image.setTrimRect(trim_rect);
}
};
popup_image.ontrim();
AnalyzeWorkSetPopupImage(work,popup_image);
});
}else{
// 解放イベント発行
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
if(event_dispatcher){
event_dispatcher.dispatchEvent("release_popup_image",null);
}
}
});
}
// ------------------------------
// 縮小画像のポップアップを全て破棄
// ------------------------------
function PopupReducedImageReleaseAll(element){
// 子孫抽出
function analyze(node){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(node);
if(work){
// 解放イベント発行
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
if(event_dispatcher){
event_dispatcher.dispatchEvent("release_popup_image",null);
}
}
}
if(element.nodeType == 1){
// イメージ
if(element.tagName == "IMG"){
analyze(element);
}
// 画像をすべて取得
var nodes = ElementGetElementsByTagName(element,"img");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
analyze(nodes[i]);
}
}
}
// ------------------------------
// 掲示板拡張
// ------------------------------
function ElementExpandBbs(param){
var work = param.work;
var modify = param.modify;
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
var element = AnalyzeWorkGetDomNode(work);
var completed = false;
function response(obj){
if(!AnalyzeWorkEqualModifyCount(work,modify)) return;
if(completed) return;
completed = true;
if(!obj) return;
if(!(obj.useful)) return;
var observer_remove;
var event_handler_release;
// 解放
function releaseExpandBbs(){
// 解析クリア
AnalyzeWorkClearAnalyzedExpandBbs(work);
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
// リムーブ監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// 解析辞書除外
analyze_work_dictionary.removeAnalyzeWork(work);
}
// リムーブ監視
observer_remove = new DomNodeObserverRemoveFromDocument(element);
observer_remove.setFunction(releaseExpandBbs);
// 開放イベント
event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(releaseExpandBbs);
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(work);
}
// 解析済みチェック
if(AnalyzeWorkGetAnalyzedExpandBbs(work)){
return;
}
AnalyzeWorkSetAnalyzedExpandBbs(work);
// コールバック関数を実行
project.executeScriptCallbackExpandBbs(element,response);
}
// ------------------------------
// PageExpand ノード
// ------------------------------
function PageExpandNode(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(child){
var _prev = _this._child_list._prev;
var _next = _prev._next;
_prev._next = _next;
_next._prev = _prev;
_this.remove();
_this._parent = null;
};
// ------------------------------
// 子を登録
// ------------------------------
_this.attachChild = function(child){
child.remove();
var _next = _this._child_list;
var _prev = _next._prev;
_prev._next = child;
_next._prev = child;
child._prev = _prev;
child._next = _next;
child._parent = _this;
};
// ------------------------------
// 除外
// ------------------------------
_this.remove = function(){
var _prev = _this._prev;
var _next = _this._next;
_prev._next = _next;
_next._prev = _prev;
};
// ------------------------------
// PageExpand ルートを取得
// ------------------------------
_this.getPageExpandRoot = function(){
var node = _this;
while(node._parent){
node = node._parent;
}
return node;
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
_this._prev = _this;
_this._next = _this;
var child_list = new Object();
child_list._prev = child_list;
child_list._next = child_list;
_this._child_list = child_list;
_this._parent = null;
})();
}
// ------------------------------
// PageExpand の解析が有効であるか
// ------------------------------
function PageExpandSetEnableAnalyze(type){
enable_analyze = type;
}
// ------------------------------
// コンテンツタイプをセット
// ------------------------------
function DomNodeSetContentType(node,type){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(node);
if(work){
AnalyzeWorkAddContentType(work,type);
}
}
// ------------------------------
// コンテンツタイプを取得
// ------------------------------
function DomNodeGetContentType(node){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(node);
if(work){
var ary = AnalyzeWorkGetContentType(work);
if(ary){
return ary.join(",");
}
}
return "";
}
// ------------------------------
// 「掲示板拡張」の解析状況
// ------------------------------
function DomNodeSetCompletedExpandBbs(node){}
// ------------------------------
// 「テキストの置換」の解析状況
// ------------------------------
function DomNodeSetCompletedReplacementToText(node){}
// ------------------------------
// 「挿入済み」の解析状況
// ------------------------------
function DomNodeClearInserted(node){ ObjectDeleteProperty(node,"_pageexpand_inserted"); }
function DomNodeSetInserted(node){ try{ node._pageexpand_inserted = true; }catch(e){} }
function DomNodeGetInserted(node){ try{ if(node._pageexpand_inserted){ return true; } }catch(e){} return false; }
// ------------------------------
// 正規表現オブジェクトを作成
// ------------------------------
function RegExpObjectCreate(){
return {
pattern:"",
flags:{i:false,g:false}
};
}
// ------------------------------
// 正規表現オブジェクトから RegExp を生成
// ------------------------------
function RegExpObjectGetRegExp(obj){
try{
return new RegExp(obj.pattern,(obj.flags.g ? "g":"") + (obj.flags.i ? "i":""));
}catch(e){
return null;
}
}
// ------------------------------
// 正規表現オブジェクトからエラーを取得
// ------------------------------
function RegExpObjectGetError(obj){
try{
var regexp = new RegExp(obj.pattern,(obj.flags.g ? "g":"") + (obj.flags.i ? "i":""));
return "";
}catch(e){
return e;
}
}
// ------------------------------
// ポップアップイメージ
// ------------------------------
function PopupImage(image){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(!_image) return;
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
if(_input_mouse_current){
if(window_manager.existWindowRoot()){
_input_mouse_current.release();
}
_input_mouse_current = null;
}
// クリックイベントを外す
removeEventClick();
// ホイールイベントを外す
removeEventWheel();
// マウスイベントを外す
removeEventMouseOver();
// タッチイベントを外す
removeEventTouchStart();
// リリースイベントを外す
removeEventRelease();
// タスクを破棄
if(_task){
_task.release();
_task = null;
}
// 解析辞書除外
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
// コンテナから除外
popup_image_container.remove(_this);
_image = null;
};
// ------------------------------
// 自殺
// ------------------------------
_this.suicide = function(){
if(_task){
_this.setElementHitArea(null);
_suicide = true;
}else{
_this.release();
}
};
// ------------------------------
// 親をセット
// ------------------------------
_this.setElementParent = function(element){
if(window_manager.existWindowRoot()){
_element_parent = window_manager.getWindowRoot().document.body;
}else{
_element_parent = element;
}
};
// ------------------------------
// リンクをセット
// ------------------------------
_this.setElementAnchor = function(element){
_this._element_anchor = element;
// コンテナに登録
popup_image_container.attach(_this);
};
// ------------------------------
// リンクを取得
// ------------------------------
_this.getElementAnchor = function(){
return _this._element_anchor;
};
// ------------------------------
// 当たり判定用エレメントをセット
// ------------------------------
_this.setElementHitArea = function(element){
// マウスイベントを外す
removeEventMouseOver();
// タッチイベントを外す
removeEventTouchStart();
// リリースイベントを外す
removeEventRelease();
_element_hit_area = element;
// マウスイベントを開始
addEventMouseOver();
// タッチイベントを開始
addEventTouchStart();
// リリースイベントを開始
addEventRelease();
};
// ------------------------------
// 開始範囲用エレメントをセット
// ------------------------------
_this.setElementBeginArea = function(element){
_element_begin_area = element;
};
// ------------------------------
// トリミング範囲をセット
// ------------------------------
_this.setTrimRect = function(rect){
if(!_trim_rect){
// イベントを外す
removeEventClick();
removeEventWheel();
var div = DocumentCreateElement("div");
// スタイルをセット
ElementSetStyle(div,
"overflow:hidden;"
);
// スタイルを追加
ElementAddStyle(_element_current,project.getStyleSheetExpandImagePopup());
div.appendChild(_image);
_element_current = div;
// イベント
addEventClick();
addEventWheel();
}
_trim_rect = ObjectCopy(rect);
_trim_rect.width = _trim_rect.right - _trim_rect.left;
_trim_rect.height = _trim_rect.bottom - _trim_rect.top;
};
// ------------------------------
// 元のアドレスをセット
// ------------------------------
_this.setOriginalURL = function(url){
_original_url = url;
};
// ------------------------------
// 元のアドレスを取得
// ------------------------------
_this.getOriginalURL = function(url){
return _original_url;
};
// ------------------------------
// イメージを取得
// ------------------------------
_this.getImage = function(){
return _image;
};
// ------------------------------
// ポップアップ
// ------------------------------
_this.popup = function(element){
createTask();
};
// ------------------------------
// マウスオーバーイベントを追加(内部用)
// ------------------------------
function addEventMouseOver(){
if(!_element_hit_area) return;
removeEventMouseOver();
if(_element_hit_area.addEventListener){
_element_hit_area.addEventListener("mouseover",mouseOver,false);
}else if(_element_hit_area.attachEvent){
_element_hit_area.attachEvent("onmouseover",mouseOver);
}
}
// ------------------------------
// マウスオーバーイベントを外す(内部用)
// ------------------------------
function removeEventMouseOver(){
if(!_element_hit_area) return;
if(_element_hit_area.removeEventListener){
_element_hit_area.removeEventListener("mouseover",mouseOver,false);
}else if(_element_hit_area.detachEvent){
_element_hit_area.detachEvent("onmouseover",mouseOver);
}
}
// ------------------------------
// タッチスタートイベントを追加(内部用)
// ------------------------------
function addEventTouchStart(){
if(!_element_hit_area) return;
removeEventTouchStart();
if(_element_hit_area.addEventListener){
//_element_hit_area.addEventListener("touchstart",touchStart,false);
}
}
// ------------------------------
// タッチスタートイベントを外す(内部用)
// ------------------------------
function removeEventTouchStart(){
if(!_element_hit_area) return;
if(_element_hit_area.removeEventListener){
//_element_hit_area.removeEventListener("touchstart",touchStart,false);
}
}
// ------------------------------
// クリックイベントを追加(内部用)
// ------------------------------
function addEventClick(){
removeEventClick();
if(_element_current.addEventListener){
_element_current.addEventListener("mousedown",mouseDown,false);
_element_current.addEventListener("click",mouseClick,false);
}else if(_element_current.attachEvent){
_element_current.attachEvent("onmousedown",mouseDown);
_element_current.attachEvent("onclick",mouseClick);
}
}
// ------------------------------
// クリックイベントを外す(内部用)
// ------------------------------
function removeEventClick(){
if(_element_current.removeEventListener){
_element_current.removeEventListener("mousedown",mouseDown,false);
_element_current.removeEventListener("click",mouseClick,false);
}else if(_element_current.detachEvent){
_element_current.detachEvent("onmousedown",mouseDown);
_element_current.detachEvent("onclick",mouseClick);
}
}
// ------------------------------
// ホイールイベントを追加(内部用)
// ------------------------------
function addEventWheel(){
removeEventWheel();
if(_element_current.addEventListener){
if(window.WheelEvent){
_element_current.addEventListener("wheel",wheel,false);
}else if(window.MouseScrollEvent){
_element_current.addEventListener("DOMMouseScroll",mouseScroll,false);
}else{
_element_current.addEventListener("mousewheel",mouseWheel,false);
}
}else if(_element_current.attachEvent){
_element_current.attachEvent("onmousewheel",mouseWheel);
}
}
// ------------------------------
// ホイールイベントを外す(内部用)
// ------------------------------
function removeEventWheel(){
if(_element_current.removeEventListener){
if(window.WheelEvent){
_element_current.removeEventListener("wheel",wheel,false);
}else if(window.MouseScrollEvent){
_element_current.removeEventListener("DOMMouseScroll",mouseScroll,false);
}else{
_element_current.removeEventListener("mousewheel",mouseWheel,false);
}
}else if(_element_current.detachEvent){
_element_current.detachEvent("onmousewheel",mouseWheel);
}
}
// ------------------------------
// リリースイベントを追加(内部用)
// ------------------------------
function addEventRelease(){
if(!_element_hit_area) return;
removeEventRelease();
if(!_observer_remove){
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element_hit_area);
_observer_remove.setFunction(_this.suicide);
}
}
// ------------------------------
// リリースイベントを外す(内部用)
// ------------------------------
function removeEventRelease(){
if(_observer_remove){
// 監視を破棄
_observer_remove.release();
_observer_remove = null;
}
}
// ------------------------------
// マウスオーバーイベント(内部用)
// ------------------------------
function mouseOver(e){
// マウス入力を更新
input_mouse.setMouseEvent(e);
createTask();
}
// ------------------------------
// タッチスタートイベント(内部用)
// ------------------------------
function touchStart(e){
// タッチ入力を更新
input_touch.setTouchEvent(e);
createTask();
}
// ------------------------------
// マウスダウンイベント(内部用)
// ------------------------------
function mouseDown(e){
// マウス入力を更新
_input_mouse_current.setMouseEvent(e);
if(
(_input_mouse_current.getButtonCenter()) ||
(_input_mouse_current.getButtonLeft() && _input_mouse_current.getButtonRight())
){
var image_viewer = new ImageViewer(_this);
image_viewer.setInputMouse(_input_mouse_current);
}
}
// ------------------------------
// マウスクリックイベント(内部用)
// ------------------------------
function mouseClick(e){
// マウス入力を更新
_input_mouse_current.setMouseEvent(e);
_this.release();
}
// ------------------------------
// ホイールイベント(内部用)
// ------------------------------
function wheel(e){
// マウス入力を更新
_input_mouse_current.setMouseEvent(e);
var vec = {x:0,y:0};
switch(e.deltaMode){
case 0:
vec.x = e.deltaX;
vec.y = e.deltaY;
break;
case 1:
vec.x = e.deltaX / 3 * 50;
vec.y = e.deltaY / 3 * 50;
break;
case 2:
vec.x = e.deltaX;
vec.y = e.deltaY;
break;
}
// 擬似スクロール
wheelScroll(e,vec);
}
// ------------------------------
// マウススクロールイベント(内部用)
// ------------------------------
function mouseScroll(e){
// マウス入力を更新
_input_mouse_current.setMouseEvent(e);
// 擬似スクロール
wheelScroll(e,{
x:0,
y:(e.detail / 3 * 50)
});
}
// ------------------------------
// マウスホイールイベント(内部用)
// ------------------------------
function mouseWheel(e){
// マウス入力を更新
_input_mouse_current.setMouseEvent(e);
// 擬似スクロール
wheelScroll(e,{
x:0,
y:-(e.wheelDelta / 40 * 50)
});
}
// ------------------------------
// 擬似スクロール(内部用)
// ------------------------------
function wheelScroll(e,vector){
// 擬似スクロール
var p = WheelScrollFromElement(vector,_element_begin_area,_element_current);
if(p.result){
// 絶対座標系
if(project.getStylePositionPopupImage() == "absolute"){
// 移動
move({
x:-p.vector.x,
y:-p.vector.y
});
}
if(e.preventDefault){
e.preventDefault();
}else{
return false;
}
}
}
// ------------------------------
// スクロール合計位置を取得(内部用)
// ------------------------------
function getScrollPositionTotal(node){
var pos = {x:0,y:0};
node = node.parentNode;
while(node){
if(node.scrollLeft) pos.x += node.scrollLeft;
if(node.scrollTop ) pos.y += node.scrollTop;
node = node.parentNode;
}
return pos;
}
// ------------------------------
// タスク生成(内部用)
// ------------------------------
function createTask(){
// 再構築
if(_task){
var work = _task.getUserWork();
switch(work.type){
case "fade_out":
_task.setExecuteFunc(PopupImageClose);
_task.execute(0xffffffff);
break;
}
}
// Shift キー押下で無視
if(input_mouse.getKeyShift()) return;
// ドラッグ中は無視
if(input_mouse.getButtonLeft()) return;
// タスクを生成
if(!_task){
// タッチイベントを外す
removeEventTouchStart();
_task = task_container.createTask();
_task.setLevel(TASK_EXECUTE_LEVEL_POPUP);
_task.setDestructorFunc(PopupImageDestructor);
_task.setExecuteFunc(PopupImageInitialize);
_task.execute(0xffffffff);
}
}
// ------------------------------
// マウスムーブ(内部用)
// ------------------------------
function mouseMove(){
if(!_task) return;
var work = _task.getUserWork();
var mouse_pos = ObjectCopy(input_mouse.getPositionClient());
var hit = ElementHitTestPosition(_element_hit_area,mouse_pos,true);
if(!hit){
if(_element_rects_tree){
if(_element_hit_area){
if(DomNodeGetAttachedDocument(_element_hit_area)){
var scroll_pos = getScrollPositionTotal(_element_hit_area);
_scroll_pos_offset.x += scroll_pos.x - _scroll_pos_begin.x;
_scroll_pos_offset.y += scroll_pos.y - _scroll_pos_begin.y;
_scroll_pos_begin = scroll_pos;
}
}
mouse_pos.x += _scroll_pos_offset.x;
mouse_pos.y += _scroll_pos_offset.y;
hit = _element_rects_tree.hitTestPosition(mouse_pos,true);
if(!hit) _element_rects_tree = null;
}
}
if(!input_mouse.getEnableMouse()){
hit = false;
}
// アニメーション
if(project.getEnableAnimationPopupImage()){
if(hit){
switch(work.type){
case "wait_before_close":
// 表示へ
_task.setExecuteFunc(PopupImageShowInit);
_task.execute(0xffffffff);
break;
case "fade_out":
// 開く
_task.setExecuteFunc(PopupImageBeforeOpenInit);
_task.execute(0xffffffff);
break;
}
}else{
switch(work.type){
case "wait_before_open":
// 閉じる
_task.setExecuteFunc(PopupImageClose);
_task.execute(0xffffffff);
break;
case "fade_in":
// フェードアウトへ
_task.setExecuteFunc(PopupImageFadeOut);
_task.execute(0xffffffff);
break;
case "show":
// フェードアウト待機へ
_task.setExecuteFunc(PopupImageWaitBeforeClose);
_task.execute(0xffffffff);
break;
}
}
}else{
if(hit){
switch(work.type){
case "wait_before_close":
// 表示へ
_task.setExecuteFunc(PopupImageShowInit);
_task.execute(0xffffffff);
break;
}
}else{
switch(work.type){
case "wait_before_open":
// 閉じる
_task.setExecuteFunc(PopupImageClose);
_task.execute(0xffffffff);
break;
case "show":
// フェードアウト待機へ
_task.setExecuteFunc(PopupImageWaitBeforeClose);
_task.execute(0xffffffff);
break;
}
}
}
if(!hit){
// タッチイベントを開始
addEventTouchStart();
}
}
// ------------------------------
// スクロール補正(内部用)
// ------------------------------
function reviseScroll(vec){
if(_task){
var work = _task.getUserWork();
var begin_rect = work.begin_rect;
var end_rect = work.end_rect;
begin_rect.left += vec.x;
begin_rect.right += vec.x;
begin_rect.top += vec.y;
begin_rect.bottom += vec.y;
end_rect.left += vec.x;
end_rect.right += vec.x;
end_rect.top += vec.y;
end_rect.bottom += vec.y;
_scroll_pos_begin.x += vec.x;
_scroll_pos_begin.y += vec.y;
PopupImageSizeUpdate(_task);
}
}
// ------------------------------
// 移動(内部用)
// ------------------------------
function move(vec){
if(_task){
var work = _task.getUserWork();
var begin_rect = work.begin_rect;
var end_rect = work.end_rect;
begin_rect.left += vec.x;
begin_rect.right += vec.x;
begin_rect.top += vec.y;
begin_rect.bottom += vec.y;
end_rect.left += vec.x;
end_rect.right += vec.x;
end_rect.top += vec.y;
end_rect.bottom += vec.y;
PopupImageSizeUpdate(_task);
}
}
// ------------------------------
// 初期化(内部用)
// ------------------------------
function PopupImageInitialize(task){
var work = task.getUserWork();
work.type = "initialize";
work.anime_pos = 0.0;
work.anime_spd = 0.0;
_element_rects_tree = null;
if(_element_hit_area){
_element_rects_tree = new ElementClientRectsTree(_element_hit_area);
_scroll_pos_begin = getScrollPositionTotal(_element_hit_area);
_scroll_pos_offset = {x:0,y:0};
}
task.setExecuteFunc(PopupImageBeforeOpenInit);
task.execute(0xffffffff);
}
// ------------------------------
// オープン前待機(内部用)
// ------------------------------
function PopupImageBeforeOpenInit(task){
var work = task.getUserWork();
work.type = "wait_before_open";
work.frame = project.getTimeWaitOpenPopupImage() / 1000 * 60;
task.setExecuteFunc(PopupImageBeforeOpenExec);
task.execute(0xffffffff);
}
function PopupImageBeforeOpenExec(task){
var work = task.getUserWork();
// マウスムーブ
mouseMove();
work.frame -= 1;
if(work.frame < 0){
task.setExecuteFunc(PopupImageOpen);
task.execute(0xffffffff);
return;
}
}
// ------------------------------
// ポップアップイメージを開く(内部用)
// ------------------------------
function PopupImageOpen(task){
var work = task.getUserWork();
work.type = "open";
// デフォルトのスタイル
ElementSetStyle(_image,CSSTextGetInitialImageElement());
// スタイルを追加
ElementAddStyle(_element_current,project.getStyleSheetExpandImagePopup());
// 最前面
_element_current.style.zIndex = 0x7FFFFFFF - 1;
_element_current.style.position = project.getStylePositionPopupImage();
_element_current.style.left = "0px";
_element_current.style.top = "0px";
_element_current.style.width = "0px";
_element_current.style.height = "0px";
if(_this.ontrim){
_this.ontrim();
}
if(_trim_rect){
_image.style.position = "absolute";
}
var window_obj = window_manager.getWindowRoot();
var document_obj = window_obj.document;
var client_size = DocumentGetClientSize(document_obj);
var client_rect = {
left :1,
top :1,
right :client_size.width - 1,
bottom:client_size.height - 1
};
// スタイルのサイズを取得
_element_parent.appendChild(_element_current);
var bounding_size = ElementGetBoundingClientRect(_element_current);
work.style_w = bounding_size.right - bounding_size.left;
work.style_h = bounding_size.bottom - bounding_size.top;
// ネイティブサイズ
var natural_size = ImageGetNaturalSize(_image);
if(_trim_rect){
natural_size.width = _trim_rect.width;
natural_size.height = _trim_rect.height;
}
// 開始矩形
var begin_rect;
if(_element_begin_area){
if(DomNodeGetAttachedDocument(_element_begin_area)){
if(_trim_rect){
begin_rect = ElementGetViewClientRect(_element_begin_area);
}else{
begin_rect = DomTreeGetContentClientRect(_element_begin_area);
}
}
}
if(!begin_rect){
// マウス座標をセット
var w = work.style_w * 0.5;
var h = work.style_h * 0.5;
var mouse_pos = input_mouse.getPositionClient();
begin_rect = new Object();
begin_rect.left = mouse_pos.x - w;
begin_rect.right = mouse_pos.x + w;
begin_rect.top = mouse_pos.y - h;
begin_rect.bottom = mouse_pos.y + h;
}
var offset = window_manager.getPositionFromRoot();
begin_rect.left += offset.x;
begin_rect.right += offset.x;
begin_rect.top += offset.y;
begin_rect.bottom += offset.y;
// 拡大縮小補正
var pixel_ratio = WindowGetDevicePixelRatio(window);
pixel_ratio = 1 / pixel_ratio;
if(pixel_ratio < 1.0) pixel_ratio = 1.0;
// 終了サイズ
var scale = project.getScalePercentPopupImage() / 100 * pixel_ratio;
var end_w = natural_size.width * scale;
var end_h = natural_size.height * scale;
_element_current.style.width = (end_w) + "px";
_element_current.style.height = (end_h) + "px";
var statusbar_h = 24;
// クライアントサイズを修正
switch(project.getOriginPopupImage()){
case "adsorb_element":
client_rect.bottom -= statusbar_h;
var rect = {
left :begin_rect.left - 1,
right :begin_rect.right + 1,
top :begin_rect.top - 1,
bottom:begin_rect.bottom + 1
};
var l = rect.left - client_rect.left;
var r = client_rect.right - rect.right;
var t = rect.top - client_rect.top;
var b = client_rect.bottom - rect.bottom;
var w0;
var h0;
if(l < r) w0 = r;
else w0 = l;
if(t < b) h0 = b;
else h0 = t;
var w1 = natural_size.width * h0 / natural_size.height;
var h1 = natural_size.height * w0 / natural_size.width;
if(w1 > client_size.width) w1 = client_size.width;
if(h1 > client_size.height) h1 = client_size.height;
if(w0 * h1 > h0 * w1){
if(l > r) client_rect.right = rect.left;
else client_rect.left = rect.right;
}else{
if(t > b) client_rect.bottom = rect.top;
else client_rect.top = rect.bottom;
}
break;
case "adsorb_mouse":
client_rect.bottom -= statusbar_h;
var distance = 10;
var mouse_pos = input_mouse.getPositionClient();
mouse_pos.x += offset.x;
mouse_pos.y += offset.y;
var l = (mouse_pos.x - distance) - client_rect.left;
var r = client_rect.right - (mouse_pos.x + distance);
var t = (mouse_pos.y - distance) - client_rect.top;
var b = client_rect.bottom - (mouse_pos.y + distance);
var w0;
var h0;
if(l < r) w0 = r;
else w0 = l;
if(t < b) h0 = b;
else h0 = t;
var w1 = natural_size.width * h0 / natural_size.height;
var h1 = natural_size.height * w0 / natural_size.width;
if(w1 > client_size.width) w1 = client_size.width;
if(h1 > client_size.height) h1 = client_size.height;
if(w0 * h1 > h0 * w1){
if(l > r) client_rect.right = (mouse_pos.x - distance);
else client_rect.left = (mouse_pos.x + distance);
}else{
if(t > b) client_rect.bottom = (mouse_pos.y - distance);
else client_rect.top = (mouse_pos.y + distance);
}
break;
}
// 幅と高さがクライアント領域を超える場合補正
client_rect.width = client_rect.right - client_rect.left;
client_rect.height = client_rect.bottom - client_rect.top;
if(client_rect.width < end_w + work.style_w){
var w = (client_rect.width - work.style_w);
end_h *= w / end_w;
end_w = w;
}
if(client_rect.height < end_h + work.style_h){
var h = (client_rect.height - work.style_h);
end_w *= h / end_h;
end_h = h;
}
// 終了座標
var end_x;
var end_y;
switch(project.getOriginPopupImage()){
default:
case "center":
var x = (begin_rect.right + begin_rect.left) * 0.5;
var y = (begin_rect.bottom + begin_rect.top) * 0.5;
end_x = x - ((end_w + work.style_w) * 0.5);
end_y = y - ((end_h + work.style_h) * 0.5);
if(begin_rect.right - begin_rect.left < work.style_w){
begin_rect.left = x - work.style_w / 2;
begin_rect.right = begin_rect.left + work.style_w;
}
if(begin_rect.bottom - begin_rect.top < work.style_h){
begin_rect.top = y - work.style_h / 2;
begin_rect.bottom = begin_rect.top + work.style_h;
}
break;
case "upper_left":
end_x = begin_rect.left;
end_y = begin_rect.top;
break;
case "upper_right":
end_x = begin_rect.right - end_w;
end_y = begin_rect.top;
break;
case "client_center":
end_x = (client_rect.width * 0.5) - ((end_w + work.style_w) * 0.5);
end_y = (client_rect.height * 0.5) - ((end_h + work.style_h) * 0.5);
var x = (begin_rect.right + begin_rect.left) * 0.5;
var y = (begin_rect.bottom + begin_rect.top) * 0.5;
if(begin_rect.right - begin_rect.left < work.style_w){
begin_rect.left = x - work.style_w / 2;
begin_rect.right = begin_rect.left + work.style_w;
}
if(begin_rect.bottom - begin_rect.top < work.style_h){
begin_rect.top = y - work.style_h / 2;
begin_rect.bottom = begin_rect.top + work.style_h;
}
break;
}
begin_rect.right -= work.style_w;
begin_rect.bottom -= work.style_h;
work.begin_rect = begin_rect;
if(end_x < client_rect.left) end_x = client_rect.left;
if(end_y < client_rect.top ) end_y = client_rect.top ;
if(end_x + end_w + work.style_w > client_rect.right ) end_x = client_rect.right - end_w - work.style_w;
if(end_y + end_h + work.style_h > client_rect.bottom) end_y = client_rect.bottom - end_h - work.style_h;
var end_rect = new Object();
end_rect.left = end_x;
end_rect.top = end_y;
end_rect.right = end_rect.left + end_w;
end_rect.bottom = end_rect.top + end_h;
work.end_rect = end_rect;
// 絶対座標系
if(project.getStylePositionPopupImage() == "absolute"){
// 絶対座標系に変更
begin_rect.left -= bounding_size.left;
begin_rect.top -= bounding_size.top;
begin_rect.right -= bounding_size.left;
begin_rect.bottom -= bounding_size.top;
end_rect.left -= bounding_size.left;
end_rect.top -= bounding_size.top;
end_rect.right -= bounding_size.left;
end_rect.bottom -= bounding_size.top;
if(!(window_manager.existWindowRoot())){
// イベントハンドラを作成
_event_handler_revise_scroll = page_expand_event_dispatcher.createEventHandler("revise_scroll");
_event_handler_revise_scroll.setFunction(reviseScroll);
}
}
// スケール未対応
if(!project.getEnableScaleAnimationPopupImage()){
work.begin_rect = end_rect;
PopupImageSizeUpdate(task);
}
// アルファ未対応
if(!project.getEnableAlphaAnimationPopupImage()){
PopupImageSetAlpha(task,1.0);
}
// マウスイベント有効化
_element_current.style.pointerEvents = "auto";
if(project.getEnableAnimationPopupImage()){
task.setExecuteFunc(PopupImageFadeIn);
}else{
task.setExecuteFunc(PopupImageShowInit);
}
task.execute(0xffffffff);
}
// ------------------------------
// フェードイン(内部用)
// ------------------------------
function PopupImageFadeIn(task){
var work = task.getUserWork();
work.type = "fade_in";
// マウスムーブ
mouseMove();
var sub = 1.0 - work.anime_pos;
sub *= 0.4;
if(sub > 0.0){
work.anime_spd += 0.05;
if(work.anime_spd > 0.2) work.anime_spd = 0.2;
if(work.anime_spd > sub) work.anime_spd = sub;
}
work.anime_pos += work.anime_spd;
if(work.anime_pos > 0.999){
work.anime_spd = 0.0;
work.anime_pos = 1.0;
task.setExecuteFunc(PopupImageShowInit);
}
if(project.getEnableAlphaAnimationPopupImage()){
PopupImageSetAlpha(task,work.anime_pos);
}
if(project.getEnableScaleAnimationPopupImage()){
PopupImageSizeUpdate(task);
}
}
// ------------------------------
// 表示(内部用)
// ------------------------------
function PopupImageShowInit(task){
var work = task.getUserWork();
work.type = "show";
work.anime_pos = 1.0;
work.anime_spd = 0.0;
work.frame = project.getTimeWaitClosePopupImage() / 1000 * 60;
if(project.getEnableAlphaAnimationPopupImage()){
PopupImageSetAlpha(task,work.anime_pos);
}
if(project.getEnableScaleAnimationPopupImage()){
PopupImageSizeUpdate(task);
}
task.setExecuteFunc(PopupImageShowExec);
task.execute(0xffffffff);
}
function PopupImageShowExec(task){
var work = task.getUserWork();
// マウスムーブ
mouseMove();
}
// ------------------------------
// 待機(内部用)
// ------------------------------
function PopupImageWaitBeforeClose(task){
var work = task.getUserWork();
work.type = "wait_before_close";
// マウスムーブ
mouseMove();
work.frame -= 1;
if(work.frame < 0){
// アニメーション
if(project.getEnableAnimationPopupImage()){
// マウスイベント無効化
_element_current.style.pointerEvents = "none";
task.setExecuteFunc(PopupImageFadeOut);
}else{
task.setExecuteFunc(PopupImageClose);
}
}
}
// ------------------------------
// フェードアウト(内部用)
// ------------------------------
function PopupImageFadeOut(task){
var work = task.getUserWork();
work.type = "fade_out";
// マウスムーブ
mouseMove();
var sub = 0.0 - work.anime_pos;
sub *= 0.4;
if(sub < 0.0){
work.anime_spd -= 0.2;
if(work.anime_spd < sub) work.anime_spd = sub;
}
work.anime_pos += work.anime_spd;
if(work.anime_pos < 0.001){
work.anime_spd = 0.0;
work.anime_pos = 0.0;
task.setExecuteFunc(PopupImageClose);
}
if(project.getEnableAlphaAnimationPopupImage()){
PopupImageSetAlpha(task,work.anime_pos);
}
if(project.getEnableScaleAnimationPopupImage()){
PopupImageSizeUpdate(task);
}
}
// ------------------------------
// 閉じる(内部用)
// ------------------------------
function PopupImageClose(task){
var work = task.getUserWork();
task.release();
}
// ------------------------------
// デストラクタ(内部用)
// ------------------------------
function PopupImageDestructor(task){
// 解放
if(_event_handler_revise_scroll){
_event_handler_revise_scroll.release();
_event_handler_revise_scroll = null;
}
DomNodeRemove(_element_current);
_task = null;
// 自殺
if(_suicide){
_this.release();
}
}
// ------------------------------
// サイズ更新(内部用)
// ------------------------------
function PopupImageSizeUpdate(task){
var work = task.getUserWork();
var begin_rect = work.begin_rect;
var end_rect = work.end_rect;
var d = work.anime_pos;
var l = (end_rect.left - begin_rect.left ) * d + begin_rect.left;
var r = (end_rect.right - begin_rect.right ) * d + begin_rect.right;
var t = (end_rect.top - begin_rect.top ) * d + begin_rect.top;
var b = (end_rect.bottom - begin_rect.bottom) * d + begin_rect.bottom;
var w = r - l;
var h = b - t;
var style = _element_current.style;
style.left = (l) + "px";
style.top = (t) + "px";
style.width = (w) + "px";
style.height = (h) + "px";
if(_trim_rect){
var style = _image.style;
var natural_size = ImageGetNaturalSize(_image);
var computed_style = ElementGetComputedStyle(_element_current,null);
var padding_rect = ComputedStyleGetPaddingWidth(computed_style);
var sx = w / _trim_rect.width;
var sy = h / _trim_rect.height;
l = _trim_rect.left * sx;
t = _trim_rect.top * sy;
r = l + w;
b = t + h;
style.left = (-l + padding_rect.left) + "px";
style.top = (-t + padding_rect.top ) + "px";
style.width = (natural_size.width * sx) + "px";
style.height = (natural_size.height * sy) + "px";
style.clip = "rect(" + (t) + "px " + (r) + "px " + (b) + "px " + (l) + "px)";
}
}
// ------------------------------
// 透明度セット(内部用)
// ------------------------------
function PopupImageSetAlpha(task,v){
var work = task.getUserWork();
_element_current.style.opacity = v;
}
// ------------------------------
// トリミング要求イベント
// ------------------------------
_this.ontrim = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _element_parent;
var _element_hit_area;
var _element_begin_area;
var _element_current;
var _task;
var _trim_rect;
var _image;
var _suicide;
var _element_rects_tree;
var _scroll_pos_begin;
var _scroll_pos_offset;
var _analyze_work;
var _observer_remove;
var _event_handler_revise_scroll;
var _event_handler_release;
var _input_mouse_current;
var _original_url;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element_hit_area = null;
_element_begin_area = null;
_task = null;
_image = image;
_element_current = _image;
_suicide = false;
_element_rects_tree = null;
if(window_manager.existWindowRoot()){
_input_mouse_current = new InputMouse(window_manager.getWindowRoot());
_input_mouse_current.setInputMouse(input_mouse);
}else{
_input_mouse_current = input_mouse;
}
_original_url = "";
image = null;
// リスト
popup_image_container.initializePopupImage(_this);
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_image);
// 解析済み
AnalyzeWorkSetAnalyzedPopupReducedImage(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
if(window_manager.existWindowRoot()) attach_options.SetGuest();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// イベント
addEventClick();
addEventWheel();
_event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// ポップアップイメージコンテナ
// ------------------------------
function PopupImageContainer(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
while(_this != _this._next){
_this.remove(_this._next);
}
};
// ------------------------------
// 登録
// ------------------------------
_this.attach = function(popup_image){
_this.remove(popup_image);
var element = popup_image._element_anchor;
var list = _this._prev;
if(element.compareDocumentPosition){
while(list != _this){
var doc_pos = element.compareDocumentPosition(list._element_anchor);
if(doc_pos & document.DOCUMENT_POSITION_PRECEDING){
break;
}
list = list._prev;
}
}
var _prev = list;
var _next = _prev._next;
_prev._next = popup_image;
_next._prev = popup_image;
popup_image._prev = _prev;
popup_image._next = _next;
_count += 1;
};
// ------------------------------
// 除外
// ------------------------------
_this.remove = function(popup_image){
if(popup_image != popup_image._next){
var _prev = popup_image._prev;
var _next = popup_image._next;
_prev._next = _next;
_next._prev = _prev;
popup_image._prev = popup_image;
popup_image._next = popup_image;
_count -= 1;
}
};
// ------------------------------
// ポップアップイメージを初期化
// ------------------------------
_this.initializePopupImage = function(popup_image){
popup_image._prev = popup_image;
popup_image._next = popup_image;
};
// ------------------------------
// 1つ前のポップアップイメージを取得
// ------------------------------
_this.getPrev = function(popup_image){
var list = popup_image._prev;
if(list == popup_image) return null;
if(list == _this) return null;
return list;
};
// ------------------------------
// 1つ後のポップアップイメージを取得
// ------------------------------
_this.getNext = function(popup_image){
var list = popup_image._next;
if(list == popup_image) return null;
if(list == _this) return null;
return list;
};
// ------------------------------
// ポップアップイメージの位置を取得
// ------------------------------
_this.getIndex = function(popup_image){
var id = 0;
var list = _this._next;
while(list != _this){
if(list == popup_image){
break;
}
id += 1;
list = list._next;
}
return id;
};
// ------------------------------
// 総数を取得
// ------------------------------
_this.getCount = function(){
return _count;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _count;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_this._prev = _this;
_this._next = _this;
_count = 0;
})();
}
// ------------------------------
// イメージビューワ
// ------------------------------
function ImageViewer(popup_image){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
release_0();
release_1();
};
// ------------------------------
// マウス操作をセット
// ------------------------------
_this.setInputMouse = function(input_mouse){
_input_mouse.setInputMouse(input_mouse);
_prevent_context_menu = _input_mouse.getButtonRight();
_prevent_click = _input_mouse.getButtonLeft();
};
// ------------------------------
// 自殺(内部用)
// ------------------------------
function suicide(){
release_0();
(function(){
if(_fade_task){
_fade_task.release();
_fade_task = null;
}
_fade_task = task_container.createTask();
_fade_task.setDestructorFunc(function(){
_fade_task = null;
});
_fade_task.setExecuteFunc(function(){
_fade_alpha -= 0.2;
if(_fade_alpha < 0.0){
_fade_alpha = 0.0;
_fade_task.release();
release_1();
}
_element_viewer.style.opacity = _fade_alpha;
});
_fade_task.execute(0xffffffff);
})();
task_execute_level |= TASK_EXECUTE_LEVEL_POPUP;
}
// ------------------------------
// 開放 0(内部用)
// ------------------------------
function release_0 (){
removeEvent();
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
// マウスイベント無効化
_element_viewer.style.pointerEvents = "none";
// スタイルを戻す
var i;
var num = _style_overflow_list.length;
for(i=0;i<num;i++){
var item = _style_overflow_list.pop();
var style = item.element.style;
if(item.value === undefined){
}else if(item.value){
StyleDeclarationSetProperty(style,"overflow",item.value);
}else{
StyleDeclarationRemoveProperty(style,"overflow");
}
}
};
// ------------------------------
// 開放 1(内部用)
// ------------------------------
function release_1 (){
removeImage();
DomNodeRemove(_element_viewer);
if(_input_mouse){
if(window_manager.existWindowRoot()){
_input_mouse.release();
}
_input_mouse = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
// 解析辞書除外
if(_analyze_work_viewer){
analyze_work_dictionary.removeAnalyzeWork(_analyze_work_viewer);
_analyze_work_viewer = null;
}
// タスク破棄
if(_parent_task){
_parent_task.releaseChild();
_parent_task.release();
_parent_task = null;
}
};
// ------------------------------
// イベントを追加(内部用)
// ------------------------------
function addEvent(){
removeEvent();
if(_element_viewer.addEventListener){
_element_container.addEventListener("mousedown",mouseDown,false);
_element_viewer.addEventListener("mousemove",mouseMove,false);
_element_viewer.addEventListener("mouseup",mouseUp,false);
_element_viewer.addEventListener("contextmenu",mouseContextMenu,false);
_element_window.addEventListener("scroll",scroll,false);
if(window.MouseScrollEvent){
_element_window.addEventListener("DOMMouseScroll",mouseScroll,false);
}else{
_element_window.addEventListener("mousewheel",mouseWheel,false);
}
_element_window.addEventListener("dragstart",dragStart,false);
_window_root.addEventListener("resize",resize,false);
}else if(_element_viewer.attachEvent){
_element_container.attachEvent("onmousedown",mouseDown);
_element_viewer.attachEvent("onmousemove",mouseMove);
_element_viewer.attachEvent("onmouseup",mouseUp);
_element_viewer.attachEvent("oncontextmenu",mouseContextMenu);
_element_window.attachEvent("onscroll",scroll);
_element_window.attachEvent("onmousewheel",mouseWheel);
_element_window.attachEvent("ondragstart",dragStart);
_window_root.attachEvent("onresize",resize);
}
}
// ------------------------------
// イベントを破棄(内部用)
// ------------------------------
function removeEvent(){
if(_element_viewer.removeEventListener){
_element_container.removeEventListener("mousedown",mouseDown,false);
_element_viewer.removeEventListener("mousemove",mouseMove,false);
_element_viewer.removeEventListener("mouseup",mouseUp,false);
_element_viewer.removeEventListener("contextmenu",mouseContextMenu,false);
_element_window.removeEventListener("scroll",scroll,false);
if(window.MouseScrollEvent){
_element_window.removeEventListener("DOMMouseScroll",mouseScroll,false);
}else{
_element_window.removeEventListener("mousewheel",mouseWheel,false);
}
_element_window.removeEventListener("dragstart",dragStart,false);
_window_root.removeEventListener("resize",resize,false);
}else if(_element_viewer.detachEvent){
_element_container.detachEvent("onmousedown",mouseDown);
_element_viewer.detachEvent("onmousemove",mouseMove);
_element_viewer.detachEvent("onmouseup",mouseUp);
_element_viewer.detachEvent("oncontextmenu",mouseContextMenu);
_element_window.detachEvent("onscroll",scroll);
_element_window.detachEvent("onmousewheel",mouseWheel);
_element_window.detachEvent("ondragstart",dragStart);
_window_root.detachEvent("onresize",resize);
}
}
// ------------------------------
// マウスダウンイベント(内部用)
// ------------------------------
function mouseDown(e){
// マウス入力を更新
_input_mouse.setMouseEvent(e);
if(_input_mouse.getButtonLeft()){
if(_mouse_buttons & 0x01){
}else{
_mouse_buttons |= 0x01;
_translate_work.working = false;
_translate_work.pos_old = _input_mouse.getPositionClient();
}
}
if(_input_mouse.getButtonRight()){
if(_mouse_buttons & 0x02){
}else{
_mouse_buttons |= 0x02;
_transform_work.working = false;
_transform_work.mouse_start = _input_mouse.getPositionClient();
_transform_work.origin = ObjectCopy(_image_origin);
_transform_work.scale = ObjectCopy(_image_scale);
_transform_work.zoom = ObjectCopy(_image_zoom);
_transform_work.rotate = ObjectCopy(_image_rotate);
_transform_work.pos = ObjectCopy(_image_pos);
_transform_work.center = ObjectCopy(_image_center);
}
}
if(
(_input_mouse.getButtonCenter()) ||
(_input_mouse.getButtonLeft() && _input_mouse.getButtonRight())
){
suicide();
}
}
// ------------------------------
// マウスダウンイベント(内部用)
// ------------------------------
function mouseMove(e){
// マウス入力を更新
_input_mouse.setMouseEvent(e);
if(_mouse_buttons & 0x01){
var pos = _input_mouse.getPositionClient();
var old = _translate_work.pos_old;
var vec_x = pos.x - old.x;
var vec_y = pos.y - old.y;
if(Math.sqrt(vec_x * vec_x + vec_y * vec_y) >= 3.0){
_translate_work.working = true;
_prevent_click = true;
}
if(_translate_work.working){
if(vec_x || vec_y){
_element_window.scrollLeft -= vec_x;
_element_window.scrollTop -= vec_y;
_translate_work.pos_old = pos;
}
}
}
if(_mouse_buttons & 0x02){
updateTransform();
}
if(_translate_work.working){
setCursor("move");
}else if(_transform_work.working){
setCursor("crosshair");
}else{
initCursor();
}
}
// ------------------------------
// マウスアップイベント(内部用)
// ------------------------------
function mouseUp(e){
// マウス入力を更新
_input_mouse.setMouseEvent(e);
if(_mouse_buttons & 0x01){
if(!_input_mouse.getButtonLeft()){
_mouse_buttons &= ~0x01;
_translate_work.working = false;
if(!_prevent_click){
gotoScaleMode(1);
}
_prevent_click = false;
}
}
if(_mouse_buttons & 0x02){
if(!_input_mouse.getButtonRight()){
_mouse_buttons &= ~0x02;
_transform_work.working = false;
DomNodeRemove(_element_transform);
}
}
if(_prevent_click){
}else{
initCursor();
}
}
// ------------------------------
// マウスコンテキストメニューイベント(内部用)
// ------------------------------
function mouseContextMenu(e){
// マウス入力を更新
_input_mouse.setMouseEvent(e);
_prevent_context_menu = true;
// 装飾キー押下で無視
if(_input_mouse.getKeyShift() || _input_mouse.getKeyCtrl()){
_prevent_context_menu = false;
}
// デフォルトの動作を無効化
if(_prevent_context_menu){
_prevent_context_menu = false;
if(e.preventDefault){
e.preventDefault();
}else{
return false;
}
}
}
// ------------------------------
// マウススクロールイベント(内部用)
// ------------------------------
function mouseScroll(e){
wheel(e,e.detail);
}
// ------------------------------
// マウスホイールイベント(内部用)
// ------------------------------
function mouseWheel(e){
wheel(e,-(e.wheelDelta / 40));
}
// ------------------------------
// ホイール回転(内部用)
// ------------------------------
function wheel(e,delta){
// マウス入力を更新
_input_mouse.setMouseEvent(e);
var cancel = false;
if(_input_mouse.getButtonRight()){
_prevent_context_menu = true;
gotoImage(delta);
_transform_work.working = false;
DomNodeRemove(_element_transform);
_transform_work.mouse_start = _input_mouse.getPositionClient();
cancel = true;
}
if(_input_mouse.getButtonLeft()){
if(delta > 0){
setCursor("zoom-out");
}else{
setCursor("zoom-in");
}
addScale(-delta);
_prevent_click = true;
cancel = true;
}
if(cancel){
_prevent_context_menu = true;
// デフォルトの動作を無効化
if(e.preventDefault){
e.preventDefault();
}else{
return false;
}
}
}
// ------------------------------
// スクロールイベント(内部用)
// ------------------------------
function scroll(e){
if(_prevent_scroll){
_prevent_scroll = false;
return;
}
if(WindowGetDevicePixelRatio(window) != _pixel_ratio){
return;
}
var pos_x = _element_window.scrollLeft;
var pos_y = _element_window.scrollTop;
var max_x = _element_window.scrollWidth - _element_window.clientWidth;
var max_y = _element_window.scrollHeight - _element_window.clientHeight;
var client_w = _element_window.clientWidth;
var client_h = _element_window.clientHeight;
var mtx = new Matrix32();
mtx.translate(-_image_origin.x,-_image_origin.y);
mtx.scale(_image_scale.x,_image_scale.y);
mtx.rotate(_image_rotate * Math.PI / 180);
mtx.translate(_image_pos.x,_image_pos.y);
mtx.invert();
_image_center = mtx.transformPosition({x:pos_x + client_w * 0.5,y:pos_y + client_h * 0.5});
var r = 1;
if(pos_x <= r){
}else if(pos_y <= r){
}else if(pos_x >= max_x - r){
}else if(pos_y >= max_y - r){
}else{
return;
}
suicide();
}
// ------------------------------
// リサイズイベント(内部用)
// ------------------------------
function resize(e){
var client_size = DocumentGetClientSize(_window_root.document);
var style = _element_viewer.style;
style.width = (client_size.width) + "px";
style.height = (client_size.height) + "px";
_pixel_ratio = WindowGetDevicePixelRatio(window);
_image_scale.y = _image_scale.x = _image_zoom / _pixel_ratio;
var mtx = new Matrix32();
mtx.translate(-_image_origin.x,-_image_origin.y);
mtx.scale(_image_scale.x,_image_scale.y);
mtx.rotate(_image_rotate * Math.PI / 180);
var vtx = new Array();
vtx.push(mtx.transformPosition({x:-_image_origin.x , y:-_image_origin.y}));
vtx.push(mtx.transformPosition({x:-_image_origin.x , y: _image_origin.y}));
vtx.push(mtx.transformPosition({x: _image_origin.x , y:-_image_origin.y}));
vtx.push(mtx.transformPosition({x: _image_origin.x , y: _image_origin.y}));
var min_x = vtx[0].x;
var max_x = vtx[0].x;
var min_y = vtx[0].y;
var max_y = vtx[0].y;
var i;
var num = vtx.length;
for(i=1;i<num;i++){
var p = vtx[i];
if(min_x > p.x) min_x = p.x;
if(max_x < p.x) max_x = p.x;
if(min_y > p.y) min_y = p.y;
if(max_y < p.y) max_y = p.y;
}
var client_w = _element_window.clientWidth;
var client_h = _element_window.clientHeight;
var background_w = (client_w * 2) + (max_x - min_x);
var background_h = (client_h * 2) + (max_y - min_y);
_prevent_scroll = true;
var style = _element_background.style;
style.width = (background_w) + "px";
style.height = (background_h) + "px";
_image_pos = {x:background_w * 0.5,y:background_h * 0.5};
mtx.translate(_image_pos.x,_image_pos.y);
StyleDeclarationSetTransform(_element_image.style,mtx.toString());
var vec = mtx.transformPosition(_image_center);
_element_window.scrollLeft = vec.x - client_w * 0.5;
_element_window.scrollTop = vec.y - client_h * 0.5;
}
// ------------------------------
// ドラッグ開始イベント(内部用)
// ------------------------------
function dragStart(e){
// デフォルトの動作を無効化する
if(e.preventDefault){
e.preventDefault();
}else{
return false;
}
}
// ------------------------------
// 画像更新(内部用)
// ------------------------------
function updateImage(popup_image){
var image = popup_image.getImage();
var image_size = ImageGetNaturalSize(image);
removeImage();
_element_image = DocumentCreateElement("img");
ElementSetStyle(_element_image,CSSTextGetInitialImageElement());
ElementAddStyle(_element_image,"position:absolute; left:0px; top:0px; border:5px solid #666; cursor:inherit;");
var style = _element_image.style;
style.width = (image_size.width) + "px";
style.height = (image_size.height) + "px";
_element_image.src = image.src;
// 解析ワーク作成
_analyze_work_image = AnalyzeWorkCreate(_element_image);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work_image);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
if(window_manager.existWindowRoot()) attach_options.SetGuest();
analyze_work_dictionary.attachAnalyzeWork(_analyze_work_image,attach_options);
_element_container.appendChild(_element_image);
updateScaleMode();
}
// ------------------------------
// 画像除外(内部用)
// ------------------------------
function removeImage(){
if(_analyze_work_image){
analyze_work_dictionary.removeAnalyzeWork(_analyze_work_image);
_analyze_work_image = null;
}
if(_element_image){
DomNodeRemove(_element_image);
_element_image = null;
}
}
// ------------------------------
// スケールモード更新(内部用)
// ------------------------------
function updateScaleMode(){
var image = _popup_image.getImage();
var image_size = ImageGetNaturalSize(image);
var border_width = 5;
var actual_w = (image_size.width + border_width * 2) / _pixel_ratio;
var actual_h = (image_size.height + border_width * 2) / _pixel_ratio;
var client_w = _element_window.clientWidth;
var client_h = _element_window.clientHeight;
var scale_mode = _scale_mode;
if(scale_mode == ImageViewer.SCALE_MODE_AUTO){
if((actual_w < client_w) && (actual_h < client_h)){
scale_mode = ImageViewer.SCALE_MODE_NO_SCALE;
}else{
var scale_x = 1.0 / _pixel_ratio;
if(actual_w > client_w){
scale_x *= client_w / actual_w;
}
if(actual_h * scale_x * 0.75 > client_h){
scale_mode = ImageViewer.SCALE_MODE_LONG_VERTICAL;
}else{
scale_mode = ImageViewer.SCALE_MODE_SHOW_ALL;
}
}
}
if(scale_mode == ImageViewer.SCALE_MODE_LONG_VERTICAL){
if((actual_w < client_w) && (actual_h < client_h)){
scale_mode = ImageViewer.SCALE_MODE_NO_SCALE;
}else if(actual_w > client_w){
var scale_y = client_w / actual_w;
if(actual_h * scale_y < client_h){
scale_mode = ImageViewer.SCALE_MODE_SHOW_ALL;
}
}
}
var scale_x = 1.0 / _pixel_ratio;
var scale_y = 1.0 / _pixel_ratio;
switch(scale_mode){
case ImageViewer.SCALE_MODE_LONG_VERTICAL:
if(actual_w > client_w){
scale_x *= client_w / actual_w;
scale_y = scale_x;
}
break;
case ImageViewer.SCALE_MODE_SHOW_ALL:
if(actual_w > client_w){
scale_x *= client_w / actual_w;
}
if(actual_h > client_h){
scale_y *= client_h / actual_h;
}
if(scale_x > scale_y){
scale_x = scale_y;
}else{
scale_y = scale_x;
}
break;
case ImageViewer.SCALE_MODE_SHOW_FULL:
scale_x *= client_w / actual_w;
scale_y *= client_h / actual_h;
if(scale_x > scale_y){
scale_x = scale_y;
}else{
scale_y = scale_x;
}
break;
}
_image_zoom = scale_x * _pixel_ratio;
var background_w = (client_w * 2) + actual_w * scale_x;
var background_h = (client_h * 2) + actual_h * scale_y;
_image_origin = {x:image_size.width * 0.5 + border_width , y:image_size.height * 0.5 + border_width};
_image_scale = {x:scale_x,y:scale_y};
_image_rotate = 0.0;
_image_pos = {x:background_w * 0.5,y:background_h * 0.5};
var pos_x = background_w * 0.5 - client_w * 0.5;
var pos_y;
switch(scale_mode){
case ImageViewer.SCALE_MODE_LONG_VERTICAL:
pos_y = background_h * 0.5 - (image_size.height + border_width * 2) * scale_y * 0.5;
break;
default:
pos_y = background_h * 0.5 - client_h * 0.5;
break;
}
_prevent_scroll = true;
var style = _element_background.style;
style.width = (background_w) + "px";
style.height = (background_h) + "px";
var mtx = new Matrix32();
mtx.translate(-_image_origin.x,-_image_origin.y);
mtx.scale(_image_scale.x,_image_scale.y);
mtx.rotate(_image_rotate * Math.PI / 180);
mtx.translate(_image_pos.x,_image_pos.y);
StyleDeclarationSetTransformOrigin(_element_image.style,"0% 0%");
StyleDeclarationSetTransform(_element_image.style,mtx.toString());
mtx.invert();
_image_center = mtx.transformPosition({x:pos_x + client_w * 0.5,y:pos_y + client_h * 0.5});
_element_window.scrollLeft = pos_x;
_element_window.scrollTop = pos_y;
}
// ------------------------------
// 回転拡大更新(内部用)
// ------------------------------
function updateTransform(){
var cx = _element_window.clientWidth * 0.5;
var cy = _element_window.clientHeight * 0.5;
var p0 = _transform_work.mouse_start;
var p1 = _input_mouse.getPositionClient();
var sx = p1.x - p0.x;
var sy = p1.y - p0.y;
var v0_x = p0.x - cx;
var v0_y = p0.y - cy;
var v1_x = p1.x - cx;
var v1_y = p1.y - cy;
var len0 = Math.sqrt(v0_x * v0_x + v0_y * v0_y);
var len1 = Math.sqrt(v1_x * v1_x + v1_y * v1_y);
var rad0 = Math.atan2(v0_y,v0_x);
var rad1 = Math.atan2(v1_y,v1_x);
if(!(_transform_work.working)){
if(len1 < 100){
}else if(Math.sqrt(sx * sx + sy * sy) < 3){
}else{
_prevent_context_menu = true;
_transform_work.working = true;
_transform_work.mouse_start = _input_mouse.getPositionClient();
_transform_work.origin = ObjectCopy(_image_origin);
_transform_work.scale = ObjectCopy(_image_scale);
_transform_work.zoom = ObjectCopy(_image_zoom);
_transform_work.rotate = ObjectCopy(_image_rotate);
_transform_work.pos = ObjectCopy(_image_pos);
_transform_work.center = ObjectCopy(_image_center);
}
return;
}
_image_zoom = _transform_work.zoom;
_image_rotate = _transform_work.rotate;
var r = Math.atan2(v1_y,v1_x) - Math.atan2(v0_y,v0_x);
r *= 180 / Math.PI;
_image_rotate += r;
if(_image_rotate < -180) _image_rotate += 360;
if(_image_rotate > 180) _image_rotate -= 360;
var s = len1 / len0;
_image_zoom *= s;
setMessage("Zoom: " + (_image_zoom * 100).toFixed(2) + " % , Rotate: " + _image_rotate.toFixed(2));
_image_scale.y = _image_scale.x = _image_zoom / _pixel_ratio;
var mtx = new Matrix32();
mtx.translate(-_image_origin.x,-_image_origin.y);
mtx.scale(_image_scale.x,_image_scale.y);
mtx.rotate(_image_rotate * Math.PI / 180);
var vtx = new Array();
vtx.push(mtx.transformPosition({x:-_image_origin.x , y:-_image_origin.y}));
vtx.push(mtx.transformPosition({x:-_image_origin.x , y: _image_origin.y}));
vtx.push(mtx.transformPosition({x: _image_origin.x , y:-_image_origin.y}));
vtx.push(mtx.transformPosition({x: _image_origin.x , y: _image_origin.y}));
var min_x = vtx[0].x;
var max_x = vtx[0].x;
var min_y = vtx[0].y;
var max_y = vtx[0].y;
var i;
var num = vtx.length;
for(i=1;i<num;i++){
var p = vtx[i];
if(min_x > p.x) min_x = p.x;
if(max_x < p.x) max_x = p.x;
if(min_y > p.y) min_y = p.y;
if(max_y < p.y) max_y = p.y;
}
var client_w = _element_window.clientWidth;
var client_h = _element_window.clientHeight;
var background_w = (client_w * 2) + (max_x - min_x);
var background_h = (client_h * 2) + (max_y - min_y);
_prevent_scroll = true;
var style = _element_background.style;
style.width = (background_w) + "px";
style.height = (background_h) + "px";
_image_pos = {x:background_w * 0.5,y:background_h * 0.5};
mtx.translate(_image_pos.x,_image_pos.y);
StyleDeclarationSetTransform(_element_image.style,mtx.toString());
var vec = mtx.transformPosition(_image_center);
_element_window.scrollLeft = vec.x - client_w * 0.5;
_element_window.scrollTop = vec.y - client_h * 0.5;
var mtx = new Matrix32();
mtx.translate(-len0 - 5.0 , -len0 - 5.0);
mtx.translate(vec.x,vec.y);
StyleDeclarationSetTransform(_element_transform_circle_before.style,mtx.toString());
_element_transform_circle_before.style.width = (len0 * 2.0) + "px";
_element_transform_circle_before.style.height = (len0 * 2.0) + "px";
var mtx = new Matrix32();
mtx.translate(-2.5 , -2.5);
mtx.rotate(rad0);
mtx.translate(vec.x,vec.y);
StyleDeclarationSetTransform(_element_transform_vector_before.style,mtx.toString());
_element_transform_vector_before.style.width = (len0 + 5.0) + "px";
var mtx = new Matrix32();
mtx.translate(-2.5 , -2.5);
mtx.rotate(rad1);
mtx.translate(vec.x,vec.y);
StyleDeclarationSetTransform(_element_transform_vector_after.style,mtx.toString());
_element_transform_vector_after.style.width = (len1 + 5.0) + "px";
_element_container.appendChild(_element_transform);
}
// ------------------------------
// リサイズイベント(内部用)
// ------------------------------
function addScale(delta){
var ZOOM_MUL = 0.01;
var zoom_old = _image_zoom;
if(delta > 0){
_image_zoom = (1.0 + delta * ZOOM_MUL) * _image_zoom;
}else{
_image_zoom = (1.0 / (1.0 - delta * ZOOM_MUL)) * _image_zoom;
}
if(delta > 0){
var next = 1.0;
while(zoom_old >= 1.0){
zoom_old /= 2.0;
next *= 2.0;
}
if(next < _image_zoom){
_image_zoom = next;
}
}else{
var next = 0.0;
if(zoom_old > 1.0) next = 1.0;
while(zoom_old > 2.0){
zoom_old /= 2.0;
next *= 2.0;
}
if(next > _image_zoom){
_image_zoom = next;
}
}
setMessage("Zoom: " + (_image_zoom * 100).toFixed(2) + " %");
_image_scale.y = _image_scale.x = _image_zoom / _pixel_ratio;
var mtx = new Matrix32();
mtx.translate(-_image_origin.x,-_image_origin.y);
mtx.scale(_image_scale.x,_image_scale.y);
mtx.rotate(_image_rotate * Math.PI / 180);
var vtx = new Array();
vtx.push(mtx.transformPosition({x:-_image_origin.x , y:-_image_origin.y}));
vtx.push(mtx.transformPosition({x:-_image_origin.x , y: _image_origin.y}));
vtx.push(mtx.transformPosition({x: _image_origin.x , y:-_image_origin.y}));
vtx.push(mtx.transformPosition({x: _image_origin.x , y: _image_origin.y}));
var min_x = vtx[0].x;
var max_x = vtx[0].x;
var min_y = vtx[0].y;
var max_y = vtx[0].y;
var i;
var num = vtx.length;
for(i=1;i<num;i++){
var p = vtx[i];
if(min_x > p.x) min_x = p.x;
if(max_x < p.x) max_x = p.x;
if(min_y > p.y) min_y = p.y;
if(max_y < p.y) max_y = p.y;
}
var client_w = _element_window.clientWidth;
var client_h = _element_window.clientHeight;
var background_w = (client_w * 2) + (max_x - min_x);
var background_h = (client_h * 2) + (max_y - min_y);
_prevent_scroll = true;
var style = _element_background.style;
style.width = (background_w) + "px";
style.height = (background_h) + "px";
_image_pos = {x:background_w * 0.5,y:background_h * 0.5};
mtx.translate(_image_pos.x,_image_pos.y);
StyleDeclarationSetTransform(_element_image.style,mtx.toString());
var vec = mtx.transformPosition(_image_center);
_element_window.scrollLeft = vec.x - client_w * 0.5;
_element_window.scrollTop = vec.y - client_h * 0.5;
}
// ------------------------------
// メッセージをセット(内部用)
// ------------------------------
function setMessage(str){
if(!_parent_task) return;
if(_message_task){
_message_task.release();
}
_textnode_message.nodeValue = str;
_element_viewer.appendChild(_element_message);
// フェードタスク
var frame = 60 * 3;
_message_task = task_container.createTask(_parent_task);
_message_task.setDestructorFunc(function(){
_message_task = null;
});
_message_task.setExecuteFunc(function(){
var alpha = _message_alpha;
frame -= 1;
if(frame < 0){
_message_alpha -= 0.1;
if(_message_alpha < 0.0){
_message_alpha = 0.0;
_message_task.release();
DomNodeRemove(_element_message);
}
}else{
_message_alpha += 0.2;
if(_message_alpha > 1.0){
_message_alpha = 1.0;
}
}
if(alpha != _message_alpha){
_element_message.style.opacity = _message_alpha;
}
});
_message_task.execute(0xffffffff);
}
// ------------------------------
// カーソルを初期化(内部用)
// ------------------------------
function initCursor(){
_element_container.style.cursor = "default";
if(_cursor_task){
_cursor_task.release();
}
if(_parent_task){
var frame = 60 * 1;
_cursor_task = task_container.createTask(_parent_task);
_cursor_task.setDestructorFunc(function(){
_cursor_task = null;
});
_cursor_task.setExecuteFunc(function(){
frame -= 1;
if(frame < 0){
_element_container.style.cursor = "none";
_cursor_task.release();
}
});
_cursor_task.execute(0xffffffff);
}
}
// ------------------------------
// カーソルを変更(内部用)
// ------------------------------
function setCursor(value){
_element_container.style.cursor = value;
if(_cursor_task){
_cursor_task.release();
}
}
// ------------------------------
// 画像移動(内部用)
// ------------------------------
function gotoImage(delta){
var popup_image = null;
if(delta > 0) popup_image = popup_image_container.getNext(_popup_image);
if(delta < 0) popup_image = popup_image_container.getPrev(_popup_image);
if(popup_image){
_popup_image = popup_image;
updateImage(_popup_image);
}
setMessage((popup_image_container.getIndex(_popup_image) + 1) + " / " + popup_image_container.getCount());
}
// ------------------------------
// スケールモード移動(内部用)
// ------------------------------
function gotoScaleMode(delta){
_scale_mode += delta;
if(_scale_mode < 0){
_scale_mode += ImageViewer.SCALE_MODE_MAX;
}
if(_scale_mode >= ImageViewer.SCALE_MODE_MAX){
_scale_mode -= ImageViewer.SCALE_MODE_MAX;
}
setMessage("ScaleMode: " + [
"\"AUTO\"",
"\"NO SCALE\"",
"\"LONG VERTICAL\"",
"\"SHOW ALL\"",
"\"SHOW FULL\""
][_scale_mode]);
updateScaleMode();
}
// ------------------------------
// プライベート変数
// ------------------------------
var _window_root;
var _element_root;
var _element_viewer;
var _element_menu;
var _element_window;
var _element_message;
var _element_container;
var _element_background;
var _element_image;
var _element_transform;
var _element_transform_circle_before;
var _element_transform_vector_before;
var _element_transform_vector_after;
var _textnode_url;
var _textnode_message;
var _popup_image;
var _style_overflow_list;
var _prevent_context_menu;
var _prevent_click;
var _prevent_scroll;
var _parent_task;
var _fade_task;
var _fade_alpha;
var _message_task;
var _message_alpha;
var _cursor_task;
var _observer_remove;
var _analyze_work_viewer;
var _analyze_work_image;
var _input_mouse;
var _scale_mode;
var _image_origin;
var _image_scale;
var _image_zoom;
var _image_rotate;
var _image_pos;
var _image_center;
var _mouse_buttons;
var _translate_work;
var _transform_work;
var _pixel_ratio;
var _event_handler_release;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_window_root = window_manager.getWindowRoot();
var document_root = _window_root.document;
var element_html = document_root.documentElement;
_element_root = document_root.body;
if(window_manager.existWindowRoot()){
_input_mouse = new InputMouse(_window_root);
}else{
_input_mouse = input_mouse;
}
_prevent_context_menu = _input_mouse.getButtonRight();
_prevent_click = _input_mouse.getButtonLeft();
_prevent_scroll = false;
_scale_mode = ImageViewer.SCALE_MODE_AUTO;
_image_origin = {x:0.0,y:0.0};
_image_scale = {x:1.0,y:1.0};
_image_zoom = 1.0;
_image_rotate = 0.0;
_image_pos = {x:0.0,y:0.0};
_image_center = {x:0.0,y:0.0};
_mouse_buttons = 0x00;
_translate_work = new Object();
_transform_work = new Object();
_pixel_ratio = WindowGetDevicePixelRatio(window);
_popup_image = popup_image;
popup_image = null;
// スクロールバー無効化
_style_overflow_list = new Array();
var list = [
{
element:element_html,
value_list:["hidden","initial"]
},{
element:_element_root,
value_list:["hidden"]
}
];
var i;
var num = list.length;
for(i=0;i<num;i++){
var item = list[i];
var value_list = item.value_list;
var element = item.element;
var style = element.style;
_style_overflow_list.push({
element:element,
value:StyleDeclarationGetPropertyValue(style,"overflow")
});
var j;
var value_num = value_list.length;
for(j=0;j<value_num;j++){
style.overflow = value_list[j];
}
}
_element_viewer = DocumentCreateElement("div");
ElementSetStyle(_element_viewer,CSSTextGetInitialDivElement());
ElementAddStyle(_element_viewer,"position:fixed; left:0px; top:0px; z-index:2147483646; line-height:0;");
var client_size = DocumentGetClientSize(document_root);
var style = _element_viewer.style;
style.width = (client_size.width) + "px";
style.height = (client_size.height) + "px";
_element_menu = DocumentCreateElement("div");
ElementSetStyle(_element_menu,CSSTextGetInitialDivElement());
ElementAddStyle(_element_menu,"background:#fcfcfc; color:#000; font-size:14px; top:10px; right:30px; line-height:1; position:absolute; border-radius:10px; box-shadow:0px 0px 5px #c0c0c0; pointer-events:inherit;");
var style_button = "margin:0px; padding:0px; font-size:12px; font-weight:bold; text-align:center; width:24px; height:24px; display:inline-block; pointer-events:inherit;";
var style_button_image = "vertical-align:top; margin:0px -6px; pointer-events:inherit;";
var button_prev = DocumentCreateElement("button");
button_prev.title = "prev image";
ElementSetStyle(button_prev,CSSTextGetInitialButtonElement());
ElementAddStyle(button_prev,style_button);
button_prev.onclick = function(){
gotoImage(-1);
};
var image_prev = DocumentCreateElement("img");
ElementSetStyle(image_prev,CSSTextGetInitialImageElement());
ElementAddStyle(image_prev,style_button_image);
image_prev.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIjjI+py50AVzwQvIqwqXpHzmXgKI4h9ZklenpW+bpS7NT2HRQAOw==";
button_prev.appendChild(image_prev);
var button_next = DocumentCreateElement("button");
button_next.title = "next image";
ElementSetStyle(button_next,CSSTextGetInitialButtonElement());
ElementAddStyle(button_next,style_button);
button_next.onclick = function(){
gotoImage(1);
};
var image_next = DocumentCreateElement("img");
ElementSetStyle(image_next,CSSTextGetInitialImageElement());
ElementAddStyle(image_next,style_button_image);
image_next.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIljI+py50AFoxn0gqRzWbqnXkYaH2k2JEBum6jeaUx99DOjedBAQA7";
button_next.appendChild(image_next);
var button_zoom_out = DocumentCreateElement("button");
button_zoom_out.title = "zoom out";
ElementSetStyle(button_zoom_out,CSSTextGetInitialButtonElement());
ElementAddStyle(button_zoom_out,style_button);
button_zoom_out.onclick = function(){
addScale(-10.0);
};
var image_zoom_out = DocumentCreateElement("img");
ElementSetStyle(image_zoom_out,CSSTextGetInitialImageElement());
ElementAddStyle(image_zoom_out,style_button_image);
image_zoom_out.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIXjI+py+0P4wK0WoquBnnb7mHSSJZmWQAAOw==";
button_zoom_out.appendChild(image_zoom_out);
var button_zoom_in = DocumentCreateElement("button");
button_zoom_in.title = "zoom in";
ElementSetStyle(button_zoom_in,CSSTextGetInitialButtonElement());
ElementAddStyle(button_zoom_in,style_button);
button_zoom_in.onclick = function(){
addScale( 10.0);
};
var image_zoom_in = DocumentCreateElement("img");
ElementSetStyle(image_zoom_in,CSSTextGetInitialImageElement());
ElementAddStyle(image_zoom_in,style_button_image);
image_zoom_in.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIfjI+pywYP2oFRBmovZLTv6XVIKILkw30SZrGrmsVSAQA7";
button_zoom_in.appendChild(image_zoom_in);
var button_scale_mode = DocumentCreateElement("button");
button_scale_mode.title = "change scale mode";
ElementSetStyle(button_scale_mode,CSSTextGetInitialButtonElement());
ElementAddStyle(button_scale_mode,style_button);
button_scale_mode.onclick = function(){
gotoScaleMode(1);
};
var image_scale_mode = DocumentCreateElement("img");
ElementSetStyle(image_scale_mode,CSSTextGetInitialImageElement());
ElementAddStyle(image_scale_mode,style_button_image);
image_scale_mode.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIshI9pwe2+EDwhrkftZTLWm33Q2GzPaZ4Tya3A98KVKJXZS2EWHHO3qlIIEQUAOw==";
button_scale_mode.appendChild(image_scale_mode);
var button_download = DocumentCreateElement("button");
button_download.title = "download";
ElementSetStyle(button_download,CSSTextGetInitialButtonElement());
ElementAddStyle(button_download,style_button);
button_download.onclick = function(){
setMessage("Loading...");
var image = _popup_image.getImage();
var downloader = new Downloader();
downloader.setURL(_popup_image.getOriginalURL());
downloader.setFileName(_popup_image.getOriginalURL());
downloader.setSaveAs(false);
downloader.oncomplete = function(result){
if(result){
setMessage("Download: \"success\"");
}else{
setMessage("Download: \"failure\"");
}
}
downloader.start();
};
var image_download = DocumentCreateElement("img");
ElementSetStyle(image_download,CSSTextGetInitialImageElement());
ElementAddStyle(image_download,style_button_image);
image_download.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIgjA8Jx63b4otSUWcvyjpM+oScIX6YqKGduULdW8ZyXAAAOw==";
button_download.appendChild(image_download);
var button_scroll = DocumentCreateElement("button");
button_scroll.title = "close and scroll";
ElementSetStyle(button_scroll,CSSTextGetInitialButtonElement());
ElementAddStyle(button_scroll,style_button);
button_scroll.onclick = function(){
suicide();
var anchor = _popup_image.getElementAnchor();
anchor.scrollIntoView();
};
var image_scroll = DocumentCreateElement("img");
ElementSetStyle(image_scroll,CSSTextGetInitialImageElement());
ElementAddStyle(image_scroll,style_button_image);
image_scroll.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIwRBypatDr4HnJxTpPtbc9zmkRMl0iVZKetpmrajEZ7M5MjI1p+LZ475PpbpLholgAADs=";
button_scroll.appendChild(image_scroll);
var button_close = DocumentCreateElement("button");
button_close.title = "close";
ElementSetStyle(button_close,CSSTextGetInitialButtonElement());
ElementAddStyle(button_close,style_button);
button_close.onclick = function(){
suicide();
};
var image_close = DocumentCreateElement("img");
ElementSetStyle(image_close,CSSTextGetInitialImageElement());
ElementAddStyle(image_close,style_button_image);
image_close.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIgjI+py50AFQQvnrlw0Hna5jlG6HifZHGIqm7n+Iry3BQAOw==";
button_close.appendChild(image_close);
_element_window = DocumentCreateElement("div");
ElementSetStyle(_element_window,CSSTextGetInitialDivElement());
ElementAddStyle(_element_window,"position:absolute; left:0px; top:0px; right:0px; bottom:0px; overflow:scroll; line-height:0; user-select:none; pointer-events:inherit; -webkit-user-select:none; -moz-user-select:none; -khtml-user-select:none;");
_element_container = DocumentCreateElement("div");
ElementSetStyle(_element_container,CSSTextGetInitialDivElement());
initCursor();
_element_background = DocumentCreateElement("div");
ElementSetStyle(_element_background,CSSTextGetInitialDivElement());
ElementAddStyle(_element_background,"background:#000; opacity:0.9; width:0px; height:0px; position:absolute; cursor:inherit; pointer-events:inherit;");
_element_message = DocumentCreateElement("div");
ElementSetStyle(_element_message,CSSTextGetInitialDivElement());
ElementAddStyle(_element_message,"background:#fcfcfc; color:#000; font-size:14px; top:10px; left:10px; line-height:1; position:absolute; padding:5px 10px; border-radius:10px; box-shadow:0px 0px 5px #c0c0c0; pointer-events:inherit;");
_textnode_message = document.createTextNode("");
_element_message.appendChild(_textnode_message);
_message_alpha = 0.0;
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element_viewer);
_observer_remove.setFunction(_this.release);
// 解析ワーク作成
_analyze_work_viewer = AnalyzeWorkCreate(_element_viewer);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work_viewer);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
if(window_manager.existWindowRoot()) attach_options.SetGuest();
analyze_work_dictionary.attachAnalyzeWork(_analyze_work_viewer,attach_options);
// ノードリスト登録
_element_viewer.appendChild(_element_window);
_element_window.appendChild(_element_container);
_element_container.appendChild(_element_background);
_element_root.appendChild(_element_viewer);
addEvent();
_element_transform = DocumentCreateElement("div");
ElementSetStyle(_element_transform,CSSTextGetInitialDivElement());
ElementAddStyle(_element_transform,"cursor:inherit; opacity:0.25;");
_element_transform_circle_before = DocumentCreateElement("div");
ElementSetStyle(_element_transform_circle_before,CSSTextGetInitialDivElement());
ElementAddStyle(_element_transform_circle_before,"position:absolute; left:0px; top:0px; cursor:inherit; background:#FFF; border-radius:50%; border:5px dotted #444;");
StyleDeclarationSetTransformOrigin(_element_transform_circle_before.style,"0% 0%");
_element_transform_vector_before = DocumentCreateElement("div");
ElementSetStyle(_element_transform_vector_before,CSSTextGetInitialDivElement());
ElementAddStyle(_element_transform_vector_before,"position:absolute; left:0px; top:0px; cursor:inherit; height:3px; background:#F88; border:1px solid #800; border-radius:2.5px;");
StyleDeclarationSetTransformOrigin(_element_transform_vector_before.style,"0% 0%");
_element_transform_vector_after = DocumentCreateElement("div");
ElementSetStyle(_element_transform_vector_after,CSSTextGetInitialDivElement());
ElementAddStyle(_element_transform_vector_after,"position:absolute; left:0px; top:0px; cursor:inherit; height:3px; background:#88F; border:1px solid #008; border-radius:2.5px;");
StyleDeclarationSetTransformOrigin(_element_transform_vector_after.style,"0% 0%");
_element_transform.appendChild(_element_transform_circle_before);
_element_transform.appendChild(_element_transform_vector_before);
_element_transform.appendChild(_element_transform_vector_after);
// 画像更新
updateImage(_popup_image);
(function(){
// メニュー更新
function updateMenu(type){
menu_type = type;
var style = _element_menu.style;
var list;
switch(menu_type){
case ImageViewer.MENU_TYPE_HORIZONTAL:
list = menu_horizontal_list;
style.width = "auto";
style.padding = "4px 10px";
break;
case ImageViewer.MENU_TYPE_VERTICAL:
list = menu_vertical_list;
style.width = "24px";
style.padding = "10px 4px";
break;
}
var i;
var num = list.length;
for(i=0;i<num;i++){
_element_menu.appendChild(list[i]);
}
}
function MenuTaskHideInit(task){
DomNodeRemove(_element_menu);
task.setExecuteFunc(MenuTaskHideExec);
task.execute(0xffffffff);
}
function MenuTaskHideExec(task){
var client_w = _element_window.clientWidth;
var pos = _input_mouse.getPositionClient();
if(pos.y <= MENU_WIDTH){
updateMenu(ImageViewer.MENU_TYPE_HORIZONTAL);
task.setExecuteFunc(MenuTaskFadeInInit);
}else if(pos.x >= client_w - MENU_WIDTH){
updateMenu(ImageViewer.MENU_TYPE_VERTICAL);
task.setExecuteFunc(MenuTaskFadeInInit);
}
}
function MenuTaskFadeInInit(task){
_element_viewer.appendChild(_element_menu);
task.setExecuteFunc(MenuTaskFadeInExec);
task.execute(0xffffffff);
}
function MenuTaskFadeInExec(task){
menu_alpha += 0.2;
if(menu_alpha > 1.0){
menu_alpha = 1.0;
task.setExecuteFunc(MenuTaskShowInit);
}
_element_menu.style.opacity = menu_alpha;
}
function MenuTaskShowInit(task){
task.setExecuteFunc(MenuTaskShowExec);
task.execute(0xffffffff);
}
function MenuTaskShowExec(task){
var client_w = _element_window.clientWidth;
var pos = _input_mouse.getPositionClient();
if(menu_type == ImageViewer.MENU_TYPE_HORIZONTAL){
if(pos.y > MENU_WIDTH){
task.setExecuteFunc(MenuTaskWaitInit);
}
}
if(menu_type == ImageViewer.MENU_TYPE_VERTICAL){
if(pos.x < client_w - MENU_WIDTH){
task.setExecuteFunc(MenuTaskWaitInit);
}
}
};
function MenuTaskWaitInit(task){
var work = task.getUserWork();
work.frame = 60 * 0;
task.setExecuteFunc(MenuTaskWaitExec);
task.execute(0xffffffff);
}
function MenuTaskWaitExec(task){
var work = task.getUserWork();
work.frame -= 1;
if(work.frame < 0){
task.setExecuteFunc(MenuTaskFadeOutInit);
}
}
function MenuTaskFadeOutInit(task){
task.setExecuteFunc(MenuTaskFadeOutExec);
task.execute(0xffffffff);
}
function MenuTaskFadeOutExec(task){
menu_alpha -= 0.1;
if(menu_alpha < 0.0){
menu_alpha = 0.0;
task.setExecuteFunc(MenuTaskHideInit);
}
_element_menu.style.opacity = menu_alpha;
}
var MENU_WIDTH = 50;
var menu_type;
var menu_alpha = 1.0;
var menu_horizontal_list = [
button_prev,
button_next,
button_zoom_out,
button_zoom_in,
button_scale_mode,
button_download,
button_scroll,
button_close
];
var menu_vertical_list = [
button_close,
button_scroll,
button_download,
button_scale_mode,
button_zoom_in,
button_zoom_out,
button_prev,
button_next
];
updateMenu(ImageViewer.MENU_TYPE_HORIZONTAL);
_element_viewer.appendChild(_element_menu);
function mouseOver(){
if(_element_menu.removeEventListener){
_element_menu.removeEventListener("mouseover",mouseOver,false);
}else if(_element_menu.detachEvent){
_element_menu.detachEvent("onmouseover",mouseOver);
}
if(_parent_task){
var menu_task = task_container.createTask(_parent_task);
menu_task.setDestructorFunc(function(){
menu_task = null;
});
menu_task.setExecuteFunc(MenuTaskFadeInInit);
menu_task.execute(0xffffffff);
}
}
if(_element_menu.addEventListener){
_element_menu.addEventListener("mouseover",mouseOver,false);
}else if(_element_menu.attachEvent){
_element_menu.attachEvent("onmouseover",mouseOver);
}
})();
(function(){
// 親タスク
_parent_task = task_container.createTask();
_parent_task.setDestructorFunc(function(){
_parent_task = null;
});
// フェードインタスク
_fade_alpha = 0.0;
_fade_task = task_container.createTask(_parent_task);
_fade_task.setDestructorFunc(function(){
_fade_task = null;
});
_fade_task.setExecuteFunc(function(){
_fade_alpha += 0.2;
if(_fade_alpha > 1.0){
_fade_alpha = 1.0;
_fade_task.release();
}
_element_viewer.style.opacity = _fade_alpha;
});
_fade_task.execute(0xffffffff);
task_execute_level &= ~TASK_EXECUTE_LEVEL_POPUP;
})();
// 開放イベント
_event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// イメージビューワ定数
// ------------------------------
ImageViewer.SCALE_MODE_AUTO = 0;
ImageViewer.SCALE_MODE_NO_SCALE = 1;
ImageViewer.SCALE_MODE_LONG_VERTICAL = 2;
ImageViewer.SCALE_MODE_SHOW_ALL = 3;
ImageViewer.SCALE_MODE_SHOW_FULL = 4;
ImageViewer.SCALE_MODE_MAX = 5;
ImageViewer.MENU_TYPE_HORIZONTAL = 0;
ImageViewer.MENU_TYPE_VERTICAL = 1;
// ------------------------------
// メディアプレイヤー拡張 UI
// ------------------------------
function MediaPlayerExtendUI(element){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
removeEvent();
// タスク破棄
if(_parent_task){
_parent_task.releaseChild();
_parent_task.release();
_parent_task = null;
}
if(_event_dispatcher){
_event_dispatcher.release();
_event_dispatcher = null;
}
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
// 解析辞書除外
if(_analyze_work_container){
analyze_work_dictionary.removeAnalyzeWork(_analyze_work_container);
_analyze_work_container = null;
}
DomNodeRemove(_element_container);
};
// ------------------------------
// イベントハンドラを作成
// ------------------------------
_this.createEventHandler = function(type){
return _event_dispatcher.createEventHandler(type);
};
// ------------------------------
// 閉じる(内部用)
// ------------------------------
function close(){
// イベントを発火
_event_dispatcher.dispatchEvent("close",_this);
DomNodeRemove(_element_target);
_this.release();
}
// ------------------------------
// イベントを追加(内部用)
// ------------------------------
function addEvent(){
removeEvent();
if(window.addEventListener){
_element_target.addEventListener("mouseover",mouseOver,false);
_element_resize.addEventListener("mousedown",mouseDownResize,false);
_element_container.addEventListener("dragstart",dragStart,false);
}else if(window.attachEvent){
_element_target.attachEvent("onmouseover",mouseOver);
_element_resize.attachEvent("onmousedown",mouseDownResize);
_element_container.attachEvent("ondragstart",dragStart);
}
}
// ------------------------------
// イベントを破棄(内部用)
// ------------------------------
function removeEvent(){
if(window.removeEventListener){
_element_target.removeEventListener("mouseover",mouseOver,false);
_element_resize.removeEventListener("mousedown",mouseDownResize,false);
_element_container.removeEventListener("dragstart",dragStart,false);
}else if(window.detachEvent){
_element_target.detachEvent("onmouseover",mouseOver);
_element_resize.detachEvent("onmousedown",mouseDownResize);
_element_container.detachEvent("ondragstart",dragStart);
}
}
// ------------------------------
// マウス移動(内部用)
// ------------------------------
function mouseOver(e){
// マウス入力を更新
input_mouse.setMouseEvent(e);
if(_player_task){
}else{
_player_task = task_container.createTask(_parent_task);
_player_task.setLevel(TASK_EXECUTE_LEVEL_POPUP);
_player_task.setDestructorFunc(function(){
_player_task = null;
});
_player_task.setExecuteFunc(PlayerTaskInitialize);
_player_task.execute(0xffffffff);
}
}
// ------------------------------
// プレイヤータスク初期化(内部用)
// ------------------------------
function PlayerTaskInitialize(task){
var work = task.getUserWork();
work.spd = 0.0;
document.body.appendChild(_element_container);
update();
task.setExecuteFunc(PlayerTaskFadeIn);
task.execute(0xffffffff);
}
// ------------------------------
// プレイヤータスクフェードイン(内部用)
// ------------------------------
function PlayerTaskFadeIn(task){
var work = task.getUserWork();
work.spd += 0.1;
if(work.spd > 0.5) work.spd = 0.5;
var fri = (1.0 - _fade_alpha) * 0.3;
if(work.spd > fri) work.spd = fri;
_fade_alpha += work.spd;
if(_fade_alpha < 0.0){
_fade_alpha = 0.0;
}
if(_fade_alpha > 0.99){
_fade_alpha = 1.0;
task.setExecuteFunc(PlayerTaskWaitInit);
}
if(!hitTest(input_mouse.getPositionClient())){
task.setExecuteFunc(PlayerTaskFadeOut);
}
update();
}
// ------------------------------
// プレイヤータスク待機(内部用)
// ------------------------------
function PlayerTaskWaitInit(task){
var work = task.getUserWork();
task.setExecuteFunc(PlayerTaskWaitExec);
task.execute(0xffffffff);
}
function PlayerTaskWaitExec(task){
var work = task.getUserWork();
if(!hitTest(input_mouse.getPositionClient())){
task.setExecuteFunc(PlayerTaskFadeOut);
}
}
// ------------------------------
// プレイヤータスクフェードアウト(内部用)
// ------------------------------
function PlayerTaskFadeOut(task){
var work = task.getUserWork();
work.spd -= 0.01;
if(work.spd < -0.5) work.spd = -0.5;
var fri = (0.0 - _fade_alpha) * 0.4;
if(work.spd < fri) work.spd = fri;
_fade_alpha += work.spd;
if(_fade_alpha > 1.0){
_fade_alpha = 1.0;
}
if(_fade_alpha < 0.01){
_fade_alpha = 0.0;
task.setExecuteFunc(PlayerTaskClose);
}
if(hitTest(input_mouse.getPositionClient())){
task.setExecuteFunc(PlayerTaskFadeIn);
}
update();
}
// ------------------------------
// 閉じる(内部用)
// ------------------------------
function PlayerTaskClose(task){
var work = task.getUserWork();
DomNodeRemove(_element_container);
task.release();
}
// ------------------------------
// マウスダウンリサイズ(内部用)
// ------------------------------
function mouseDownResize(e){
// マウス入力を更新
input_mouse.setMouseEvent(e);
var resize_rect = ElementGetBoundingClientRect(_element_resize);
var mouse_pos = input_mouse.getPositionClient();
var resize_offset = {
x:(mouse_pos.x - resize_rect.left) - 4,
y:(mouse_pos.y - resize_rect.top ) - 4
};
if(_resize_task){
}else if(input_mouse.getButtonLeft()){
DomNode_InsertBefore(_element_resize,_element_hitarea);
_resize_task = task_container.createTask(_parent_task);
_resize_task.setLevel(TASK_EXECUTE_LEVEL_POPUP);
_resize_task.setDestructorFunc(function(){
_resize_task = null;
});
_resize_task.setExecuteFunc(function(){
if(!input_mouse.getButtonLeft()){
DomNodeRemove(_element_hitarea);
_resize_task.release();
return;
}
var rect = ElementGetBoundingClientRect(_element_target);
var size = ComputedStyleGetSize(_element_target.style);
var pos = input_mouse.getPositionClient();
var w = (pos.x - resize_offset.x) - rect.left - (size.offsetWidth - size.width);
var h = (pos.y - resize_offset.y) - rect.top - (size.offsetHeight - size.height);
if(w < 0) w = 0;
if(h < 0) h = 0;
var style = _element_target.style;
style.minWidth = "0";
style.minHeight = "0";
style.maxWidth = "none";
style.maxHeight = "none";
style.width = (w) + "px";
style.height = (h) + "px";
update();
});
_resize_task.execute(0xffffffff);
}
}
// ------------------------------
// 当たり判定(内部用)
// ------------------------------
function hitTest(mouse_pos){
if(_resize_task) return true;
if(ElementHitTestPosition(_element_menu,mouse_pos,true)) return true;
if(ElementHitTestPosition(_element_resize,mouse_pos,true)) return true;
if(ElementHitTestPosition(_element_target,mouse_pos,true)) return true;
var rect = ElementGetBoundingClientRect(_element_target);
var max_x = rect.right + 16;
var max_y = rect.bottom + 16;
var min_x = max_x - 32;
var min_y = max_y - 32;
if(max_x < mouse_pos.x){
}else if(max_y < mouse_pos.y){
}else if(min_x > mouse_pos.x){
}else if(min_y > mouse_pos.y){
}else{
return true;
}
return false;
}
// ------------------------------
// ドラッグ開始イベント(内部用)
// ------------------------------
function dragStart(e){
// デフォルトの動作を無効化する
if(e.preventDefault){
e.preventDefault();
}else{
return false;
}
}
// ------------------------------
// 更新(内部用)
// ------------------------------
function update(){
// スクロール位置
var scroll_pos = WindowGetScrollPosition(window);
var target_rect = ElementGetBoundingClientRect(_element_target);
target_rect.left += scroll_pos.x;
target_rect.right += scroll_pos.x;
target_rect.top += scroll_pos.y;
target_rect.bottom += scroll_pos.y;
var target_w = target_rect.right - target_rect.left;
var target_h = target_rect.bottom - target_rect.top;
var style = _element_header.style;
style.width = (target_w) + "px";
var header_rect = ElementGetBoundingClientRect(_element_header);
var header_h = header_rect.bottom - header_rect.top;
var hreader_y = target_rect.top - header_h;
style.left = (target_rect.left) + "px";
style.top = (hreader_y) + "px";
var style = _element_menu.style;
style.top = ((1.0 - _fade_alpha) * header_h) + "px";
var style = _element_hitarea.style;
style.left = (target_rect.left) + "px";
style.top = (target_rect.top) + "px";
style.width = (target_w) + "px";
style.height = (target_h) + "px";
var style = _element_resize.style;
style.left = (target_rect.right - 4) + "px";
style.top = (target_rect.bottom - 4) + "px";
style.opacity = _fade_alpha;
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element_container;
var _element_header;
var _element_menu;
var _element_resize;
var _element_hitarea;
var _element_target;
var _event_dispatcher;
var _event_handler_release;
var _observer_remove;
var _analyze_work_container;
var _parent_task;
var _player_task;
var _resize_task;
var _fade_alpha;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element_target = element;
element = null;
_event_dispatcher = new EventDispatcher();
_fade_alpha = 0.0;
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element_target);
_observer_remove.setFunction(_this.release);
_element_container = DocumentCreateElement("div");
_element_container.draggable = true;
ElementSetStyle(_element_container,CSSTextGetInitialDivElement());
_element_header = DocumentCreateElement("div");
ElementSetStyle(_element_header,CSSTextGetInitialDivElement());
ElementAddStyle(_element_header,"position:absolute; z-index:2147483646; overflow:hidden; text-align:right;");
_element_menu = DocumentCreateElement("div");
ElementSetStyle(_element_menu,CSSTextGetInitialDivElement());
ElementAddStyle(_element_menu,"position:relative; background-color:rgba(128,128,128,0.9); display:inline-block; border-radius:10px 10px 0px 0px; border:2px solid #666; border-bottom-width:0px; top:0px;");
var _element_menu_inner = DocumentCreateElement("div");
ElementSetStyle(_element_menu_inner,CSSTextGetInitialDivElement());
ElementAddStyle(_element_menu_inner,"padding:5px 10px; text-align:right;");
_element_menu.appendChild(_element_menu_inner);
var style_button = "margin:0px; padding:0px; font-size:12px; font-weight:bold; text-align:center; width:24px; height:24px; display:inline-block;";
var style_button_image = "vertical-align:top; margin:0px -6px;";
var button_close = DocumentCreateElement("button");
button_close.title = "close";
ElementSetStyle(button_close,CSSTextGetInitialButtonElement());
ElementAddStyle(button_close,style_button);
button_close.onclick = function(){
close();
};
var image_close = DocumentCreateElement("img");
ElementSetStyle(image_close,CSSTextGetInitialImageElement());
ElementAddStyle(image_close,style_button_image);
image_close.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIgjI+py50AFQQvnrlw0Hna5jlG6HifZHGIqm7n+Iry3BQAOw==";
button_close.appendChild(image_close);
var button_fullscreen = DocumentCreateElement("button");
button_fullscreen.title = "full screen";
ElementSetStyle(button_fullscreen,CSSTextGetInitialButtonElement());
ElementAddStyle(button_fullscreen,style_button);
button_fullscreen.onclick = function(){
ElementRequestFullscreen(_element_target);
};
var image_fullscreen = DocumentCreateElement("img");
ElementSetStyle(image_fullscreen,CSSTextGetInitialImageElement());
ElementAddStyle(image_fullscreen,style_button_image);
image_fullscreen.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAIshI9pwe2+EDwhrkftZTLWm33Q2GzPaZ4Tya3A98KVKJXZS2EWHHO3qlIIEQUAOw==";
button_fullscreen.appendChild(image_fullscreen);
var button_popup = DocumentCreateElement("button");
button_popup.title = "popup window";
ElementSetStyle(button_popup,CSSTextGetInitialButtonElement());
ElementAddStyle(button_popup,style_button);
button_popup.onclick = function(e){
if(!e) e = window.event;
var ofs_x = e.screenX - e.clientX;
var ofs_y = e.screenY - e.clientY;
var target_rect = ElementGetBoundingClientRect(_element_target);
var target_w = target_rect.right - target_rect.left;
var target_h = target_rect.bottom - target_rect.top;
var options = "left=" + (target_rect.left + ofs_x) + ",top=" + (target_rect.top + ofs_y) + ",width=" + target_w + ",height=" + target_h;
var window_obj = window;
var document_obj;
try{
if(1){
if((window_obj.wrappedJSObject) && typeof(window_obj.wrappedJSObject) === "object"){
if(window_obj.wrappedJSObject.open){
window_obj = window_obj.wrappedJSObject;
}
}
}
window_obj = window_obj.open("","_blank",options);
document_obj = window_obj.document;
document_obj.body.style.cssText = "margin:0px; padding:0px; line-height:0; overflow:hidden; width:100%; height:100%;";
document_obj.title = "PageExpand Media Player";
}catch(e){
}
close();
ElementSetStyle(_element_target,CSSTextGetInitialDivElement());
ElementAddStyle(_element_target,"width:100%; height:100%;");
// 解析ワーク作成
var analyze_work_target = AnalyzeWorkCreate(_element_target);
AnalyzeWorkSetInvalid(analyze_work_target);
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
attach_options.SetGuest();
analyze_work_dictionary.attachAnalyzeWork(analyze_work_target,attach_options);
if(document_obj.adoptNode){
document_obj.adoptNode(_element_target);
}
document_obj.body.appendChild(_element_target);
};
var image_popup = DocumentCreateElement("img");
ElementSetStyle(image_popup,CSSTextGetInitialImageElement());
ElementAddStyle(image_popup,style_button_image);
image_popup.src = "data:image/gif;base64,R0lGODlhEAAQAIAAACAgIP///yH5BAUUAAEALAAAAAAQABAAAAInjI9pwO2+lALrWRYlooHr7H1cqI1fh6aSqSbUm7kpu6FwW1bXc0oFADs=";
button_popup.appendChild(image_popup);
_element_menu_inner.appendChild(button_popup);
_element_menu_inner.appendChild(button_fullscreen);
_element_menu_inner.appendChild(button_close);
_element_hitarea = DocumentCreateElement("div");
ElementSetStyle(_element_hitarea,CSSTextGetInitialDivElement());
ElementAddStyle(_element_hitarea,"position:absolute; z-index:2147483646; background:rgba(255,0,0,0.25);");
_element_resize = DocumentCreateElement("div");
ElementSetStyle(_element_resize,CSSTextGetInitialDivElement());
ElementAddStyle(_element_resize,"position:absolute; z-index:2147483646; cursor:se-resize; width:16px; height:16px; background:url(data:image/gif;base64,R0lGODlhEAAQAJEAACAgIP///////wAAACH5BAUUAAIALAAAAAAQABAAAAIwjI9pwO2+lAJxUYFxoNuykFXUc3XcSG6jSH4nqKav1nZdKEd0fsePzZEcTq2UUFgAADs=);");
_element_container.appendChild(_element_header);
_element_header.appendChild(_element_menu);
_element_container.appendChild(_element_resize);
// 解析ワーク作成
_analyze_work_container = AnalyzeWorkCreate(_element_container);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work_container);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
analyze_work_dictionary.attachAnalyzeWork(_analyze_work_container,attach_options);
// 親タスク
_parent_task = task_container.createTask();
_parent_task.setDestructorFunc(function(){
_parent_task = null;
});
// 開放イベント
_event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(function(){
_this.release();
});
addEvent();
})();
}
// ------------------------------
// ダウンロード進捗
// ------------------------------
function DownloadProgress(parent){
var _this = this;
// ------------------------------
// テキスト(内部用)
// ------------------------------
function UI_Text(parent){
var _this = this;
// ------------------------------
// 値をセット
// ------------------------------
_this.setMessage = function(value){
if(!value) value = " ";
_text_node.nodeValue = value;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _div;
var _text_node;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_div = DocumentCreateElement("div");
ElementSetStyle(_div,"width:100%; font-size:12px; text-align:left; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; margin-bottom:5px;");
_text_node = DocumentCreateText(" ");
_div.appendChild(_text_node);
parent.appendChild(_div);
})();
}
// ------------------------------
// ブログレスバー(内部用)
// ------------------------------
function UI_ProgressBar(parent){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(_progress){
DomNodeRemove(_progress);
}else{
DomNodeRemove(_mater);
}
};
// ------------------------------
// 値をセット
// ------------------------------
_this.setValue = function(value){
update(value);
};
// ------------------------------
// 更新(内部用)
// ------------------------------
function update(v){
if(_progress){
_progress.value = v;
}else{
_bar.style.width = (v * 100) + "%";
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _progress;
var _mater;
var _bar;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(window.HTMLProgressElement){
_progress = DocumentCreateElement("progress");
ElementSetStyle(_progress,"display:block; width:100%;");
parent.appendChild(_progress);
}else{
_mater = DocumentCreateElement("div");
ElementSetStyle(_mater,"height:16px; min-height:0; border:1px #888 solid; margin-bottom:5px; line-height:1.0;");
parent.appendChild(_mater);
_bar = DocumentCreateElement("div");
ElementSetStyle(_bar,"height:16px; min-height:0; background-color :#888; margin:0px; width:0%; line-height:1.0;");
_mater.appendChild(_bar);
}
})();
}
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(_task){
_task.release();
}
// イベントを破棄
removeEvent();
DomNodeRemove(_window);
DomNodeRemove(_background);
};
// ------------------------------
// 幅を変更
// ------------------------------
_this.setWidth = function(v){
_window.style.width = v + "px";
};
// ------------------------------
// メッセージを設定
// ------------------------------
_this.setMessage = function(str,id){
var ui_text;
switch(id){
case 0:
ui_text = _text_upper;
break;
default:
ui_text = _text_lower;
break;
}
ui_text.setMessage(str);
};
// ------------------------------
// プログレス値を設定
// ------------------------------
_this.setValueProgress = function(v,id){
var ui_progress;
switch(id){
case 0:
ui_progress = _progress_upper;
break;
default:
ui_progress = _progress_lower;
break;
}
ui_progress.setValue(v);
};
// ------------------------------
// アンカーを設定
// ------------------------------
_this.setAnchor = function(options){
_progress_lower.release();
_button_cancel.value = "OK";
var anchor = DocumentCreateElement("a");
ElementSetTextContent(anchor,options.download);
anchor.href = options.href;
anchor.download = options.download;
ElementSetStyle(anchor,"width:100%; font-size:14px; text-align:left; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; margin-bottom:5px;");
_container_lower.appendChild(anchor);
};
// ------------------------------
// 開く
// ------------------------------
_this.open = function(callback){
parent.appendChild(_window);
// イベントを登録
addEvent();
// リサイズ
resize();
if(_task){
_task.release();
}
var alpha = 0.0;
_task = task_container.createTask(null);
_task.setDestructorFunc(function(){
_task = null;
});
_task.setExecuteFunc(function(){
var complete = false;
alpha += 0.2;
if(alpha > 1.0){
alpha = 1.0;
complete = true;
}
_background.style.opacity = alpha * 0.5;
if(complete){
_task.release();
_this.setEnable(true);
callback();
}
});
_task.execute(0xffffffff);
};
// ------------------------------
// 有効状態をセット
// ------------------------------
_this.setEnable = function(type){
_button_cancel.disabled = !(type);
};
// ------------------------------
// 閉じる
// ------------------------------
_this.close = function(){
DomNodeRemove(_window);
// イベントを破棄
removeEvent();
_this.setEnable(false);
if(_task){
_task.release();
}
var alpha = 1.0;
_task = task_container.createTask(null);
_task.setDestructorFunc(function(){
_task = null;
});
_task.setExecuteFunc(function(){
var complete = false;
alpha -= 0.2;
if(alpha < 0.0){
alpha = 0.0;
complete = true;
}
_background.style.opacity = alpha * 0.5;
if(complete){
_this.oncomplete();
_task.release();
_this.release();
return;
}
});
_task.execute(0xffffffff);
};
// ------------------------------
// エレメント取得
// ------------------------------
_this.getElement = function(){
return _window;
};
// ------------------------------
// 完了イベント
// ------------------------------
_this.oncomplete = function(){};
// ------------------------------
// 中断イベント
// ------------------------------
_this.onclose = function(){};
// ------------------------------
// リサイズ(内部用 )
// ------------------------------
function resize(){
var scroll_pos = WindowGetScrollPosition(window);
var client_size = DocumentGetClientSize(document);
var dialog_rect = ElementGetBoundingClientRect(_window);
var w = dialog_rect.right - dialog_rect.left;
var h = dialog_rect.bottom - dialog_rect.top;
_window.style.left = (client_size.width / 2 - w / 2 + scroll_pos.x) + "px";
if(client_size.height > h){
_window.style.top = (client_size.height / 2 - h / 2 + scroll_pos.y) + "px";
_fitted_top = false;
}else{
if(!_fitted_top){
_window.style.top = (scroll_pos.y) + "px";
_fitted_top = true;
}
}
}
// ------------------------------
// イベント登録(内部用 )
// ------------------------------
function addEvent(){
// イベントリスナーに対応している
if(window.addEventListener){
window.addEventListener("scroll" ,resize);
window.addEventListener("resize" ,resize);
// アタッチイベントに対応している
}else if(window.attachEvent){
window.attachEvent("onscroll" ,resize);
window.attachEvent("onresize" ,resize);
}
}
// ------------------------------
// イベント破棄(内部用 )
// ------------------------------
function removeEvent(){
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
// イベントリスナーに対応している
if(window.removeEventListener){
window.removeEventListener("scroll" ,resize);
window.removeEventListener("resize" ,resize);
// アタッチイベントに対応している
}else if(window.detachEvent){
window.detachEvent("onscroll" ,resize);
window.detachEvent("onresize" ,resize);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _background;
var _window;
var _container_upper;
var _container_lower;
var _text_upper;
var _text_lower;
var _progress_upper;
var _progress_lower;
var _button_cancel;
var _event_handler_release;
var _task;
var _fitted_top;
// ------------------------------
// 初期化
// ------------------------------
(function(){
var css_text_progress = "display:block; width:100%;";
_background = DocumentCreateElement("div");
ElementSetStyle(_background,"position:fixed; top:0px; bottom:0px; left:0px; right:0px; opacity:0.0; background:#000; line-height:1.0; z-index:2147483646;");
parent.appendChild(_background);
_window = DocumentCreateElement("div");
ElementSetStyle(_window,"position:absolute; width:800px; padding:25px; background:#00F; background-color:#FFF; border-radius:5px; box-shadow:5px 5px 10px #444; z-index:2147483646;");
_container_upper = DocumentCreateElement("div");
ElementSetStyle(_container_upper,"min-height:50px;");
_window.appendChild(_container_upper);
_text_upper = new UI_Text(_container_upper);
_progress_upper = new UI_ProgressBar(_container_upper);
_container_lower = DocumentCreateElement("div");
ElementSetStyle(_container_lower,"min-height:60px;");
_window.appendChild(_container_lower);
_text_lower = new UI_Text(_container_lower);
_progress_lower = new UI_ProgressBar(_container_lower);
_button_cancel = DocumentCreateElement("input");
_button_cancel.type = "button";
_button_cancel.value = "CANCEL";
ElementSetStyle(_button_cancel,"width:100%; height:50px;");
_window.appendChild(_button_cancel);
_button_cancel.onclick = function(){
if(_this.onclose){
_this.onclose();
}
_this.close();
};
_this.setMessage("",0);
_this.setMessage("",1);
_this.setValueProgress(0.0,0);
_this.setValueProgress(0.0,1);
_this.setEnable(false);
// 開放イベント
_event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// インターナショナルメッセージ
// ------------------------------
function InternationalMessage(language){
var _this = this;
// ------------------------------
// アドレスを登録
// ------------------------------
_this.getMessage = function(asset){
if(_dictionary[asset]){
return _dictionary[asset].message;
}
return "XXXXX NO LOCALE MESSAGE XXXXX";
};
// ------------------------------
// プライベート変数
// ------------------------------
var _dictionary;
// ------------------------------
// 初期化
// ------------------------------
switch(language){
case 'ja':
_dictionary = InternationalMessage.locales.ja;
break;
default:
_dictionary = InternationalMessage.locales.en;
break;
}
}
// ------------------------------
// ロケールデータ
// ------------------------------
InternationalMessage.locales = {
ja: {
extension_name: {
message: "PageExpand"
},
extension_description: {
message: "画像の一括ダウンロード、画像のポップアップ、サムネイルやビデオの展開、短縮URLの展開、URL文字列のリンク化、リファラ置換、掲示板の拡張表示など..."
},
page_expand_config: {
message: "PageExpand 設定"
},
menu_setting_standard: {
message: "基本設定"
},
menu_setting_standard_filter_url: {
message: "動作を制限するURL"
},
menu_setting_standard_filter_url_combo_box_item_deny: {
message: "指定したアドレスのみ動作させない(それ以外はすべて動作する)"
},
menu_setting_standard_filter_url_combo_box_item_allow: {
message: "指定したアドレスのみ動作させる(それ以外はすべて動作しない)"
},
menu_setting_standard_filter_url_hint: {
message: "URL を記述します。アスタリスク使用可。複数行指定可。"
},
menu_setting_standard_check_box_container: {
message: "基本設定"
},
menu_setting_standard_enable_icon_address_bar: {
message: "アドレスバーにアイコンを表示"
},
menu_setting_standard_enable_context_menu: {
message: "コンテキストメニューを表示"
},
menu_setting_standard_enable_startup: {
message: "ロード完了時から動作を開始"
},
menu_setting_standard_enable_debug_mode: {
message: "デバッグモードで動作"
},
menu_setting_standard_enable_output_log: {
message: "コンソールにログを出力(デバッグ用)"
},
menu_setting_standard_execute_queue: {
message: "実行キュー設定(通常は変更の必要はありません)"
},
menu_setting_standard_execute_queue_time_sleep: {
message: "スリープ時間(ミリ秒)"
},
menu_setting_standard_execute_queue_time_occupancy: {
message: "最大CPU占有時間(ミリ秒)"
},
menu_setting_standard_execute_queue_hint: {
message: "最大CPU占有時間が大きいほど、操作レスポンスが悪くなり、スクリプトが高速に動作します。スリープ時間が小さいほど、CPU使用率が高くなり、スクリプトが高速に動作します。"
},
menu_setting_standard_touch: {
message: "タッチ操作設定"
},
menu_setting_standard_enable_input_touch: {
message: "タッチ操作を有効"
},
menu_setting_standard_enable_double_touch_assist: {
message: "ダブルタッチ補助線を表示"
},
menu_setting_standard_command: {
message: "メニューの実行(モバイル用)"
},
menu_setting_standard_command_execute_button: {
message: "実行する"
},
menu_setting_standard_command_execute_dialog: {
message: "メニューの実行"
},
menu_setting_standard_command_execute_dialog_tab_list: {
message: "実行対象となるタブを選択"
},
menu_setting_standard_command_execute_dialog_command_list: {
message: "実行するコマンドを選択"
},
menu_setting_standard_command_execute_dialog_confirm: {
message: "選択したメニューを実行しますか?"
},
menu_setting_standard_export_import: {
message: "設定のエクスポート / インポート"
},
menu_setting_standard_export_button: {
message: "エクスポート"
},
menu_setting_standard_import_button: {
message: "インポート"
},
menu_setting_standard_export_dialog: {
message: "設定のエクスポート"
},
menu_setting_standard_export_dialog_export: {
message: "エクスポート"
},
menu_setting_standard_export_dialog_export_hint: {
message: "テキストエリアの値をコピーして下さい。"
},
menu_setting_standard_import_dialog: {
message: "設定のインポート"
},
menu_setting_standard_import_dialog_explanation: {
message: "インポートについて"
},
menu_setting_standard_import_dialog_explanation_0: {
message: "インポートを行うと、現在の設定は全て失われます。"
},
menu_setting_standard_import_dialog_explanation_1: {
message: "インポートを行う前に、エクスポート機能でバックアップを取ることをお勧めします。"
},
menu_setting_standard_import_dialog_explanation_2: {
message: "信頼の無い人物が作成した設定データを、絶対にインポートしないで下さい。悪意のあるスクリプトが含まれる恐れがあります。"
},
menu_setting_standard_import_dialog_import: {
message: "インポート"
},
menu_setting_standard_import_dialog_import_hint: {
message: "エクスポートから出力したテキストをペーストして下さい。"
},
menu_setting_standard_import_dialog_confirm: {
message: "インポートを実行しますか?"
},
menu_setting_standard_import_alert: {
message: "インポートの結果"
},
menu_setting_standard_import_alert_success: {
message: "インポートが完了しました。"
},
menu_setting_standard_import_alert_failure: {
message: "インポートに失敗しました。"
},
menu_setting_standard_storage_sync: {
message: "同期ストレージ"
},
menu_setting_standard_storage_sync_load_button: {
message: "読込"
},
menu_setting_standard_storage_sync_save_button: {
message: "保存"
},
menu_setting_standard_storage_sync_delete_button: {
message: "削除"
},
menu_setting_standard_storage_sync_load_dialog: {
message: "同期ストレージの読み込み"
},
menu_setting_standard_storage_sync_load_dialog_explanation: {
message: "同期ストレージの読み込みについて"
},
menu_setting_standard_storage_sync_load_dialog_explanation_0: {
message: "同期ストレージからデータを読み込んで設定に反映します。"
},
menu_setting_standard_storage_sync_load_dialog_explanation_1: {
message: "読み込みを行うと、現在の設定は全て失われます。"
},
menu_setting_standard_storage_sync_load_dialog_explanation_2: {
message: "読み込みを行う前に、エクスポート機能でバックアップを取ることをお勧めします。"
},
menu_setting_standard_storage_sync_load_dialog_confirm: {
message: "同期ストレージから設定データを読み込みますか?"
},
menu_setting_standard_storage_sync_load_alert: {
message: "読み込みの結果"
},
menu_setting_standard_storage_sync_load_alert_success: {
message: "読み込みが完了しました。"
},
menu_setting_standard_storage_sync_load_alert_failure: {
message: "読み込みに失敗しました。"
},
menu_setting_standard_storage_sync_save_dialog: {
message: "同期ストレージの保存"
},
menu_setting_standard_storage_sync_save_dialog_explanation: {
message: "同期ストレージの保存について"
},
menu_setting_standard_storage_sync_save_dialog_explanation_0: {
message: "現在の設定を、同期ストレージに保存します。"
},
menu_setting_standard_storage_sync_save_dialog_explanation_1: {
message: "ブラウザの同期機能が有効である必要があります。"
},
menu_setting_standard_storage_sync_save_dialog_explanation_2: {
message: "容量に制限があります。サイズが大きすぎる場合失敗します。"
},
menu_setting_standard_storage_sync_save_dialog_confirm: {
message: "同期ストレージに設定データを保存しますか?"
},
menu_setting_standard_storage_sync_save_alert: {
message: "保存の結果"
},
menu_setting_standard_storage_sync_save_alert_success: {
message: "保存が完了しました。"
},
menu_setting_standard_storage_sync_save_alert_failure: {
message: "保存に失敗しました。"
},
menu_setting_standard_storage_sync_delete_dialog: {
message: "同期ストレージの削除"
},
menu_setting_standard_storage_sync_delete_dialog_explanation: {
message: "同期ストレージの削除について"
},
menu_setting_standard_storage_sync_delete_dialog_explanation_0: {
message: "同期ストレージに保存した設定データをすべて削除します。"
},
menu_setting_standard_storage_sync_delete_dialog_confirm: {
message: "同期ストレージの設定データを削除しますか?"
},
menu_setting_standard_storage_sync_delete_alert: {
message: "削除の結果"
},
menu_setting_standard_storage_sync_delete_alert_success: {
message: "削除が完了しました。"
},
menu_setting_standard_storage_sync_delete_alert_failure: {
message: "削除に失敗しました。"
},
menu_setting_standard_reset: {
message: "設定の初期化"
},
menu_setting_standard_reset_button: {
message: "すべての設定を削除して初期状態に戻す"
},
menu_setting_standard_reset_dialog: {
message: "設定の初期化"
},
menu_setting_standard_reset_dialog_explanation: {
message: "設定の初期化について"
},
menu_setting_standard_reset_dialog_explanation_0: {
message: "すべての設定をデフォルトの状態に戻します。"
},
menu_setting_standard_reset_dialog_explanation_1: {
message: "設定の初期化を行うと現在の設定は全て失われます。"
},
menu_setting_standard_reset_dialog_confirm: {
message: "設定の初期化を実行しますか?"
},
menu_setting_standard_reset_alert: {
message: "設定の初期化の結果"
},
menu_setting_standard_reset_alert_success: {
message: "設定の初期化が完了しました。"
},
menu_setting_standard_reset_alert_failure: {
message: "設定の初期化に失敗しました。"
},
menu_setting_download: {
message: "ダウンロード設定"
},
menu_setting_download_load: {
message: "ロード設定(XHR通信)"
},
menu_setting_download_load_thread_max: {
message: "最大同時ロード数"
},
menu_setting_download_load_timeout: {
message: "タイムアウト(ミリ秒)"
},
menu_setting_download_load_timeout_hint: {
message: "タイムアウトエラーと判定する時間をミリ秒で指定。0 で無制限。"
},
menu_setting_download_download: {
message: "ダウンロード設定"
},
menu_setting_download_download_thread_max: {
message: "最大同時ダウンロード数"
},
menu_setting_download_download_conflict_type: {
message: "ファイル名衝突時の処理"
},
menu_setting_download_download_conflict_type_combo_box_item_rename: {
message: "別名にリネーム"
},
menu_setting_download_download_conflict_type_combo_box_item_overwrite: {
message: "同名で上書き"
},
menu_setting_expand_bbs: {
message: "掲示板拡張設定"
},
menu_setting_expand_bbs_list: {
message: "掲示板拡張設定一覧"
},
menu_setting_expand_bbs_list_hint: {
message: "リストを選択すると下部のコントロールの入力が可能です。上から順番に動作条件スクリプトを実行し、許可があればその設定が使用されます。複数選択可。複数選択時は同時編集。灰色はプリセット設定。プリセット設定は削除不可(無効化は可能)。"
},
menu_setting_expand_bbs_button_add: {
message: "追加"
},
menu_setting_expand_bbs_button_delete: {
message: "削除"
},
menu_setting_expand_bbs_button_prio_up: {
message: "優先度を上げる"
},
menu_setting_expand_bbs_button_prio_down: {
message: "優先度を下げる"
},
menu_setting_expand_bbs_button_export: {
message: "エクスポート"
},
menu_setting_expand_bbs_button_import: {
message: "インポート"
},
menu_setting_expand_bbs_add_dialog: {
message: "掲示板拡張設定の新規作成"
},
menu_setting_expand_bbs_add_dialog_name: {
message: "名前"
},
menu_setting_expand_bbs_add_dialog_copy_define: {
message: "既存の設定から複製"
},
menu_setting_expand_bbs_add_dialog_define_list_box_item_new: {
message: "複製せずに新規作成する"
},
menu_setting_expand_bbs_export_dialog: {
message: "掲示板拡張設定のエクスポート"
},
menu_setting_expand_bbs_export_dialog_export: {
message: "エクスポート"
},
menu_setting_expand_bbs_export_dialog_export_hint: {
message: "テキストエリアの値をコピーして下さい。"
},
menu_setting_expand_bbs_import_dialog: {
message: "掲示板拡張設定のインポート"
},
menu_setting_expand_bbs_import_dialog_explanation: {
message: "インポートについて"
},
menu_setting_expand_bbs_import_dialog_explanation_0: {
message: "プリセット設定は上書き、ユーザー設定は新規追加されます。"
},
menu_setting_expand_bbs_import_dialog_explanation_1: {
message: "インポートを行う前に、基本設定のエクスポート機能でバックアップを取ることをお勧めします。"
},
menu_setting_expand_bbs_import_dialog_explanation_2: {
message: "信頼の無い人物が作成した設定データを、絶対にインポートしないで下さい。悪意のあるスクリプトが含まれる恐れがあります。"
},
menu_setting_expand_bbs_import_dialog_import: {
message: "インポート"
},
menu_setting_expand_bbs_import_dialog_import_hint: {
message: "エクスポートから出力したテキストをペーストして下さい。"
},
menu_setting_expand_bbs_import_dialog_confirm: {
message: "インポートを実行しますか?"
},
menu_setting_expand_bbs_import_alert: {
message: "インポートの結果"
},
menu_setting_expand_bbs_import_alert_success: {
message: "インポートが完了しました。"
},
menu_setting_expand_bbs_import_alert_failure: {
message: "インポートに失敗しました。"
},
menu_setting_expand_bbs_name: {
message: "名前"
},
menu_setting_expand_bbs_check_box_container: {
message: "有効 / 無効"
},
menu_setting_expand_bbs_enable_setting: {
message: "この設定を使用する"
},
menu_setting_expand_bbs_filter_url: {
message: "動作URLの設定"
},
menu_setting_expand_bbs_popup_check_box_container: {
message: "ポップアップの設定"
},
menu_setting_expand_bbs_popup_enable_animation: {
message: "ポップアップ時のアニメーション動作を有効"
},
menu_setting_expand_bbs_popup_origin_type: {
message: "ポップアップの配置基点"
},
menu_setting_expand_bbs_popup_origin_type_combo_box_item_adsorb_top_bottom: {
message: "上下に吸着"
},
menu_setting_expand_bbs_popup_origin_type_combo_box_item_adsorb_left_right: {
message: "左右に吸着"
},
menu_setting_expand_bbs_popup_position_type: {
message: "ポップアップの配置位置"
},
menu_setting_expand_bbs_popup_position_type_combo_box_item_absolute: {
message: "絶対座標系に配置"
},
menu_setting_expand_bbs_popup_position_type_combo_box_item_fixed: {
message: "クライアント座標系に配置"
},
menu_setting_expand_bbs_popup_percent: {
message: "ポップアップサイズ"
},
menu_setting_expand_bbs_popup_percent_h: {
message: "横方向パーセント (0~100)"
},
menu_setting_expand_bbs_popup_percent_v: {
message: "縦方向パーセント (0~100)"
},
menu_setting_expand_bbs_popup_time: {
message: "ポップアップ時間"
},
menu_setting_expand_bbs_popup_time_wait_open: {
message: "開くまでに待機する時間(ミリ秒)"
},
menu_setting_expand_bbs_popup_time_wait_close: {
message: "閉じるまでに待機する時間(ミリ秒)"
},
menu_setting_expand_bbs_popup_style_sheet: {
message: "ポップアップのスタイル"
},
menu_setting_expand_bbs_script_initialize: {
message: "初期化スクリプト"
},
menu_setting_expand_bbs_script_callback: {
message: "コールバックスクリプト"
},
menu_setting_urlmap: {
message: "URLマッピング設定"
},
menu_setting_urlmap_list: {
message: "URLマッピング設定一覧"
},
menu_setting_urlmap_list_hint: {
message: "リストを選択すると下部のコントロールの入力が可能です。上から順番にURLの比較を行いマッチすればその設定が使用されます。複数選択可。複数選択時は同時編集。灰色はプリセット設定。プリセット設定は削除不可(無効化は可能)。"
},
menu_setting_urlmap_button_add: {
message: "追加"
},
menu_setting_urlmap_button_delete: {
message: "削除"
},
menu_setting_urlmap_button_prio_up: {
message: "優先度を上げる"
},
menu_setting_urlmap_button_prio_down: {
message: "優先度を下げる"
},
menu_setting_urlmap_add_dialog: {
message: "URLマッピング設定の新規作成"
},
menu_setting_urlmap_add_dialog_name: {
message: "名前"
},
menu_setting_urlmap_add_dialog_copy_define: {
message: "既存の設定から複製"
},
menu_setting_urlmap_add_dialog_define_list_box_item_new: {
message: "複製せずに新規作成する"
},
menu_setting_urlmap_name: {
message: "名前"
},
menu_setting_urlmap_check_box_container: {
message: "有効 / 無効"
},
menu_setting_urlmap_enable_setting: {
message: "この設定を使用する"
},
menu_setting_urlmap_filter_url: {
message: "動作URLの設定"
},
menu_setting_urlmap_unsecure_check_box_container: {
message: "セキュリティ"
},
menu_setting_urlmap_enable_unsecure: {
message: "セキュアなページ内で「http://~ にあるリソース」を展開する"
},
menu_setting_urlmap_enable_unsecure_hint: {
message: "無効の場合、https://~ にあるリソースだけ展開します。有効の場合、http://~ にあるリソースも展開しますが、常に暗号化の警告が表示されます。"
},
menu_setting_urlmap_enable_mixed_content: {
message: "セキュアなページ内で「デフォルトでブロックされる混在コンテンツ」の展開を試みる"
},
menu_setting_urlmap_enable_mixed_content_hint: {
message: "ブラウザは、一部の要素の展開をブロックします。無効の場合、ブロックされる要素を展開しません。有効の場合、すべての要素の展開を試みます。(ブラウザの設定を変更しない限り失敗します。変更は非推奨。)"
},
menu_setting_urlmap_define_button_edit: {
message: "編集"
},
menu_setting_urlmap_define_button_add: {
message: "追加"
},
menu_setting_urlmap_define_button_remove: {
message: "除外"
},
menu_setting_urlmap_define_button_prio_up: {
message: "上へ"
},
menu_setting_urlmap_define_button_prio_down: {
message: "下へ"
},
menu_setting_urlmap_define_combo_box_item_no_use: {
message: "定義を使用しない"
},
menu_setting_define_multi_select_add_dialog: {
message: "定義の追加"
},
menu_setting_define_multi_select_add_dialog_list: {
message: "追加する定義を選択"
},
menu_setting_access_block: {
message: "アクセス遮断定義"
},
menu_setting_access_block_filter_url: {
message: "アクセス遮断URLを設定"
},
menu_setting_replacement_to_element: {
message: "エレメント置換定義"
},
menu_setting_replacement_to_element_script: {
message: "コールバックスクリプト"
},
menu_setting_replacement_to_text: {
message: "テキスト置換定義"
},
menu_setting_replacement_to_text_script: {
message: "コールバックスクリプト"
},
menu_setting_replacement_to_anchor: {
message: "アンカー置換定義"
},
menu_setting_replacement_to_anchor_script: {
message: "コールバックスクリプト"
},
menu_setting_replacement_to_link: {
message: "ハイパーリンク置換定義"
},
menu_setting_replacement_to_link_filter_list: {
message: "フィルタ一覧"
},
menu_setting_replacement_to_link_filter_name: {
message: "フィルタ名"
},
menu_setting_replacement_to_link_filter: {
message: "フィルタ設定"
},
menu_setting_replacement_to_link_filter_filter_url: {
message: "動作リンク先URLの設定"
},
menu_setting_replacement_to_link_check_box_container: {
message: "ハイパーリンク置換の設定"
},
menu_setting_replacement_to_link_enable_reflect_to_anchor: {
message: "リンクの変更をアンカーに反映する"
},
menu_setting_replacement_to_link_enable_cache: {
message: "コールバックスクリプトの実行結果をキャッシュする"
},
menu_setting_replacement_to_link_filter_script: {
message: "コールバックスクリプト"
},
menu_setting_replacement_to_referer: {
message: "リファラ置換定義"
},
menu_setting_replacement_to_referer_filter_list: {
message: "フィルタ一覧"
},
menu_setting_replacement_to_referer_filter_name: {
message: "フィルタ名"
},
menu_setting_replacement_to_referer_filter: {
message: "フィルタ設定"
},
menu_setting_replacement_to_referer_filter_filter_url: {
message: "動作リンク先URLの設定"
},
menu_setting_replacement_to_referer_filter_send_type: {
message: "基本リファラ"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item: {
message: "基本リファラ値"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item_default: {
message: "改変しない"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item_current_url: {
message: "現在のURL"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item_link_url: {
message: "リンク先のURL"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item_custom: {
message: "カスタム文字列"
},
menu_setting_replacement_to_referer_filter_send_custom: {
message: "カスタム文字列"
},
menu_setting_replacement_to_referer_filter_send_regexp: {
message: "基本リファラを正規表現で置換"
},
menu_setting_replacement_to_referer_filter_send_regexp_match: {
message: "マッチ条件"
},
menu_setting_replacement_to_referer_filter_send_regexp_replacement: {
message: "置換後の文字列"
},
menu_setting_replacement_to_referer_filter_send_regexp_replacement_hint: {
message: "$0…マッチした全体文字列。$1~$9…マッチした部分文字列。$$…ドルのエスケープシーケンス"
},
menu_setting_replacement_to_useragent: {
message: "ユーザーエージェント置換定義"
},
menu_setting_replacement_to_useragent_filter_list: {
message: "フィルタ一覧"
},
menu_setting_replacement_to_useragent_filter_name: {
message: "フィルタ名"
},
menu_setting_replacement_to_useragent_filter: {
message: "フィルタ設定"
},
menu_setting_replacement_to_useragent_filter_filter_url: {
message: "動作リンク先URLの設定"
},
menu_setting_replacement_to_useragent_filter_send: {
message: "基本ユーザーエージェント"
},
menu_setting_replacement_to_useragent_filter_send_custom: {
message: "カスタム文字列"
},
menu_setting_make_link_to_text: {
message: "ハイパーリンク化定義"
},
menu_setting_make_link_to_text_script: {
message: "コールバックスクリプト"
},
menu_setting_expand_short_url: {
message: "短縮URL展開定義"
},
menu_setting_expand_short_url_filter_url: {
message: "対象URLを設定"
},
menu_setting_expand_text: {
message: "テキスト展開定義"
},
menu_setting_expand_text_inline: {
message: "インライン表示の設定"
},
menu_setting_expand_text_inline_check_box_container: {
message: "インライン表示の設定"
},
menu_setting_expand_text_inline_disable_same_text: {
message: "同じURLは展開しない"
},
menu_setting_expand_text_inline_script_allow: {
message: "リンクからインライン表示する条件"
},
menu_setting_expand_text_inline_script_insert: {
message: "テキストの挿入位置"
},
menu_setting_expand_image: {
message: "イメージ展開定義"
},
menu_setting_expand_image_thumbnail: {
message: "サムネイル表示設定"
},
menu_setting_expand_image_thumbnail_enable_check_box_container: {
message: "有効 / 無効"
},
menu_setting_expand_image_thumbnail_enable_thumbnail: {
message: "サムネイルを表示する"
},
menu_setting_expand_image_thumbnail_check_box_container: {
message: "サムネイル表示設定"
},
menu_setting_expand_image_thumbnail_enable_popup_mouseover: {
message: "サムネイルにマウスオーバーするとポップアップ表示"
},
menu_setting_expand_image_thumbnail_disable_same_thumbnail_image: {
message: "同じイメージがすでに配置されている場合サムネイルを表示しない"
},
menu_setting_expand_image_thumbnail_script_allow: {
message: "リンクからサムネイル化する条件"
},
menu_setting_expand_image_thumbnail_script_insert: {
message: "サムネイルの挿入位置"
},
menu_setting_expand_image_popup: {
message: "ポップアップ表示設定"
},
menu_setting_expand_image_popup_enable_check_box_container: {
message: "有効 / 無効"
},
menu_setting_expand_image_popup_enable_popup_mouseover: {
message: "アンカーをマウスオーバーするとポップアップ表示"
},
menu_setting_expand_image_popup_check_box_container: {
message: "アニメーション設定"
},
menu_setting_expand_image_popup_enable_animation_scale: {
message: "拡大縮小フェードを有効"
},
menu_setting_expand_image_popup_enable_animation_alpha: {
message: "半透明フェードを有効"
},
menu_setting_expand_image_popup_origin_type: {
message: "ポップアップイメージの配置基点"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_center: {
message: "中心を基点"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_upper_left: {
message: "左上を基点"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_upper_right: {
message: "右上を基点"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_client_center: {
message: "クライアント中央"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_adsorb_element: {
message: "エレメントに吸着"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_adsorb_mouse: {
message: "マウスカーソルに吸着"
},
menu_setting_expand_image_popup_time: {
message: "ポップアップ時間"
},
menu_setting_expand_image_popup_time_wait_open: {
message: "開くまでに待機する時間(ミリ秒)"
},
menu_setting_expand_image_popup_time_wait_close: {
message: "閉じるまでに待機する時間(ミリ秒)"
},
menu_setting_expand_image_popup_position_type: {
message: "ポップアップイメージの配置位置"
},
menu_setting_expand_image_popup_position_type_combo_box_item_absolute: {
message: "絶対座標系に配置"
},
menu_setting_expand_image_popup_position_type_combo_box_item_fixed: {
message: "クライアント座標系に配置"
},
menu_setting_expand_image_popup_size: {
message: "ポップアップイメージの表示サイズ"
},
menu_setting_expand_image_popup_size_scale: {
message: "拡大率(パーセント)"
},
menu_setting_expand_image_popup_script_allow: {
message: "リンクからポップアップ表示する条件"
},
menu_setting_expand_image_reduced_image: {
message: "縮小イメージ設定"
},
menu_setting_expand_image_reduced_image_check_box_container: {
message: "有効 / 無効"
},
menu_setting_expand_image_popup_enable_popup: {
message: "縮小されたイメージをマウスオーバーするとポップアップ表示"
},
menu_setting_expand_image_reduced_image_allow_slcale_less_then: {
message: "縮小イメージのポップアップ条件"
},
menu_setting_expand_image_reduced_image_allow_slcale_less_then_text: {
message: "以下の拡大率の場合"
},
menu_setting_expand_image_load: {
message: "イメージのロード設定"
},
menu_setting_expand_image_load_check_box_container: {
message: "イメージのロード設定"
},
menu_setting_expand_image_load_enable_notify: {
message: "ロード進捗を表示"
},
menu_setting_expand_image_load_start_type: {
message: "イメージのロード設定"
},
menu_setting_expand_image_load_start_type_preload: {
message: "すべて事前に読み込む"
},
menu_setting_expand_image_load_start_type_scroll: {
message: "スクロールと連動して読み込む"
},
menu_setting_expand_image_load_src_type: {
message: "イメージのソースタイプ"
},
menu_setting_expand_image_load_src_type_combo_box_item_url: {
message: "すべて URL 形式"
},
menu_setting_expand_image_load_src_type_combo_box_item_mixed_content: {
message: "Data URI scheme に変換(混在コンテンツのみ)"
},
menu_setting_expand_image_load_src_type_combo_box_item_data_uri_scheme: {
message: "Data URI scheme に変換(すべて)"
},
menu_setting_expand_image_load_unload_check_box_container: {
message: "イメージのアンロード設定"
},
menu_setting_expand_image_load_enable_unload: {
message: "イメージのアンロードを有効"
},
menu_setting_expand_image_load_unload: {
message: "イメージのアンロード条件"
},
menu_setting_expand_image_load_allow_unload_more_then_text: {
message: "MByte以上ロードした場合、古いイメージを解放する"
},
menu_setting_expand_sound: {
message: "サウンド展開定義"
},
menu_setting_expand_sound_inline: {
message: "インライン表示の設定"
},
menu_setting_expand_sound_inline_check_box_container: {
message: "インライン表示の設定"
},
menu_setting_expand_sound_inline_disable_same_text: {
message: "同じURLは展開しない"
},
menu_setting_expand_sound_inline_sound_max: {
message: "最大同時表示数"
},
menu_setting_expand_sound_inline_script_allow: {
message: "リンクからインライン表示する条件"
},
menu_setting_expand_sound_inline_script_insert: {
message: "オーディオの挿入位置"
},
menu_setting_expand_sound_inline_element: {
message: "HTMLAudioElement の設定"
},
menu_setting_expand_sound_inline_element_script_allow: {
message: "HTMLAudioElement を表示する条件"
},
menu_setting_expand_sound_inline_soundcloud: {
message: "soundcloud.com の設定"
},
menu_setting_expand_sound_inline_soundcloud_check_box_container: {
message: "soundcloud.com の設定"
},
menu_setting_expand_sound_inline_soundcloud_visible_player_flash: {
message: "Flash 版のプレイヤーを表示"
},
menu_setting_expand_sound_inline_soundcloud_visible_player_html5: {
message: "HTML5 版のプレイヤーを表示"
},
menu_setting_expand_sound_inline_mixcloud: {
message: "www.mixcloud.com の設定"
},
menu_setting_expand_sound_inline_mixcloud_check_box_container: {
message: "www.mixcloud.com の設定"
},
menu_setting_expand_sound_inline_mixcloud_visible_player: {
message: "プレイヤーを表示"
},
menu_setting_expand_video: {
message: "ビデオ展開定義"
},
menu_setting_expand_video_inline: {
message: "インライン表示の設定"
},
menu_setting_expand_video_inline_check_box_container: {
message: "インライン表示の設定"
},
menu_setting_expand_video_inline_disable_same_video: {
message: "同じURLは展開しない"
},
menu_setting_expand_video_inline_video_max: {
message: "最大同時表示数"
},
menu_setting_expand_video_inline_script_allow: {
message: "リンクからインライン表示する条件"
},
menu_setting_expand_video_inline_script_insert: {
message: "エレメントの挿入位置"
},
menu_setting_expand_video_inline_element: {
message: "HTMLVideoElement の設定"
},
menu_setting_expand_video_inline_element_script_allow: {
message: "HTMLVideoElement を表示する条件"
},
menu_setting_expand_video_inline_youtube: {
message: "www.youtube.com の設定"
},
menu_setting_expand_video_inline_youtube_check_box_container: {
message: "www.youtube.com の設定"
},
menu_setting_expand_video_inline_youtube_visible_video: {
message: "ビデオを表示"
},
menu_setting_expand_video_inline_nicovideo: {
message: "www.nicovideo.jp の設定"
},
menu_setting_expand_video_inline_nicovideo_check_box_container: {
message: "www.nicovideo.jp の設定"
},
menu_setting_expand_video_inline_nicovideo_visible_video: {
message: "ビデオを表示"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_video: {
message: "ビデオサムネイルを表示"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_mylist: {
message: "マイリストサムネイルを表示"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_user: {
message: "ユーザーサムネイルを表示"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_community: {
message: "コミュニティサムネイルを表示"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_live: {
message: "生放送サムネイルを表示"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_seiga: {
message: "静画サムネイルを表示"
},
menu_setting_expand_video_inline_ustream: {
message: "www.ustream.tv の設定"
},
menu_setting_expand_video_inline_ustream_check_box_container: {
message: "www.ustream.tv の設定"
},
menu_setting_expand_video_inline_ustream_visible_video_live: {
message: "配信ビデオを表示"
},
menu_setting_expand_video_inline_ustream_visible_video_record: {
message: "録画ビデオを表示"
},
menu_setting_expand_video_inline_dailymotion: {
message: "www.dailymotion.com の設定"
},
menu_setting_expand_video_inline_dailymotion_check_box_container: {
message: "www.dailymotion.com の設定"
},
menu_setting_expand_video_inline_dailymotion_visible_video: {
message: "ビデオを表示"
},
menu_setting_expand_video_inline_video: {
message: "vimeo.com の設定"
},
menu_setting_expand_video_inline_video_check_box_container: {
message: "vimeo.com の設定"
},
menu_setting_expand_video_inline_video_visible_video: {
message: "ビデオを表示"
},
menu_setting_expand_video_inline_fc2video: {
message: "video.fc2.com の設定"
},
menu_setting_expand_video_inline_fc2video_check_box_container: {
message: "video.fc2.com の設定"
},
menu_setting_expand_video_inline_fc2video_visible_video: {
message: "ビデオを表示"
},
menu_setting_expand_video_inline_liveleak: {
message: "www.liveleak.com の設定"
},
menu_setting_expand_video_inline_liveleak_check_box_container: {
message: "www.liveleak.com の設定"
},
menu_setting_expand_video_inline_liveleak_visible_video: {
message: "ビデオを表示"
},
menu_setting_expand_iframe: {
message: "インラインフレーム展開定義"
},
menu_setting_expand_iframe_inline: {
message: "インライン表示の設定"
},
menu_setting_expand_iframe_inline_check_box_container: {
message: "インライン表示の設定"
},
menu_setting_expand_iframe_inline_disable_same_iframe: {
message: "同じURLは展開しない"
},
menu_setting_expand_iframe_inline_script_allow: {
message: "リンクからインライン表示する条件"
},
menu_setting_expand_iframe_inline_script_insert: {
message: "HTMLIFrameElement の挿入位置"
},
menu_setting_style_sheet: {
message: "スタイルシート定義"
},
menu_setting_style_sheet_expand_text: {
message: "テキスト展開のスタイル"
},
menu_setting_style_sheet_expand_text_element: {
message: "HTMLTextAreaElement の設定"
},
menu_setting_style_sheet_expand_text_element_inline: {
message: "テキストのインライン表示"
},
menu_setting_style_sheet_expand_image: {
message: "イメージ展開のスタイル"
},
menu_setting_style_sheet_expand_image_element: {
message: "HTMImageElement の設定"
},
menu_setting_style_sheet_expand_image_element_inline: {
message: "イメージのサムネイル表示"
},
menu_setting_style_sheet_expand_image_element_popup: {
message: "イメージのポップアップ表示"
},
menu_setting_style_sheet_expand_sound: {
message: "サウンド展開のスタイル"
},
menu_setting_style_sheet_expand_sound_element: {
message: "HTMLAudioElement の設定"
},
menu_setting_style_sheet_expand_sound_element_inline_audio: {
message: "オーディオのインライン表示"
},
menu_setting_style_sheet_expand_sound_soundcloud: {
message: "soundcloud.com の設定"
},
menu_setting_style_sheet_expand_sound_soundcloud_inline_player_flash: {
message: "Flash 版プレイヤーのインライン表示"
},
menu_setting_style_sheet_expand_sound_soundcloud_inline_player_html5: {
message: "HTML5 版プレイヤーのインライン表示"
},
menu_setting_style_sheet_expand_sound_mixcloud: {
message: "www.mixcloud.com の設定"
},
menu_setting_style_sheet_expand_sound_mixcloud_inline_player: {
message: "プレイヤーのインライン表示"
},
menu_setting_style_sheet_expand_video: {
message: "ビデオ展開のスタイル"
},
menu_setting_style_sheet_expand_video_element: {
message: "HTMLVideoElement の設定"
},
menu_setting_style_sheet_expand_video_element_inline_video: {
message: "ビデオのインライン表示"
},
menu_setting_style_sheet_expand_video_youtube: {
message: "www.youtube.com の設定"
},
menu_setting_style_sheet_expand_video_youtube_inline_video: {
message: "ビデオのインライン表示"
},
menu_setting_style_sheet_expand_video_nicovideo: {
message: "www.nicovideo.jp の設定"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_video: {
message: "ビデオのインライン表示"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_video: {
message: "ビデオサムネイルのインライン表示"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_mylist: {
message: "マイリストサムネイルのインライン表示"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_user: {
message: "ユーザーサムネイルのインライン表示"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_community: {
message: "コミュニティサムネイルのインライン表示"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_live: {
message: "生放送サムネイルのインライン表示"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_seiga: {
message: "静画サムネイルのインライン表示"
},
menu_setting_style_sheet_expand_video_ustream: {
message: "www.ustream.tv の設定"
},
menu_setting_style_sheet_expand_video_ustream_inline_video_record: {
message: "配信ビデオのインライン表示"
},
menu_setting_style_sheet_expand_video_ustream_inline_video_live: {
message: "録画ビデオのインライン表示"
},
menu_setting_style_sheet_expand_video_dailymotion: {
message: "www.dailymotion.com の設定"
},
menu_setting_style_sheet_expand_video_dailymotion_inline_video: {
message: "ビデオのインライン表示"
},
menu_setting_style_sheet_expand_video_vimeo: {
message: "vimeo.com の設定"
},
menu_setting_style_sheet_expand_video_vimeo_inline_video: {
message: "ビデオのインライン表示"
},
menu_setting_style_sheet_expand_video_fc2video: {
message: "video.fc2.com の設定"
},
menu_setting_style_sheet_expand_video_fc2video_inline_video: {
message: "ビデオのインライン表示"
},
menu_setting_style_sheet_expand_video_liveleak: {
message: "www.liveleak.com の設定"
},
menu_setting_style_sheet_expand_video_liveleak_inline_video: {
message: "ビデオのインライン表示"
},
menu_setting_style_sheet_expand_iframe: {
message: "インラインフレーム展開のスタイル"
},
menu_setting_style_sheet_expand_iframe_element: {
message: "HTMLIFrameElement の設定"
},
menu_setting_style_sheet_expand_iframe_element_inline: {
message: "インラインフレームのインライン表示"
},
menu_setting_experimental: {
message: "試験運用機能の定義"
},
menu_setting_experimental_revise_scroll: {
message: "スクロール補正機能"
},
menu_setting_experimental_revise_scroll_check_box_container: {
message: "スクロール補正の設定"
},
menu_setting_experimental_revise_scroll_enable: {
message: "有効"
},
menu_setting_experimental_revise_scroll_threshold_vertical: {
message: "補正対象とする縦方向のしきい値( 0 [画面上端] ~ 100 [画面下端] )"
},
menu_setting_language: {
message: "LANGUAGE (言語設定)"
},
menu_credit: {
message: "クレジット"
},
menu_credit_info_version: {
message: "バージョン情報"
},
menu_credit_info_copyright: {
message: "製作"
},
menu_setting_define_list: {
message: "定義一覧"
},
menu_setting_define_list_hint: {
message: "リストを選択すると下部のコントロールの入力が可能です。複数選択可。複数選択時は同時編集。灰色はプリセット設定。プリセット設定は削除不可。"
},
menu_setting_define_button_add: {
message: "追加"
},
menu_setting_define_button_delete: {
message: "削除"
},
menu_setting_define_button_move_up: {
message: "上に移動"
},
menu_setting_define_button_move_down: {
message: "下に移動"
},
menu_setting_define_button_export: {
message: "エクスポート"
},
menu_setting_define_button_import: {
message: "インポート"
},
menu_setting_define_add_dialog: {
message: "定義の新規作成"
},
menu_setting_define_add_dialog_name: {
message: "名前"
},
menu_setting_define_add_dialog_copy_define: {
message: "既存の定義から複製"
},
menu_setting_define_add_dialog_define_list_box_item_new: {
message: "複製せずに新規作成する"
},
menu_setting_define_delete_dialog: {
message: "定義の削除"
},
menu_setting_define_delete_dialog_name: {
message: "削除する定義名"
},
menu_setting_define_delete_dialog_change_define: {
message: "定義の代替選択"
},
menu_setting_define_delete_dialog_define_list_box_item_no_use: {
message: "定義を使用しない"
},
menu_setting_define_name: {
message: "定義名"
},
menu_setting_define_export_dialog: {
message: "定義のエクスポート"
},
menu_setting_define_export_dialog_export: {
message: "エクスポート"
},
menu_setting_define_export_dialog_export_hint: {
message: "テキストエリアの値をコピーして下さい。"
},
menu_setting_define_import_dialog: {
message: "定義のインポート"
},
menu_setting_define_import_dialog_explanation: {
message: "インポートについて"
},
menu_setting_define_import_dialog_explanation_0: {
message: "プリセット設定は上書き、ユーザー設定は新規追加されます。"
},
menu_setting_define_import_dialog_explanation_1: {
message: "インポートを行う前に、基本設定のエクスポート機能でバックアップを取ることをお勧めします。"
},
menu_setting_define_import_dialog_explanation_2: {
message: "信頼の無い人物が作成した設定データを、絶対にインポートしないで下さい。悪意のあるスクリプトが含まれる恐れがあります。"
},
menu_setting_define_import_dialog_import: {
message: "インポート"
},
menu_setting_define_import_dialog_import_hint: {
message: "エクスポートから出力したテキストをペーストして下さい。"
},
menu_setting_define_import_dialog_confirm: {
message: "インポートを実行しますか?"
},
menu_setting_define_import_alert: {
message: "インポートの結果"
},
menu_setting_define_import_alert_success: {
message: "インポートが完了しました。"
},
menu_setting_define_import_alert_failure: {
message: "インポートに失敗しました。"
},
menu_setting_define_wildcard_detail: {
message: "ワイルドカードについて"
},
menu_setting_define_wildcard_detail_0: {
message: "ワイルドカードは、最後に必ず実行されます。"
},
menu_setting_define_wildcard_detail_1: {
message: "ワイルドカードは、ブラウザのすべての通信に影響します。"
},
menu_setting_define_wildcard_detail_2: {
message: "ワイルドカードは、定義ではありません。「URL マッピング設定」にて使用する事はできません。"
},
menu_setting_filter_list: {
message: "フィルタ一覧"
},
menu_setting_filter_list_hint: {
message: "リストを選択すると下部のコントロールの入力が可能です。上から順番にURLの比較を行いマッチすればその設定が使用されます。"
},
menu_setting_filter_button_add: {
message: "追加"
},
menu_setting_filter_button_delete: {
message: "削除"
},
menu_setting_filter_button_prio_up: {
message: "優先度を上げる"
},
menu_setting_filter_button_prio_down: {
message: "優先度を下げる"
},
menu_setting_filter_button_export: {
message: "エクスポート"
},
menu_setting_filter_button_import: {
message: "インポート"
},
menu_setting_filter_add_dialog: {
message: "フィルタの新規作成"
},
menu_setting_filter_add_dialog_name: {
message: "名前"
},
menu_setting_filter_add_dialog_copy_define: {
message: "既存の設定から複製"
},
menu_setting_filter_add_dialog_define_list_box_item_new: {
message: "複製せずに新規作成する"
},
menu_setting_filter_export_dialog: {
message: "フィルタのエクスポート"
},
menu_setting_filter_export_dialog_export: {
message: "エクスポート"
},
menu_setting_filter_export_dialog_export_hint: {
message: "テキストエリアの値をコピーして下さい。"
},
menu_setting_filter_import_dialog: {
message: "フィルタのインポート"
},
menu_setting_filter_import_dialog_explanation: {
message: "インポートについて"
},
menu_setting_filter_import_dialog_explanation_0: {
message: "インポートした内容は、リストの最後に追加されます。"
},
menu_setting_filter_import_dialog_explanation_1: {
message: "インポートを行う前に、基本設定のエクスポート機能でバックアップを取ることをお勧めします。"
},
menu_setting_filter_import_dialog_explanation_2: {
message: "信頼の無い人物が作成した設定データを、絶対にインポートしないで下さい。悪意のあるスクリプトが含まれる恐れがあります。"
},
menu_setting_filter_import_dialog_import: {
message: "インポート"
},
menu_setting_filter_import_dialog_import_hint: {
message: "エクスポートから出力したテキストをペーストして下さい。"
},
menu_setting_filter_import_dialog_confirm: {
message: "インポートを実行しますか?"
},
menu_setting_filter_import_alert: {
message: "インポートの結果"
},
menu_setting_filter_import_alert_success: {
message: "インポートが完了しました。"
},
menu_setting_filter_import_alert_failure: {
message: "インポートに失敗しました。"
},
menu_button_ok: {
message: "OK"
},
menu_button_yes: {
message: "決定"
},
menu_button_no: {
message: "キャンセル"
},
menu_scriptarea_hint: {
message: "配列に格納して匿名関数を記述します。信頼の無い人物が作成したスクリプトを、絶対に書き込まないで下さい。悪意のあるスクリプトが含まれる恐れがあります。"
},
menu_text_regexp_hint: {
message: "正規表現文字列を記述。[オプション] g…繰り返し処理、i…小文字と大文字を区別しない"
},
menu_regexp_list_button_add: {
message: "追加"
},
menu_regexp_list_button_delete: {
message: "削除"
},
menu_regexp_list_button_move_up: {
message: "上に移動"
},
menu_regexp_list_button_move_down: {
message: "下に移動"
},
menu_setting_url_edit_container_combo_box_item_asterisk: {
message: "アスタリスク形式で入力する"
},
menu_setting_url_edit_container_combo_box_item_regexp: {
message: "正規表現形式で入力する"
},
menu_setting_url_edit_container_type_asterisk_hint: {
message: "URL を記述します。アスタリスク使用可。複数行指定可。"
},
page_expand_popup_menu: {
message: "PageExpand メニュー"
},
context_menu_pageexpand_config: {
message: "PageExpand の設定"
},
context_menu_batch_download_image: {
message: "一括ダウンロード(画像)"
},
context_menu_batch_download_user: {
message: "一括ダウンロード(ユーザー)"
},
context_menu_pageexpand_config_current_page: {
message: "現在のページの設定を編集"
},
context_menu_pageexpand_config_current_bbs: {
message: "現在の掲示板の設定を編集"
},
context_menu_pageexpand_config_current_page_confirm: {
message: "PageExpand 設定は、規定のページ内でしか動作しません。\n(Web ページ側から悪意のあるスクリプトが注入されるのを防ぐためです)\n\n以下のページを開きますか?\n"
},
context_menu_pageexpand_config_auto_run_confirm: {
message: "このページ内で PageExpand 設定を実行しますか?\n(もしこのページが汚染されている場合、悪意のあるスクリプトが注入されます)\n\n"
},
context_menu_pageexpand_execute: {
message: "PageExpand の実行"
},
context_menu_pageexpand_abort: {
message: "PageExpand の中止"
},
context_menu_pageexpand_debug: {
message: "PageExpand デバッグ"
}
},
en: {
extension_name: {
message: "PageExpand"
},
extension_description: {
message: "All Image Download. Image Zoom. Expand Thumbnail and Audio and Video. Expand the short URL. Generate a link from text. Override Referer. Extend BBS. etc..."
},
page_expand_config: {
message: "PageExpand Setting"
},
menu_setting_standard: {
message: "Standard Setting"
},
menu_setting_standard_filter_url: {
message: "To limit the operation by URL"
},
menu_setting_standard_filter_url_combo_box_item_deny: {
message: "Do not operate only at the specified address. (Otherwise it will all work.)"
},
menu_setting_standard_filter_url_combo_box_item_allow: {
message: "Work only at the specified address. (Otherwise, all does not work.)"
},
menu_setting_standard_filter_url_hint: {
message: "Describes the URL. Can be used an asterisk. Can be specified multi line."
},
menu_setting_standard_check_box_container: {
message: "Standard Setting"
},
menu_setting_standard_enable_icon_address_bar: {
message: "Displays an icon in the address bar."
},
menu_setting_standard_enable_context_menu: {
message: "Display the context menu."
},
menu_setting_standard_enable_startup: {
message: "Operation starts from when the load is finished."
},
menu_setting_standard_enable_debug_mode: {
message: "Running in debug mode."
},
menu_setting_standard_enable_output_log: {
message: "Output the log to the console.(debug)"
},
menu_setting_standard_execute_queue: {
message: "ExecuteQueue Setting (Normally, you do not need to change.)"
},
menu_setting_standard_execute_queue_time_sleep: {
message: "Sleep time (Millisecond)"
},
menu_setting_standard_execute_queue_time_occupancy: {
message: "Maximum CPU occupancy time (Millisecond)"
},
menu_setting_standard_execute_queue_hint: {
message: "When maximum CPU occupancy time is large, Response operation is worse,The script will run faster. If the sleep time is small,CPU utilization is higher,The script will run faster."
},
menu_setting_standard_touch: {
message: "Touch Operation Setting"
},
menu_setting_standard_enable_input_touch: {
message: "Enable touch operation."
},
menu_setting_standard_enable_double_touch_assist: {
message: "Display the double touch assist."
},
menu_setting_standard_command: {
message: "Execute Menu (for mobile)"
},
menu_setting_standard_command_execute_button: {
message: "Execute"
},
menu_setting_standard_command_execute_dialog: {
message: "Execute Menu"
},
menu_setting_standard_command_execute_dialog_tab_list: {
message: "select the tab"
},
menu_setting_standard_command_execute_dialog_command_list: {
message: "select the command"
},
menu_setting_standard_command_execute_dialog_confirm: {
message: "Do you want to execute?"
},
menu_setting_standard_export_import: {
message: "Setting Export / Import"
},
menu_setting_standard_export_button: {
message: "Export"
},
menu_setting_standard_import_button: {
message: "Import"
},
menu_setting_standard_export_dialog: {
message: "Setting Export"
},
menu_setting_standard_export_dialog_export: {
message: "Export"
},
menu_setting_standard_export_dialog_export_hint: {
message: "Please copy the text of TextArea."
},
menu_setting_standard_import_dialog: {
message: "Setting Import"
},
menu_setting_standard_import_dialog_explanation: {
message: "information about Import"
},
menu_setting_standard_import_dialog_explanation_0: {
message: "All current settings will be lost."
},
menu_setting_standard_import_dialog_explanation_1: {
message: "It is recommended that you take a backup on the export function."
},
menu_setting_standard_import_dialog_explanation_2: {
message: "Please note so that it does not contain malicious code."
},
menu_setting_standard_import_dialog_import: {
message: "Import"
},
menu_setting_standard_import_dialog_import_hint: {
message: "Please paste the output text from Export."
},
menu_setting_standard_import_dialog_confirm: {
message: "Do you want to Import?"
},
menu_setting_standard_import_alert: {
message: "A result of the import"
},
menu_setting_standard_import_alert_success: {
message: "Import has been completed."
},
menu_setting_standard_import_alert_failure: {
message: "Failed to import."
},
menu_setting_standard_storage_sync: {
message: "Sync Storage"
},
menu_setting_standard_storage_sync_load_button: {
message: "Load"
},
menu_setting_standard_storage_sync_save_button: {
message: "Save"
},
menu_setting_standard_storage_sync_delete_button: {
message: "Delete"
},
menu_setting_standard_storage_sync_load_dialog: {
message: "Load from the Sync Storage"
},
menu_setting_standard_storage_sync_load_dialog_explanation: {
message: "information about Load from the Sync Storage"
},
menu_setting_standard_storage_sync_load_dialog_explanation_0: {
message: "Load the data from the Sync Storage, apply to PageExpand Setting."
},
menu_setting_standard_storage_sync_load_dialog_explanation_1: {
message: "All current settings will be lost."
},
menu_setting_standard_storage_sync_load_dialog_explanation_2: {
message: "It is recommended that you take a backup on the export function."
},
menu_setting_standard_storage_sync_load_dialog_confirm: {
message: "Do you want to Load from the Sync Storage?"
},
menu_setting_standard_storage_sync_load_alert: {
message: "A result of the Load from the Sync Storage"
},
menu_setting_standard_storage_sync_load_alert_success: {
message: "Load from the Sync Storage has been completed."
},
menu_setting_standard_storage_sync_load_alert_failure: {
message: "Failed to the Load from the Sync Storage."
},
menu_setting_standard_storage_sync_save_dialog: {
message: "Save to the Sync Storage"
},
menu_setting_standard_storage_sync_save_dialog_explanation: {
message: "information about Save to the Sync Storage"
},
menu_setting_standard_storage_sync_save_dialog_explanation_0: {
message: "Save the current settings to the Sync Storage."
},
menu_setting_standard_storage_sync_save_dialog_explanation_1: {
message: "Need to enable the functionality of the sync of browser."
},
menu_setting_standard_storage_sync_save_dialog_explanation_2: {
message: "There is a limit to the size. Fail if the size is too large."
},
menu_setting_standard_storage_sync_save_dialog_confirm: {
message: "Do you want to Save to the Sync Storage?"
},
menu_setting_standard_storage_sync_save_alert: {
message: "A result of the Save to the Sync Storage"
},
menu_setting_standard_storage_sync_save_alert_success: {
message: "Save to the Sync Storage has been completed."
},
menu_setting_standard_storage_sync_save_alert_failure: {
message: "Failed to the Save to the Sync Storage."
},
menu_setting_standard_storage_sync_delete_dialog: {
message: "Delete from the Sync Storage"
},
menu_setting_standard_storage_sync_delete_dialog_explanation: {
message: "information about Delete from the Sync Storage"
},
menu_setting_standard_storage_sync_delete_dialog_explanation_0: {
message: "Delete the setting data stored in the Sync Storage."
},
menu_setting_standard_storage_sync_delete_dialog_confirm: {
message: "Do you want to Delete from the Sync Storage?"
},
menu_setting_standard_storage_sync_delete_alert: {
message: "A result of the Delete from the Sync Storage"
},
menu_setting_standard_storage_sync_delete_alert_success: {
message: "Delete from the Sync Storage has been completed."
},
menu_setting_standard_storage_sync_delete_alert_failure: {
message: "Failed to the Delete from the Sync Storage."
},
menu_setting_standard_reset: {
message: "Initialization of setting"
},
menu_setting_standard_reset_button: {
message: "Remove all the settings, Return to the initial state."
},
menu_setting_standard_reset_dialog: {
message: "Initialization of setting"
},
menu_setting_standard_reset_dialog_explanation: {
message: "information about Initialization"
},
menu_setting_standard_reset_dialog_explanation_0: {
message: "Returns all settings to their default state."
},
menu_setting_standard_reset_dialog_explanation_1: {
message: "All current settings will be lost."
},
menu_setting_standard_reset_dialog_confirm: {
message: "Do you want to Initialization?"
},
menu_setting_standard_reset_alert: {
message: "Initialization results"
},
menu_setting_standard_reset_alert_success: {
message: "Configuration initialization has been completed."
},
menu_setting_standard_reset_alert_failure: {
message: "Failed to initialize the configuration."
},
menu_setting_download: {
message: "Download Setting"
},
menu_setting_download_load: {
message: "Load Setting (XHR)"
},
menu_setting_download_load_thread_max: {
message: "Maximum number of simultaneous loads"
},
menu_setting_download_load_timeout: {
message: "Timeout (Millisecond)"
},
menu_setting_download_load_timeout_hint: {
message: "If specify 0, timeout is no limit."
},
menu_setting_download_download: {
message: "Download Setting"
},
menu_setting_download_download_thread_max: {
message: "Maximum number of simultaneous downloads"
},
menu_setting_download_download_conflict_type: {
message: "File Name Conflict"
},
menu_setting_download_download_conflict_type_combo_box_item_rename: {
message: "rename"
},
menu_setting_download_download_conflict_type_combo_box_item_overwrite: {
message: "overwrite"
},
menu_setting_expand_bbs: {
message: "BBS Settng"
},
menu_setting_expand_bbs_list: {
message: "List of BBS Setting"
},
menu_setting_expand_bbs_list_hint: {
message: "When you select an item in the list, the lower control can be edited. Condition script will be executed in order from top to bottom. possible to select multiple. Can be edited by multiple selection. Gray is preset setting. Preset setting can not be deleted."
},
menu_setting_expand_bbs_button_add: {
message: "add"
},
menu_setting_expand_bbs_button_delete: {
message: "delete"
},
menu_setting_expand_bbs_button_prio_up: {
message: "prio up"
},
menu_setting_expand_bbs_button_prio_down: {
message: "prio down"
},
menu_setting_expand_bbs_button_export: {
message: "export"
},
menu_setting_expand_bbs_button_import: {
message: "import"
},
menu_setting_expand_bbs_add_dialog: {
message: "Creating a new BBS Setting"
},
menu_setting_expand_bbs_add_dialog_name: {
message: "Name"
},
menu_setting_expand_bbs_add_dialog_copy_define: {
message: "Replicated from the existing setting."
},
menu_setting_expand_bbs_add_dialog_define_list_box_item_new: {
message: "create a new"
},
menu_setting_expand_bbs_export_dialog: {
message: "BBS Setting Export"
},
menu_setting_expand_bbs_export_dialog_export: {
message: "Export"
},
menu_setting_expand_bbs_export_dialog_export_hint: {
message: "Please copy the text of TextArea."
},
menu_setting_expand_bbs_import_dialog: {
message: "BBS Setting Import"
},
menu_setting_expand_bbs_import_dialog_explanation: {
message: "information about Import"
},
menu_setting_expand_bbs_import_dialog_explanation_0: {
message: "Preset setting will be overwritten. User setting will be add new."
},
menu_setting_expand_bbs_import_dialog_explanation_1: {
message: "It is recommended that you take a backup on the export function."
},
menu_setting_expand_bbs_import_dialog_explanation_2: {
message: "Please note so that it does not contain malicious code."
},
menu_setting_expand_bbs_import_dialog_import: {
message: "Import"
},
menu_setting_expand_bbs_import_dialog_import_hint: {
message: "Please paste the output text from Export."
},
menu_setting_expand_bbs_import_dialog_confirm: {
message: "Do you want to Import?"
},
menu_setting_expand_bbs_import_alert: {
message: "A result of the import"
},
menu_setting_expand_bbs_import_alert_success: {
message: "Import has been completed."
},
menu_setting_expand_bbs_import_alert_failure: {
message: "Failed to import."
},
menu_setting_expand_bbs_name: {
message: "Name"
},
menu_setting_expand_bbs_check_box_container: {
message: "Enable / Disable"
},
menu_setting_expand_bbs_enable_setting: {
message: "Use this setting."
},
menu_setting_expand_bbs_filter_url: {
message: "URL to allow the operation"
},
menu_setting_expand_bbs_popup_check_box_container: {
message: "Popup Setting"
},
menu_setting_expand_bbs_popup_enable_animation: {
message: "Enable pop-up animation"
},
menu_setting_expand_bbs_popup_origin_type: {
message: "Placement origin of the pop-up"
},
menu_setting_expand_bbs_popup_origin_type_combo_box_item_adsorb_top_bottom: {
message: "adsorb top bottom"
},
menu_setting_expand_bbs_popup_origin_type_combo_box_item_adsorb_left_right: {
message: "adsorb left right"
},
menu_setting_expand_bbs_popup_position_type: {
message: "Arrangement position of the pop-up"
},
menu_setting_expand_bbs_popup_position_type_combo_box_item_absolute: {
message: "absolute"
},
menu_setting_expand_bbs_popup_position_type_combo_box_item_fixed: {
message: "fixed"
},
menu_setting_expand_bbs_popup_percent: {
message: "Popup Size"
},
menu_setting_expand_bbs_popup_percent_h: {
message: "Percent Horizontal (0-100)"
},
menu_setting_expand_bbs_popup_percent_v: {
message: "Percent Vertical (0-100)"
},
menu_setting_expand_bbs_popup_time: {
message: "Popup Time"
},
menu_setting_expand_bbs_popup_time_wait_open: {
message: "The time to wait before open (Millisecond)"
},
menu_setting_expand_bbs_popup_time_wait_close: {
message: "The time to wait before close (Millisecond)"
},
menu_setting_expand_bbs_popup_style_sheet: {
message: "Stylesheet of Popup"
},
menu_setting_expand_bbs_script_initialize: {
message: "Initialize Script"
},
menu_setting_expand_bbs_script_callback: {
message: "Callback Script"
},
menu_setting_urlmap: {
message: "URL Mapping Setting"
},
menu_setting_urlmap_list: {
message: "List of URL Mapping Setting"
},
menu_setting_urlmap_list_hint: {
message: "When you select an item in the list, the lower control can be edited. Will be compared with the order from above. possible to select multiple. Can be edited by multiple selection. Gray is preset setting. Preset setting can not be deleted."
},
menu_setting_urlmap_button_add: {
message: "add"
},
menu_setting_urlmap_button_delete: {
message: "delete"
},
menu_setting_urlmap_button_prio_up: {
message: "prio up"
},
menu_setting_urlmap_button_prio_down: {
message: "prio down"
},
menu_setting_urlmap_add_dialog: {
message: "Creating a new URL Mapping"
},
menu_setting_urlmap_add_dialog_name: {
message: "Name"
},
menu_setting_urlmap_add_dialog_copy_define: {
message: "Replicated from the existing setting."
},
menu_setting_urlmap_add_dialog_define_list_box_item_new: {
message: "create a new"
},
menu_setting_urlmap_name: {
message: "Name"
},
menu_setting_urlmap_check_box_container: {
message: "Enable / Disable"
},
menu_setting_urlmap_enable_setting: {
message: "Use this setting."
},
menu_setting_urlmap_filter_url: {
message: "URL to allow the operation"
},
menu_setting_urlmap_unsecure_check_box_container: {
message: "Security"
},
menu_setting_urlmap_enable_unsecure: {
message: "Expand \"resources in the http://\" in a secure page."
},
menu_setting_urlmap_enable_unsecure_hint: {
message: "When disabled, Expand \"resources in the https://\". When enabled, expand \"resources in the http://\" further. However, the encryption warning is always displayed."
},
menu_setting_urlmap_enable_mixed_content: {
message: "Will try to expand \"Mixed content that is blocked by default\" in a secure page."
},
menu_setting_urlmap_enable_mixed_content_hint: {
message: "The browser will block the deployment of \"some of the elements\". When disabled, \"Elements that are blocked\" will not expand. When enabled, Will try to expand all elements. (Will fail unless change the settings in browser.)"
},
menu_setting_urlmap_define_button_edit: {
message: "edit"
},
menu_setting_urlmap_define_button_add: {
message: "add"
},
menu_setting_urlmap_define_button_remove: {
message: "remove"
},
menu_setting_urlmap_define_button_prio_up: {
message: "up"
},
menu_setting_urlmap_define_button_prio_down: {
message: "down"
},
menu_setting_urlmap_define_combo_box_item_no_use: {
message: "not use the definine"
},
menu_setting_define_multi_select_add_dialog: {
message: "add the define"
},
menu_setting_define_multi_select_add_dialog_list: {
message: "Select the define you want to add."
},
menu_setting_access_block: {
message: "Blocking Access Define"
},
menu_setting_access_block_filter_url: {
message: "URL to block access"
},
menu_setting_replacement_to_element: {
message: "Replace Element Define"
},
menu_setting_replacement_to_element_script: {
message: "Callback Script"
},
menu_setting_replacement_to_text: {
message: "Replace Text Define"
},
menu_setting_replacement_to_text_script: {
message: "Callback Script"
},
menu_setting_replacement_to_anchor: {
message: "Replace Anchor Define"
},
menu_setting_replacement_to_anchor_script: {
message: "Callback Script"
},
menu_setting_replacement_to_link: {
message: "Replace Link Define"
},
menu_setting_replacement_to_link_filter_list: {
message: "Filter List"
},
menu_setting_replacement_to_link_filter_name: {
message: "Filter Name"
},
menu_setting_replacement_to_link_filter: {
message: "Filter Setting"
},
menu_setting_replacement_to_link_filter_filter_url: {
message: "Link URL to allow the operation"
},
menu_setting_replacement_to_link_check_box_container: {
message: "Setting to link"
},
menu_setting_replacement_to_link_enable_reflect_to_anchor: {
message: "Reflected to the HTMLAnchorElement href"
},
menu_setting_replacement_to_link_enable_cache: {
message: "Cache the results of callback script"
},
menu_setting_replacement_to_link_filter_script: {
message: "Callback Script"
},
menu_setting_replacement_to_referer: {
message: "Replace Referer Define"
},
menu_setting_replacement_to_referer_filter_list: {
message: "Filter List"
},
menu_setting_replacement_to_referer_filter_name: {
message: "Filter Name"
},
menu_setting_replacement_to_referer_filter: {
message: "Filter Setting"
},
menu_setting_replacement_to_referer_filter_filter_url: {
message: "Link URL to allow the operation"
},
menu_setting_replacement_to_referer_filter_send_type: {
message: "Basic Referer"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item: {
message: "Basic Referer Value"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item_default: {
message: "default"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item_current_url: {
message: "current url"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item_link_url: {
message: "link url"
},
menu_setting_replacement_to_referer_filter_send_type_combo_box_item_custom: {
message: "custom"
},
menu_setting_replacement_to_referer_filter_send_custom: {
message: "Custom String"
},
menu_setting_replacement_to_referer_filter_send_regexp: {
message: "Replaced by a regular expression"
},
menu_setting_replacement_to_referer_filter_send_regexp_match: {
message: "Match conditions"
},
menu_setting_replacement_to_referer_filter_send_regexp_replacement: {
message: "Replace String"
},
menu_setting_replacement_to_referer_filter_send_regexp_replacement_hint: {
message: "$0...Whole match. $1-$9...Partial match. $$…Dollar sign escape sequence."
},
menu_setting_replacement_to_useragent: {
message: "Replace Useragent Define"
},
menu_setting_replacement_to_useragent_filter_list: {
message: "Filter List"
},
menu_setting_replacement_to_useragent_filter_name: {
message: "Filter Name"
},
menu_setting_replacement_to_useragent_filter: {
message: "Filter Setting"
},
menu_setting_replacement_to_useragent_filter_filter_url: {
message: "Link URL to allow the operation"
},
menu_setting_replacement_to_useragent_filter_send: {
message: "Basic Useragent"
},
menu_setting_replacement_to_useragent_filter_send_custom: {
message: "Custom String"
},
menu_setting_make_link_to_text: {
message: "Make Link To Text Define"
},
menu_setting_make_link_to_text_script: {
message: "Callback Script"
},
menu_setting_expand_short_url: {
message: "Expand Short Url Define"
},
menu_setting_expand_short_url_filter_url: {
message: "URL to allow the operation"
},
menu_setting_expand_text: {
message: "Expand Text Define"
},
menu_setting_expand_text_inline: {
message: "Setting to display inline"
},
menu_setting_expand_text_inline_check_box_container: {
message: "Setting to display inline"
},
menu_setting_expand_text_inline_disable_same_text: {
message: "If the same URL, not to Expand."
},
menu_setting_expand_text_inline_script_allow: {
message: "Condition to display inline from a link"
},
menu_setting_expand_text_inline_script_insert: {
message: "Text Insert"
},
menu_setting_expand_image: {
message: "Expand Image Define"
},
menu_setting_expand_image_thumbnail: {
message: "Setting to display thumbnail"
},
menu_setting_expand_image_thumbnail_enable_check_box_container: {
message: "Enable / Disable"
},
menu_setting_expand_image_thumbnail_enable_thumbnail: {
message: "Display the thumbnail."
},
menu_setting_expand_image_thumbnail_check_box_container: {
message: "Setting to display thumbnail"
},
menu_setting_expand_image_thumbnail_enable_popup_mouseover: {
message: "If you mouse over the thumbnail, a pop-up display"
},
menu_setting_expand_image_thumbnail_disable_same_thumbnail_image: {
message: "If the same URL, not to Expand."
},
menu_setting_expand_image_thumbnail_script_allow: {
message: "Condition to display thumbnail from a link"
},
menu_setting_expand_image_thumbnail_script_insert: {
message: "Thumbnail Insert"
},
menu_setting_expand_image_popup: {
message: "Setting to display popup"
},
menu_setting_expand_image_popup_enable_check_box_container: {
message: "Enable / Disable"
},
menu_setting_expand_image_popup_enable_popup_mouseover: {
message: "If you mouse over the anchor, a pop-up display"
},
menu_setting_expand_image_popup_check_box_container: {
message: "Animation"
},
menu_setting_expand_image_popup_enable_animation_scale: {
message: "Enable scale fade animation"
},
menu_setting_expand_image_popup_enable_animation_alpha: {
message: "Enable alpha fade animation"
},
menu_setting_expand_image_popup_origin_type: {
message: "Placement origin of the pop-up image"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_center: {
message: "center"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_upper_left: {
message: "upper left"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_upper_right: {
message: "upper right"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_client_center: {
message: "client center"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_adsorb_element: {
message: "adsorb element"
},
menu_setting_expand_image_popup_origin_type_combo_box_item_adsorb_mouse: {
message: "adsorb mouse"
},
menu_setting_expand_image_popup_time: {
message: "Popup Time"
},
menu_setting_expand_image_popup_time_wait_open: {
message: "The time to wait before open (Millisecond)"
},
menu_setting_expand_image_popup_time_wait_close: {
message: "The time to wait before close (Millisecond)"
},
menu_setting_expand_image_popup_position_type: {
message: "Arrangement position of the pop-up image"
},
menu_setting_expand_image_popup_position_type_combo_box_item_absolute: {
message: "absolute"
},
menu_setting_expand_image_popup_position_type_combo_box_item_fixed: {
message: "fixed"
},
menu_setting_expand_image_popup_size: {
message: "Popup Size"
},
menu_setting_expand_image_popup_size_scale: {
message: "Scale (Percent)"
},
menu_setting_expand_image_popup_script_allow: {
message: "Conditions to display popup from the link"
},
menu_setting_expand_image_reduced_image: {
message: "Reduced Image Setting"
},
menu_setting_expand_image_reduced_image_check_box_container: {
message: "Enable / Disable"
},
menu_setting_expand_image_popup_enable_popup: {
message: "If you mouse over the Reduced Image, a pop-up display"
},
menu_setting_expand_image_reduced_image_allow_slcale_less_then: {
message: "Conditions to display popup"
},
menu_setting_expand_image_reduced_image_allow_slcale_less_then_text: {
message: "If the magnification is less than."
},
menu_setting_expand_image_load: {
message: "Load Image Setting"
},
menu_setting_expand_image_load_check_box_container: {
message: "Load Image Setting"
},
menu_setting_expand_image_load_enable_notify: {
message: "Display the progress."
},
menu_setting_expand_image_load_start_type: {
message: "How to load image"
},
menu_setting_expand_image_load_start_type_preload: {
message: "Preload"
},
menu_setting_expand_image_load_start_type_scroll: {
message: "Conjunction with the scroll"
},
menu_setting_expand_image_load_src_type: {
message: "Image Source Format"
},
menu_setting_expand_image_load_src_type_combo_box_item_url: {
message: "URL (all)"
},
menu_setting_expand_image_load_src_type_combo_box_item_mixed_content: {
message: "Data URI scheme (only mixed content)"
},
menu_setting_expand_image_load_src_type_combo_box_item_data_uri_scheme: {
message: "Data URI scheme (all)"
},
menu_setting_expand_image_load_unload_check_box_container: {
message: "Unload Image Setting"
},
menu_setting_expand_image_load_enable_unload: {
message: "Enable Unload Image"
},
menu_setting_expand_image_load_unload: {
message: "Conditions to unload image"
},
menu_setting_expand_image_load_allow_unload_more_then_text: {
message: "If load more than the specified of MBytes, Release the old image."
},
menu_setting_expand_sound: {
message: "Expand Sound Define"
},
menu_setting_expand_sound_inline: {
message: "Setting to display inline"
},
menu_setting_expand_sound_inline_check_box_container: {
message: "Setting to display inline"
},
menu_setting_expand_sound_inline_disable_same_text: {
message: "If the same URL, not to Expand."
},
menu_setting_expand_sound_inline_sound_max: {
message: "Maximum number of simultaneous display"
},
menu_setting_expand_sound_inline_script_allow: {
message: "Condition to display inline from a link"
},
menu_setting_expand_sound_inline_script_insert: {
message: "Audio Insert"
},
menu_setting_expand_sound_inline_element: {
message: "HTMLAudioElement Setting"
},
menu_setting_expand_sound_inline_element_script_allow: {
message: "Condition to display HTMLAudioElement"
},
menu_setting_expand_sound_inline_soundcloud: {
message: "soundcloud.com Setting"
},
menu_setting_expand_sound_inline_soundcloud_check_box_container: {
message: "soundcloud.com Setting"
},
menu_setting_expand_sound_inline_soundcloud_visible_player_flash: {
message: "enable player (Flash)"
},
menu_setting_expand_sound_inline_soundcloud_visible_player_html5: {
message: "enable player (HTML5)"
},
menu_setting_expand_sound_inline_mixcloud: {
message: "www.mixcloud.com Setting"
},
menu_setting_expand_sound_inline_mixcloud_check_box_container: {
message: "www.mixcloud.com Setting"
},
menu_setting_expand_sound_inline_mixcloud_visible_player: {
message: "enable player"
},
menu_setting_expand_video: {
message: "Expand Video Define"
},
menu_setting_expand_video_inline: {
message: "Setting to display inline"
},
menu_setting_expand_video_inline_check_box_container: {
message: "Setting to display inline"
},
menu_setting_expand_video_inline_disable_same_video: {
message: "If the same URL, not to Expand."
},
menu_setting_expand_video_inline_video_max: {
message: "Maximum number of simultaneous display"
},
menu_setting_expand_video_inline_script_allow: {
message: "Condition to display inline from a link"
},
menu_setting_expand_video_inline_script_insert: {
message: "Element Insert"
},
menu_setting_expand_video_inline_element: {
message: "HTMLVideoElement Setting"
},
menu_setting_expand_video_inline_element_script_allow: {
message: " Condition to display HTMLVideoElement"
},
menu_setting_expand_video_inline_youtube: {
message: "www.youtube.com Setting"
},
menu_setting_expand_video_inline_youtube_check_box_container: {
message: "www.youtube.com Setting"
},
menu_setting_expand_video_inline_youtube_visible_video: {
message: "enable video"
},
menu_setting_expand_video_inline_nicovideo: {
message: "www.nicovideo.jp Setting"
},
menu_setting_expand_video_inline_nicovideo_check_box_container: {
message: "www.nicovideo.jp Setting"
},
menu_setting_expand_video_inline_nicovideo_visible_video: {
message: "enable video"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_video: {
message: "enable video thumbnail"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_mylist: {
message: "enable mylist thumbnail"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_user: {
message: "enable user thumbnail"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_community: {
message: "enable community thumbnail"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_live: {
message: "enable live broadcast thumbnail"
},
menu_setting_expand_video_inline_nicovideo_visible_thumbnail_seiga: {
message: "enable seiga thumbnail"
},
menu_setting_expand_video_inline_ustream: {
message: "www.ustream.tv Setting"
},
menu_setting_expand_video_inline_ustream_check_box_container: {
message: "www.ustream.tv Setting"
},
menu_setting_expand_video_inline_ustream_visible_video_live: {
message: "enable delivery video"
},
menu_setting_expand_video_inline_ustream_visible_video_record: {
message: "enable recorded video "
},
menu_setting_expand_video_inline_dailymotion: {
message: "www.dailymotion.com Setting"
},
menu_setting_expand_video_inline_dailymotion_check_box_container: {
message: "www.dailymotion.com Setting"
},
menu_setting_expand_video_inline_dailymotion_visible_video: {
message: "enable video"
},
menu_setting_expand_video_inline_video: {
message: "vimeo.com Setting"
},
menu_setting_expand_video_inline_video_check_box_container: {
message: "vimeo.com Setting"
},
menu_setting_expand_video_inline_video_visible_video: {
message: "enable video"
},
menu_setting_expand_video_inline_fc2video: {
message: "video.fc2.com Setting"
},
menu_setting_expand_video_inline_fc2video_check_box_container: {
message: "video.fc2.com Setting"
},
menu_setting_expand_video_inline_fc2video_visible_video: {
message: "enable video"
},
menu_setting_expand_video_inline_liveleak: {
message: "www.liveleak.com Setting"
},
menu_setting_expand_video_inline_liveleak_check_box_container: {
message: "www.liveleak.com Setting"
},
menu_setting_expand_video_inline_liveleak_visible_video: {
message: "enable video"
},
menu_setting_expand_iframe: {
message: "Expand Iframe Define"
},
menu_setting_expand_iframe_inline: {
message: "Setting to display inline"
},
menu_setting_expand_iframe_inline_check_box_container: {
message: "Setting to display inline"
},
menu_setting_expand_iframe_inline_disable_same_iframe: {
message: "If the same URL, not to Expand."
},
menu_setting_expand_iframe_inline_script_allow: {
message: "Condition to display inline from a link"
},
menu_setting_expand_iframe_inline_script_insert: {
message: "HTMLIFrameElement Insert"
},
menu_setting_style_sheet: {
message: "Stylesheet Define"
},
menu_setting_style_sheet_expand_text: {
message: "Stylesheet of Expanded Text"
},
menu_setting_style_sheet_expand_text_element: {
message: "HTMLTextAreaElement Setting"
},
menu_setting_style_sheet_expand_text_element_inline: {
message: "Text Inline Display"
},
menu_setting_style_sheet_expand_image: {
message: "Stylesheet of Expanded Image"
},
menu_setting_style_sheet_expand_image_element: {
message: "HTMImageElement Setting"
},
menu_setting_style_sheet_expand_image_element_inline: {
message: "Image Thumbnail Display"
},
menu_setting_style_sheet_expand_image_element_popup: {
message: "Image Popup Display"
},
menu_setting_style_sheet_expand_sound: {
message: "Stylesheet of Expanded Sound"
},
menu_setting_style_sheet_expand_sound_element: {
message: "HTMLAudioElement Setting"
},
menu_setting_style_sheet_expand_sound_element_inline_audio: {
message: "Audo Inline Display"
},
menu_setting_style_sheet_expand_sound_soundcloud: {
message: "soundcloud.com Setting"
},
menu_setting_style_sheet_expand_sound_soundcloud_inline_player_flash: {
message: "Player (Flash) Inline Display"
},
menu_setting_style_sheet_expand_sound_soundcloud_inline_player_html5: {
message: "Player (HTML5) Inline Display"
},
menu_setting_style_sheet_expand_sound_mixcloud: {
message: "www.mixcloud.com Setting"
},
menu_setting_style_sheet_expand_sound_mixcloud_inline_player: {
message: "Player Inline Display"
},
menu_setting_style_sheet_expand_video: {
message: "Stylesheet of Expanded Video"
},
menu_setting_style_sheet_expand_video_element: {
message: "HTMLVideoElement Setting"
},
menu_setting_style_sheet_expand_video_element_inline_video: {
message: "Video Inline Display"
},
menu_setting_style_sheet_expand_video_youtube: {
message: "www.youtube.com Setting"
},
menu_setting_style_sheet_expand_video_youtube_inline_video: {
message: "Video Inline Display"
},
menu_setting_style_sheet_expand_video_nicovideo: {
message: "www.nicovideo.jp Setting"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_video: {
message: "Video Inline Display"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_video: {
message: "Video Thumbnail Inline Display"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_mylist: {
message: "Mylist Thumbnail Inline Display"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_user: {
message: "User Thumbnail Inline Display"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_community: {
message: "Community Thumbnail Inline Display"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_live: {
message: "Live Broadcast Thumbnail Inline Display"
},
menu_setting_style_sheet_expand_video_nicovideo_inline_thumbnail_seiga: {
message: "Seiga Thumbnail Inline Display"
},
menu_setting_style_sheet_expand_video_ustream: {
message: "www.ustream.tv Setting"
},
menu_setting_style_sheet_expand_video_ustream_inline_video_record: {
message: "Delivery Video Inline Display"
},
menu_setting_style_sheet_expand_video_ustream_inline_video_live: {
message: "Recorded Video Inline Display"
},
menu_setting_style_sheet_expand_video_dailymotion: {
message: "www.dailymotion.com Setting"
},
menu_setting_style_sheet_expand_video_dailymotion_inline_video: {
message: "Video Inline Display"
},
menu_setting_style_sheet_expand_video_vimeo: {
message: "vimeo.com Setting"
},
menu_setting_style_sheet_expand_video_vimeo_inline_video: {
message: "Video Inline Display"
},
menu_setting_style_sheet_expand_video_fc2video: {
message: "video.fc2.com Setting"
},
menu_setting_style_sheet_expand_video_fc2video_inline_video: {
message: "Video Inline Display"
},
menu_setting_style_sheet_expand_video_liveleak: {
message: "www.liveleak.com Setting"
},
menu_setting_style_sheet_expand_video_liveleak_inline_video: {
message: "Video Inline Display"
},
menu_setting_style_sheet_expand_iframe: {
message: "Stylesheet of Expanded Iframe"
},
menu_setting_style_sheet_expand_iframe_element: {
message: "HTMLIFrameElement Setting"
},
menu_setting_style_sheet_expand_iframe_element_inline: {
message: "Iframe Inline Display"
},
menu_setting_experimental: {
message: "Experimental Define"
},
menu_setting_experimental_revise_scroll: {
message: "Revise Scroll Setting"
},
menu_setting_experimental_revise_scroll_check_box_container: {
message: "Revise Scroll Setting"
},
menu_setting_experimental_revise_scroll_enable: {
message: "enable"
},
menu_setting_experimental_revise_scroll_threshold_vertical: {
message: "Threshold Vertical ( 0 [top] ~ 100 [bottom] )"
},
menu_setting_language: {
message: "LANGUAGE (Language Setting)"
},
menu_credit: {
message: "Credit"
},
menu_credit_info_version: {
message: "Version"
},
menu_credit_info_copyright: {
message: "Copyright"
},
menu_setting_define_list: {
message: "List of Define"
},
menu_setting_define_list_hint: {
message: "When you select an item in the list, the lower control can be edited. Will be compared with the order from above. possible to select multiple. Can be edited by multiple selection. Gray is preset setting. Preset setting can not be deleted."
},
menu_setting_define_button_add: {
message: "add"
},
menu_setting_define_button_delete: {
message: "delete"
},
menu_setting_define_button_move_up: {
message: "move up"
},
menu_setting_define_button_move_down: {
message: "move down"
},
menu_setting_define_button_export: {
message: "export"
},
menu_setting_define_button_import: {
message: "import"
},
menu_setting_define_add_dialog: {
message: "Create a new define"
},
menu_setting_define_add_dialog_name: {
message: "Name"
},
menu_setting_define_add_dialog_copy_define: {
message: "Replicated from the existing define"
},
menu_setting_define_add_dialog_define_list_box_item_new: {
message: "create a new"
},
menu_setting_define_delete_dialog: {
message: "Delete the Define"
},
menu_setting_define_delete_dialog_name: {
message: "Define Name (Be removed)"
},
menu_setting_define_delete_dialog_change_define: {
message: "Alternative Selection"
},
menu_setting_define_delete_dialog_define_list_box_item_no_use: {
message: "not use the define"
},
menu_setting_define_name: {
message: "Define Name"
},
menu_setting_define_export_dialog: {
message: "Define Export"
},
menu_setting_define_export_dialog_export: {
message: "Export"
},
menu_setting_define_export_dialog_export_hint: {
message: "Please copy the text of TextArea."
},
menu_setting_define_import_dialog: {
message: "Define Import"
},
menu_setting_define_import_dialog_explanation: {
message: "information about Import"
},
menu_setting_define_import_dialog_explanation_0: {
message: "Preset setting will be overwritten. User setting will be add new."
},
menu_setting_define_import_dialog_explanation_1: {
message: "It is recommended that you take a backup on the export function."
},
menu_setting_define_import_dialog_explanation_2: {
message: "Please note so that it does not contain malicious code."
},
menu_setting_define_import_dialog_import: {
message: "Import"
},
menu_setting_define_import_dialog_import_hint: {
message: "Please paste the output text from Export."
},
menu_setting_define_import_dialog_confirm: {
message: "Do you want to Import?"
},
menu_setting_define_import_alert: {
message: "A result of the import"
},
menu_setting_define_import_alert_success: {
message: "Import has been completed."
},
menu_setting_define_import_alert_failure: {
message: "Failed to import."
},
menu_setting_define_wildcard_detail: {
message: "information about Wild Card"
},
menu_setting_define_wildcard_detail_0: {
message: "\"Wild Card\" is always execute at the last."
},
menu_setting_define_wildcard_detail_1: {
message: "\"Wild Card\" be applied to all communications."
},
menu_setting_define_wildcard_detail_2: {
message: "\"Wild Card\" is not the define. Can not be used in the \"URL Mapping Setting\"."
},
menu_setting_filter_list: {
message: "Filter List"
},
menu_setting_filter_list_hint: {
message: "When you select an item in the list, the lower control can be edited. Will be compared with the order from above. possible to select multiple. Can be edited by multiple selection."
},
menu_setting_filter_button_add: {
message: "add"
},
menu_setting_filter_button_delete: {
message: "delete"
},
menu_setting_filter_button_prio_up: {
message: "prio up"
},
menu_setting_filter_button_prio_down: {
message: "prio down"
},
menu_setting_filter_button_export: {
message: "export"
},
menu_setting_filter_button_import: {
message: "import"
},
menu_setting_filter_add_dialog: {
message: "Creating a new Filter Setting"
},
menu_setting_filter_add_dialog_name: {
message: "Name"
},
menu_setting_filter_add_dialog_copy_define: {
message: "Replicated from the existing setting."
},
menu_setting_filter_add_dialog_define_list_box_item_new: {
message: "create a new"
},
menu_setting_filter_export_dialog: {
message: "Filter Export"
},
menu_setting_filter_export_dialog_export: {
message: "Export"
},
menu_setting_filter_export_dialog_export_hint: {
message: "Please copy the text of TextArea."
},
menu_setting_filter_import_dialog: {
message: "Filter Import"
},
menu_setting_filter_import_dialog_explanation: {
message: "information about Import"
},
menu_setting_filter_import_dialog_explanation_0: {
message: "Import data is added to the last of the list."
},
menu_setting_filter_import_dialog_explanation_1: {
message: "It is recommended that you take a backup on the export function."
},
menu_setting_filter_import_dialog_explanation_2: {
message: "Please note so that it does not contain malicious code."
},
menu_setting_filter_import_dialog_import: {
message: "Import"
},
menu_setting_filter_import_dialog_import_hint: {
message: "Please paste the output text from Export."
},
menu_setting_filter_import_dialog_confirm: {
message: "Do you want to Import?"
},
menu_setting_filter_import_alert: {
message: "A result of the import"
},
menu_setting_filter_import_alert_success: {
message: "Import has been completed."
},
menu_setting_filter_import_alert_failure: {
message: "Failed to import."
},
menu_button_ok: {
message: "OK"
},
menu_button_yes: {
message: "YES"
},
menu_button_no: {
message: "CANCEL"
},
menu_scriptarea_hint: {
message: "To describe the anonymous function to array. Please note so that it does not contain malicious code."
},
menu_text_regexp_hint: {
message: "regular expression string. [flags] g...repeat. i...without case-sensitive."
},
menu_regexp_list_button_add: {
message: "add"
},
menu_regexp_list_button_delete: {
message: "delete"
},
menu_regexp_list_button_move_up: {
message: "move up"
},
menu_regexp_list_button_move_down: {
message: "move down"
},
menu_setting_url_edit_container_combo_box_item_asterisk: {
message: "asterisk format"
},
menu_setting_url_edit_container_combo_box_item_regexp: {
message: "regular expression format"
},
menu_setting_url_edit_container_type_asterisk_hint: {
message: "Describes the URL. Can be used an asterisk. Can be specified multi line."
},
page_expand_popup_menu: {
message: "PageExpand Menu"
},
context_menu_pageexpand_config: {
message: "PageExpand Setting"
},
context_menu_batch_download_image: {
message: "Batch Download (image)"
},
context_menu_batch_download_user: {
message: "Batch Download (user)"
},
context_menu_pageexpand_config_current_page: {
message: "PageExpand Setting Current Page"
},
context_menu_pageexpand_config_current_bbs: {
message: "PageExpand Setting Current BBS"
},
context_menu_pageexpand_config_current_page_confirm: {
message: "PageExpand Setting will run only in the following page. \n(The purpose is to prevent from being injected the malicious script)\n\nDo you want to open the following page?\n"
},
context_menu_pageexpand_config_auto_run_confirm: {
message: "Do you want to run the PageExpand Setting in this page?\n(If this page is contaminated, then the malicious script will be injected)"
},
context_menu_pageexpand_execute: {
message: "Execute PageExpand"
},
context_menu_pageexpand_abort: {
message: "Abort PageExpand"
},
context_menu_pageexpand_debug: {
message: "PageExpand Debug"
}
}
};
// ------------------------------
// タイマー
// ------------------------------
function Timer(delay,repeatCount){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_this.stop();
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
};
// ------------------------------
// 時間隔実行
// ------------------------------
_this.ontimer = function(){};
// ------------------------------
// 完了
// ------------------------------
_this.oncomplete = function(){};
// ------------------------------
// 開始
// ------------------------------
_this.start = function(){
if(_time_handle === null){
_this.running = true;
_time_handle = setInterval(execute,_this.delay);
_event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(_this.release);
}
};
// ------------------------------
// 停止
// ------------------------------
_this.stop = function(){
if(_time_handle !== null){
clearInterval(_time_handle);
_time_handle = null;
_this.running = false;
}
};
// ------------------------------
// リセット
// ------------------------------
_this.reset = function(){
_this.currentCount = 0;
};
// ------------------------------
// 実行(内部用)
// ------------------------------
function execute (){
_this.currentCount ++;
execute_queue.attachFirst(dispatch,null);
if(_this.repeatCount === null){
}else if(_this.currentCount >= _this.repeatCount){
_this.stop();
}
}
// ------------------------------
// 発行(内部用)
// ------------------------------
function dispatch (){
if(!_event_handler_release) return;
if(_this.ontimer){
_this.ontimer();
}
if(_this.currentCount >= _this.repeatCount){
if(_this.oncomplete){
_this.oncomplete();
}
_this.release();
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _time_handle;
var _event_handler_release;
var _released;
// ------------------------------
// 初期化
// ------------------------------
_time_handle = null;
if(isNaN(delay)){
_this.delay = 0;
}else{
_this.delay = Number(delay);
}
_this.currentCount = 0;
if(isNaN(repeatCount)){
_this.repeatCount = null;
}else{
_this.repeatCount = Number(repeatCount);
}
_this.running = false;
}
// ------------------------------
// アドレスコレクション
// ------------------------------
function AddressCollection(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(category,url){
_dictionary = null;
_count = 0;
};
// ------------------------------
// アドレスを登録
// ------------------------------
_this.addAddress = function(category,url){
//url = convertAddress(url);
// カテゴリが存在しない
var obj = _dictionary[category];
if(!obj){
_dictionary[category] = obj = new Object();
}
// 登録済み
if(obj[url]){
return false;
}
// 新規登録
obj[url] = true;
_count += 1;
return true;
};
// ------------------------------
// アドレスの登録を外す
// ------------------------------
_this.removeAddress = function(category,url){
//url = convertAddress(url);
// カテゴリが存在しない
var obj = _dictionary[category];
if(!obj){
return false;
}
// 未登録
if(!obj[url]){
return false;
}
obj[url] = false;
_count -= 1;
return true;
};
// ------------------------------
// アドレスが登録済みであるか調べる
// ------------------------------
_this.hasAddress = function(category,url){
//url = convertAddress(url);
// カテゴリが存在しない
var obj = _dictionary[category];
if(!obj){
return false;
}
if(obj[url]) return true;
return false;
};
// ------------------------------
// アドレスを変換(内部用)
// ------------------------------
function convertAddress(url){
// 小文字に変換
url = url.toLowerCase();
return url;
}
// ------------------------------
// 登録数を取得
// ------------------------------
_this.getCountAddress = function(){
return _count;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _dictionary;
var _count;
// ------------------------------
// 初期化
// ------------------------------
_count = 0;
_dictionary = new Object();
}
// ------------------------------
// 実行キュー
// ------------------------------
function ExecuteQueue(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
var i;
for(i=0;i<_queue_max;i++){
var queue = _queue_list[i];
var _prev = queue._prev;
var _next = queue._next;
_prev._next = _next;
_next._prev = _prev;
queue._prev = queue;
queue._next = queue;
}
if(_time_handle !== undefined){
clearTimeout(_time_handle);
_time_handle = undefined;
}
};
// ------------------------------
// 最前列に処理を追加
// ------------------------------
_this.attachFirst = function(func,param){
var o = {func:func,param:param};
var _prev = _queue_list[0];
var _next = _prev._next;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(0);
};
// ------------------------------
// 割り込み用の処理を最後尾に追加
// ------------------------------
_this.attachLastForInterrupt = function(func,param){
var o = {func:func,param:param};
var _next = _queue_list[0];
var _prev = _next._prev;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(0);
};
// ------------------------------
// DOM オブジェクト除外用の処理を最前列に追加
// ------------------------------
_this.attachFirstForRemoveDomNode = function(func,param){
var o = {func:func,param:param};
var _prev = _queue_list[1];
var _next = _prev._next;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(1);
};
// ------------------------------
// DOM オブジェクト除外用の処理を最後尾に追加
// ------------------------------
_this.attachLastForRemoveDomNode = function(func,param){
var o = {func:func,param:param};
var _next = _queue_list[1];
var _prev = _next._prev;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(1);
};
// ------------------------------
// DOM オブジェクト挿入用の処理を最前列に追加
// ------------------------------
_this.attachFirstForInsertDomNode = function(func,param){
var o = {func:func,param:param};
var _prev = _queue_list[2];
var _next = _prev._next;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(2);
};
// ------------------------------
// DOM オブジェクト挿入用の処理を最後尾に追加
// ------------------------------
_this.attachLastForInsertDomNode = function(func,param){
var o = {func:func,param:param};
var _next = _queue_list[2];
var _prev = _next._prev;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(2);
};
// ------------------------------
// 掲示板展開用の処理を追加
// ------------------------------
_this.attachForExpandBbs = function(func,param){
var o = {func:func,param:param};
var _next = _queue_list[3];
var _prev = _next._prev;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(3);
};
// ------------------------------
// エレメント展開用の処理を追加
// ------------------------------
_this.attachForExpandElement = function(func,param){
var o = {func:func,param:param};
var _next = _queue_list[4];
var _prev = _next._prev;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(4);
};
// ------------------------------
// エレメント解析用の処理を追加
// ------------------------------
_this.attachForAnalyzeElement = function(func,param){
var o = {func:func,param:param};
var _next = _queue_list[5];
var _prev = _next._prev;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(5);
};
// ------------------------------
// テキストノード解析用の処理を追加
// ------------------------------
_this.attachForAnalyzeTextNode = function(func,param){
var o = {func:func,param:param};
var _next = _queue_list[6];
var _prev = _next._prev;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(6);
};
// ------------------------------
// 最後尾に処理を追加
// ------------------------------
_this.attachLast = function(func,param){
var o = {func:func,param:param};
var _next = _queue_list[7];
var _prev = _next._prev;
o._prev = _prev;
o._next = _next;
_prev._next = o;
_next._prev = o;
attach(7);
};
// ------------------------------
// 登録処理(内部用)
// ------------------------------
function attach(level){
_count += 1;
if(level < _queue_pos){
_queue_pos = level;
_queue = _queue_list[_queue_pos];
}
if(_time_handle !== undefined) return;
_time_handle = setTimeout(execute , _time_sleep);
}
// ------------------------------
// 実行(内部用)
// ------------------------------
function execute (){
var time = _getTime();
do{
var o = _queue._next;
var _prev = o._prev;
var _next = o._next;
_prev._next = _next;
_next._prev = _prev;
try{
o.func(o.param);
_success_count += 1;
}catch(e){
if(project.getEnableDebugMode()){
ConsoleError(e.stack);
}
_error_count += 1;
}
while(_queue_pos < _queue_max){
if(_queue._next != _queue) break;
_queue_pos ++;
_queue = _queue_list[_queue_pos];
}
_count -= 1;
if(_count <= 0){
clearTimeout(_time_handle);
_time_handle = undefined;
return;
}
}while (_getTime() - time <= _time_occupancy);
_time_handle = setTimeout(execute , _time_sleep);
}
// ------------------------------
// キューの数を取得
// ------------------------------
_this.getCountQueue = function(){
return _count;
};
// ------------------------------
// キューの成功数を取得
// ------------------------------
_this.getCountSuccess = function(){
return _success_count;
};
// ------------------------------
// キューのエラー数を取得
// ------------------------------
_this.getCountError = function(){
return _error_count;
};
// ------------------------------
// キューのフェーズを取得
// ------------------------------
_this.getPhase = function(){
return _queue_pos;
};
// ------------------------------
// 占有時間をセット
// ------------------------------
_this.setOccupancyTime = function(v){
_time_occupancy = v;
};
// ------------------------------
// スリープ時間をセット
// ------------------------------
_this.setSleepTime = function(v){
_time_sleep = v;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _queue;
var _queue_list;
var _queue_pos;
var _queue_max;
var _count;
var _success_count;
var _error_count;
var _time_handle;
var _time_occupancy;
var _time_sleep;
var _getTime;
// ------------------------------
// 初期化
// ------------------------------
_count = 0;
_success_count = 0;
_error_count = 0;
_time_handle = undefined;
_time_occupancy = 5;
_time_sleep = 0;
_queue_pos = 0;
_queue_max = 8;
_queue_list = new Array();
while(_queue_pos < _queue_max){
_queue = new Object();
_queue._prev = _queue;
_queue._next = _queue;
_queue_list[_queue_pos] = _queue;
_queue_pos ++;
}
// 時間取得関数
_getTime = Date.now;
if(!_getTime) _getTime = function(){ return (new Date()).getTime(); };
}
// ------------------------------
// ローダーキュー
// ------------------------------
function LoaderQueue(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
var queue = _this.queue;
while(queue != queue._next){
var next = queue._next;
if(next.onabort) next.onabort();
ElementRemove(next);
}
var queue = _this.queue_single;
while(queue != queue._next){
var next = queue._next;
if(next.onabort) next.onabort();
ElementRemove(next);
}
};
// ------------------------------
// 要素を作成
// ------------------------------
_this.createElement = function(){
var _element = new Object();
// ------------------------------
// 開始イベント
// ------------------------------
_element.onstart = function(){};
// ------------------------------
// 中止イベント
// ------------------------------
_element.onabort = function(){};
// ------------------------------
// 完了を通知
// ------------------------------
_element.complete = function(){
_thread_count -= 1;
dequeue();
};
// ------------------------------
// 要素を破棄
// ------------------------------
_element.release = function(){
ElementRemove(_element);
_queue_count -= 1;
dequeue();
};
// ------------------------------
// 通常最前列に処理を追加
// ------------------------------
_element.attachFirst = function(){
ElementRemove(_element);
var _prev = _this.queue;
var _next = _prev._next;
_prev._next = _element;
_next._prev = _element;
_element._prev = _prev;
_element._next = _next;
dequeue();
};
// ------------------------------
// 通常最後尾に追加
// ------------------------------
_element.attachLast = function(){
ElementRemove(_element);
var _next = _this.queue;
var _prev = _next._prev;
_prev._next = _element;
_next._prev = _element;
_element._prev = _prev;
_element._next = _next;
dequeue();
};
// ------------------------------
// シングル最後尾に追加
// ------------------------------
_element.attachSingle = function(){
ElementRemove(_element);
var _next = _this.queue_single;
var _prev = _next._prev;
_prev._next = _element;
_next._prev = _element;
_element._prev = _prev;
_element._next = _next;
dequeue();
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element._prev = _element;
_element._next = _element;
_queue_count += 1;
})();
return _element;
};
// ------------------------------
// 要素のロード開始(内部用)
// ------------------------------
function ElementLoadStart(element){
ElementRemove(element);
_thread_count += 1;
element.onstart();
}
// ------------------------------
// 要素を外す(内部用)
// ------------------------------
function ElementRemove(element){
var _prev = element._prev;
var _next = element._next;
_prev._next = _next;
_next._prev = _prev;
element._prev = element;
element._next = element;
}
// ------------------------------
// デキュー(内部用)
// ------------------------------
function dequeue(){
// 通常キュー
while(_thread_count < _thread_max){
var element = _this.queue._next;
// キューが空
if(element == _this.queue){
break;
}
ElementLoadStart(element);
}
// シングルキュー
if(_thread_count <= 0){
var element = _this.queue_single._next;
if(element != _this.queue_single){
ElementLoadStart(element);
}
}
}
// ------------------------------
// キューの数を取得
// ------------------------------
_this.getCountQueue = function(){
return _queue_count;
};
// ------------------------------
// スレッドの数を取得
// ------------------------------
_this.getCountThread = function(){
return _thread_count;
};
// ------------------------------
// エラー数を取得
// ------------------------------
_this.getCountError = function(){
return _error_count;
};
// ------------------------------
// エラー数を加算
// ------------------------------
_this.addCountError = function(){
_error_count += 1;
};
// ------------------------------
// スレッドの最大数を取得
// ------------------------------
_this.getMaxThread = function(){
return _thread_max;
};
// ------------------------------
// ロードスレッドの最大数をセット
// ------------------------------
_this.setMaxThread = function(v){
_thread_max = v;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _queue_count;
var _thread_count;
var _thread_max;
var _error_count;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_queue_count = 0;
_thread_count = 0;
_this.setMaxThread(10);
_error_count = 0;
var queue = new Object();
queue._prev = queue;
queue._next = queue;
_this.queue = queue;
var queue_single = new Object();
queue_single._prev = queue_single;
queue_single._next = queue_single;
_this.queue_single = queue_single;
})();
}
// ------------------------------
// ローダー
// ------------------------------
function Loader(){
var _this = this;
// ------------------------------
// ロード成功イベント
// ------------------------------
_this.onload = function(){};
// ------------------------------
// ロード失敗イベント
// ------------------------------
_this.onerror = function(){};
// ------------------------------
// リクエストヘッダを設定
// ------------------------------
_this.setRequestHeader = function(name,value){
_request.headers[name] = value;
};
// ------------------------------
// オーバーライドコンテンツタイプを設定
// ------------------------------
_this.overrideMimeType = function(type){
_request.override_mime_type = type;
};
// ------------------------------
// メソッドを設定
// ------------------------------
_this.setMethod = function(method){
_request.method = method;
};
// ------------------------------
// アドレスを設定
// ------------------------------
_this.setURL = function(url){
_request.url = url;
};
// ------------------------------
// 送信データを設定
// ------------------------------
_this.setSendData = function(data){
_request.data = data;
};
// ------------------------------
// 画像をロード
// ------------------------------
_this.loadImage = function(){
if(!(getEnable())){
loadError();
return;
}
// Image による画像の読み込み
function tryLoadImage(){
// アンセキュアチェック
if(!project.checkAllowUnsecure(_request.url)){
loadError();
return;
}
// 開始関数を変更
_queue_element.onstart = function(){
var image = document.createElement("img");
function removeEvent(){
image.onload = null;
image.onerror = null;
}
image.onload = function(){
removeEvent();
// ロード完了を通知
_queue_element.complete();
// イメージを返す
loadSuccess(image);
};
image.onerror = function(){
removeEvent();
// ロード完了を通知
_queue_element.complete();
// キューに再登録
if(!tryAttachElement(false)){
// エラーで終了
loadError();
return;
}
};
// 読み込み開始
image.src = _request.url;
};
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 1;
// キューに登録
tryAttachElement(true);
}
// data URL scheme による画像の読み込み
function tryLoadDataUriScheme(data){
// 開始関数を変更
_queue_element.onstart = function(){
var image = document.createElement("img");
function removeEvent(){
image.onload = null;
image.onerror = null;
}
image.onload = function(){
removeEvent();
// ロード完了を通知
_queue_element.complete();
// イメージを返す
loadSuccess(image);
};
image.onerror = function(){
removeEvent();
// ロード完了を通知
_queue_element.complete();
// キューに再登録
if(!tryAttachElement(false)){
// Image による画像の読み込み
tryLoadImage();
return;
}
};
// 読み込み開始
image.src = data;
};
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 0;
// キューに登録
tryAttachElement(true);
}
// TrixieUserScript の場合処理しない
if(ExecuteAsTrixieUserScript()){
tryLoadImage();
return;
}
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 1;
// 開始関数をセット
_queue_element.onstart = function(){
// ソースタイプ
var use_data_uri_scheme = false;
switch(project.getSourceLoadExpandImage()){
case "mixed_content":
if(project.getSecureCurrent() && (_request.url.indexOf("http://") == 0)){
use_data_uri_scheme = true;
}
break;
case "data_uri_scheme":
use_data_uri_scheme = true;
break;
}
// 読み込みを開始する
var result;
if(use_data_uri_scheme){
var result = loadDataUriScheme(function(result,xhr){
// ロード完了を通知
_queue_element.complete();
// ロード成功
if(result){
if(xhr.dataUriScheme){
// data URL scheme による画像の読み込み
tryLoadDataUriScheme(xhr.dataUriScheme);
}else{
// Image による画像の読み込み
tryLoadImage();
}
// 失敗
}else{
if(xhr.status == 0){
// Image による画像の読み込み
tryLoadImage();
}else if(xhr.status == 401){
// 認証エラー
loadError();
}else{
// キューに再登録
if(!tryAttachElement(false)){
// Image による画像の読み込み
tryLoadImage();
}
}
}
});
}else{
result = loadXMLHttpRequest(function(result,xhr){
// ロード完了を通知
_queue_element.complete();
// ロード成功
if(result){
// Imageによる画像の読み込み
tryLoadImage();
// 失敗
}else{
if(xhr.status == 0){
// Imageによる画像の読み込み
tryLoadImage();
}else if(xhr.status == 401){
// 認証エラー
loadError();
}else{
// キューに再登録
if(!tryAttachElement(false)){
// Imageによる画像の読み込み
tryLoadImage();
}
}
}
});
}
// ロードエラー
if(!result){
// ロード完了を通知
_queue_element.complete();
// Imageによる画像の読み込み
tryLoadImage();
return;
}
};
// キューに登録
tryAttachElement(false);
};
// ------------------------------
// オーディオをロード
// ------------------------------
_this.loadAudio = function(){
var error = false;
// 無効
if(!(getEnable())){
error = true;
}
// オーディオ未対応
if(!(window.HTMLAudioElement)){
error = true;
}
// エラー
if(error){
loadError();
return;
}
// HTTP メソッド
_this.setMethod("HEAD");
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 0;
// 開始関数をセット
_queue_element.onstart = function(){
// 読み込みを開始する
var result = loadXMLHttpRequest(function(result,xhr){
// ロード完了を通知
_queue_element.complete();
// ロード成功
if(result){
// オーディオを生成
var audio = document.createElement("audio");
if(audio.canPlayType(xhr.getResponseHeader("Content-Type")) !== ""){
// コントロール有効
audio.controls = true;
// 自動再生無し
audio.autoplay = false;
// プリロードを設定
audio.preload = "none";
// ロード開始
audio.src = _request.url;
// オーディオを返す
loadSuccess(audio);
}else{
// エラーで終了
loadError();
}
// 失敗
}else{
if(xhr.status == 401){
// 認証エラー
loadError();
return;
}else{
// キューに再登録
if(!tryAttachElement(false)){
// エラーで終了
loadError();
return;
}
}
}
});
// ロードエラー
if(!result){
// ロード完了を通知
_queue_element.complete();
// エラーで終了
loadError();
return;
}
};
// キューに登録
tryAttachElement(false);
};
// ------------------------------
// ビデオをロード
// ------------------------------
_this.loadVideo = function(){
var error = false;
// 無効
if(!(getEnable())){
error = true;
}
// ビデオ未対応
if(!(window.HTMLVideoElement)){
error = true;
}
// エラー
if(error){
loadError();
return;
}
// HTTP メソッド
_this.setMethod("HEAD");
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 0;
// 開始関数をセット
_queue_element.onstart = function(){
// 読み込みを開始する
var result = loadXMLHttpRequest(function(result,xhr){
// ロード完了を通知
_queue_element.complete();
// ロード成功
if(result){
// ビデオを生成
var video = DocumentCreateElement("video");
if(video.canPlayType(xhr.getResponseHeader("Content-Type")) !== ""){
// コントロール有効
video.controls = true;
// 自動再生無し
video.autoplay = false;
// プリロードを設定
video.preload = "none";
// ロード開始
video.src = _request.url;
// ビデオを返す
loadSuccess(video);
}else{
// エラーで終了
loadError();
}
// 失敗
}else{
if(xhr.status == 401){
// 認証エラー
loadError();
return;
}else{
// キューに再登録
if(!tryAttachElement(false)){
// エラーで終了
loadError();
return;
}
}
}
});
// ロードエラー
if(!result){
// ロード完了を通知
_queue_element.complete();
// エラーで終了
loadError();
return;
}
};
// キューに登録
tryAttachElement(false);
};
// ------------------------------
// テキストをロード
// ------------------------------
_this.loadText = function(){
if(!(getEnable())){
loadError();
return;
}
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 0;
// 開始関数をセット
_queue_element.onstart = function(){
// 読み込みを開始する
var result = loadXMLHttpRequest(function(result,xhr){
// ロード完了を通知
_queue_element.complete();
// ロード成功
if(result){
// responseText を返す
loadSuccess(xhr.responseText);
return;
// 失敗
}else{
if(xhr.status == 401){
// 認証エラー
loadError();
}else{
// キューに再登録
if(!tryAttachElement(false)){
// エラーで終了
loadError();
return;
}
}
}
});
// ロードエラー
if(!result){
// ロード完了を通知
_queue_element.complete();
// エラーで終了
loadError();
return;
}
};
// キューに登録
tryAttachElement(false);
};
// ------------------------------
// DataURIScheme をロード
// ------------------------------
_this.loadDataUriScheme = function(){
if(!(getEnable())){
loadError();
return;
}
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 1;
// 開始関数をセット
_queue_element.onstart = function(){
// 読み込みを開始する
var result = loadDataUriScheme(function(result,xhr){
// ロード完了を通知
_queue_element.complete();
// ロード成功
if(result){
loadSuccess(xhr.dataUriScheme);
return;
// 失敗
}else{
if(xhr.status == 401){
// 認証エラー
loadError();
}else{
// キューに再登録
if(!tryAttachElement(false)){
// エラーで終了
loadError();
return;
}
}
}
});
// ロードエラー
if(!result){
// ロード完了を通知
_queue_element.complete();
// エラーで終了
loadError();
return;
}
};
// キューに登録
tryAttachElement(false);
};
// ------------------------------
// リダイレクト先 URL をロード
// ------------------------------
_this.loadFinalURL = function(){
if(!(getEnable())){
loadError();
return;
}
// HTTP メソッド
_this.setMethod("GET");
// カレント URL
var current_url = _request.url;
// TrixieUserScript の場合処理しない
if(ExecuteAsTrixieUserScript()){
loadSuccess(current_url);
return;
}
// キャッシュがあれば返す
var url = redirect_url_dictionary.getRedirectURL(current_url);
if(url){
loadSuccess(url);
return;
}
function RetryCountInitialize(){
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 0;
}
// リダイレクト回数
var redirect_count = 16;
// タイムアウト
_request.timeout = 1000 * 10;
// 開始関数をセット
_queue_element.onstart = function(){
// 読み込みを開始する
var result = loadXMLHttpRequest(function(result,xhr){
// ロード完了を通知
_queue_element.complete();
switch(_request.method){
case "HEAD":
// ロード成功
if(result){
// GET メソッドに変更
_this.setMethod("GET");
// キューに登録
RetryCountInitialize();
tryAttachElement(false);
// 失敗
}else{
var redirect_url = null;
switch(xhr.status){
case 300:
case 301:
case 302:
case 303:
case 307:
// Location ヘッダを取得
redirect_url = xhr.getResponseHeader("Location");
break;
}
if(redirect_url){
// リダイレクト結果を辞書に登録
redirect_url_dictionary.addURL(_request.url,redirect_url);
// URL を更新
_request.url = redirect_url;
// リダイレクト回数オーバー
redirect_count -= 1;
if(redirect_count <= 0){
// 最後に取得したリダイレクト先を返す
loadSuccess(_request.url);
return;
}
// キューに登録
RetryCountInitialize();
tryAttachElement(false);
}else{
if(xhr.status == 401){
// 認証エラー
loadError();
return;
}else{
// キューに再登録
if(!tryAttachElement(false)){
// エラーで終了
loadError();
return;
}
}
}
}
break;
case "GET":
// ロード成功
if(result){
// メタタグのリダイレクトを調べる
var redirect_url = null;
var m = xhr.responseText.match(new RegExp("<meta[^>]http-equiv[ \n\r\t]*=[ \n\r\t]*\"refresh\"[^>]*>","i"));
if(m){
m = m[0].match(new RegExp("content[ \n\r\t]*=[ \n\r\t]*\"[0-9]+;URL=([^\"]+)\"","i"));
if(m){
redirect_url = m[1];
}
}
if(redirect_url){
// リダイレクト結果を辞書に登録
redirect_url_dictionary.addURL(_request.url,redirect_url);
// URL を更新
_request.url = redirect_url;
// リダイレクト回数オーバー
redirect_count -= 1;
if(redirect_count <= 0){
// 最後に取得したリダイレクト先を返す
loadSuccess(_request.url);
return;
}
// キューに登録
RetryCountInitialize();
tryAttachElement(false);
}else{
// GM_xmlhttpRequest をサポートしている
if(GM_xmlhttpRequestSupported()){
// リダイレクト結果を辞書に登録
redirect_url_dictionary.addURL(_request.url,xhr.finalUrl);
// finalUrl を返す
loadSuccess(xhr.finalUrl);
return;
}else{
// 最後に取得したリダイレクト先を返す
loadSuccess(_request.url);
return;
}
}
// 失敗
}else{
if(xhr.status == 401){
// 認証エラー
loadError();
return;
}else{
// キューに再登録
if(!tryAttachElement(false)){
// エラーで終了
loadError();
return;
}
}
}
break;
}
});
// ロードエラー
if(!result){
// ロード完了を通知
_queue_element.complete();
// エラーで終了
loadError();
return;
}
};
// キューに登録
RetryCountInitialize();
tryAttachElement(false);
};
// ------------------------------
// レスポンスヘッダをロード
// ------------------------------
_this.loadResponseHeader = function(){
if(!(getEnable())){
loadError();
return;
}
// HTTP メソッド
_this.setMethod("HEAD");
// 通常リトライ回数
_count = 1;
// シングルリトライ回数
_single_count = 0;
// 開始関数をセット
_queue_element.onstart = function(){
// 読み込みを開始する
var result = loadXMLHttpRequest(function(result,xhr){
// ロード完了を通知
_queue_element.complete();
// ロード成功
if(result){
// レスポンスヘッダオブジェクトを返す
loadSuccess(ResponseHeadersParseObject(xhr.getAllResponseHeaders()));
return;
// 失敗
}else{
if(xhr.status == 401){
// 認証エラー
loadError();
return;
}else{
// キューに再登録
if(!tryAttachElement(false)){
// エラーで終了
loadError();
return;
}
}
}
});
// ロードエラー
if(!result){
// ロード完了を通知
_queue_element.complete();
// エラーで終了
loadError();
return;
}
};
// キューに登録
tryAttachElement(false);
};
// ------------------------------
// アクセス可能か取得(内部用)
// ------------------------------
function getEnable(){
if(project.checkAccessBlock(_request.url)){
if(project.getEnableOutputLog()){
ConsoleLog({type:"AccessBlock",current_url:document.URL,url:_request.url,call:"Cross-Origin XMLHttpRequest"});
}
return false;
}
return true;
}
// ------------------------------
// 要素をキューに登録(内部用)
// ------------------------------
function tryAttachElement(first){
if(_count > 0){
_single_type = false;
_count -= 1;
if(first) _queue_element.attachFirst();
else _queue_element.attachLast();
return true;
}else if(_single_count > 0){
_single_type = true;
_single_count -= 1;
_queue_element.attachSingle();
return true;
}
return false;
}
// ------------------------------
// XMLHttpRequest を利用してロード(内部用)
// ------------------------------
function loadXMLHttpRequest(response){
// アドレスチェック
if(!(_request.url)){
return false;
}
// プロトコルチェック
if(!_request.url.match(new RegExp("^(http|https|ftp)://(.*)$","i"))){
return false;
}
// バックグラウンドへ通信要求
if(0){
var responseText = [];
extension_message.sendRequest({command:"loadXMLHttpRequest",request:_request,single:_single_type}, function(receive) {
if(receive.type == "data"){
responseText.push(receive.data);
return;
}
var xhr = receive.data;
xhr.responseText = responseText.join("");
switch(xhr.readyState){
case 4:
xhr.getAllResponseHeaders = function(){
return xhr.responseHeaders;
};
var response_header = ResponseHeadersParseObject(xhr.responseHeaders);
xhr.getResponseHeader = function(label){
return response_header[label];
};
if((200 <= xhr.status && xhr.status < 300) || xhr.status == 304){
// 成功を返す
response(true,xhr);
}else{
// 失敗を返す
response(false,xhr);
}
break;
}
});
return true;
}
// XMLHttpRequest 作成
var xhr = null;
if(GM_xmlhttpRequestSupported()){
xhr = new GM_xmlhttpRequestCreate();
}else{
xhr = XMLHttpRequestCreate();
}
// 未対応
if(!xhr){
return false;
}
var sended = false;
// ステート変更時に実行されるイベント
xhr.onreadystatechange = function(r){
if(!sended) return;
switch(xhr.readyState){
case 4:
if((200 <= xhr.status && xhr.status < 300) || xhr.status == 304){
// 成功を返す
response(true,xhr);
}else{
// 失敗を返す
response(false,xhr);
}
break;
}
};
// 読み込み開始
try{
xhr.open(_request.method,_request.url,true);
}catch(e){
return false;
}
var headers = _request.headers;
for(var name in headers){
xhr.setRequestHeader(name,headers[name]);
}
if(xhr.overrideMimeType && _request.override_mime_type){
xhr.overrideMimeType(_request.override_mime_type);
}
if(_request.timeout){
xhr.timeout = _request.timeout;
}
try{
xhr.send(_request.data);
sended = true;
}catch(e){
return false;
}
return true;
}
// ------------------------------
// data URI scheme 読み込み(内部用)
// ------------------------------
function loadDataUriScheme(response){
// アドレスチェック
if(!(_request.url)){
return false;
}
// プロトコルチェック
if(!_request.url.match(new RegExp("^(http|https|ftp)://(.*)$","i"))){
return false;
}
// バックグラウンドへ通信要求
if(0){
var dataUriScheme = [];
extension_message.sendRequest({command:"loadDataUriScheme",request:_request,single:_single_type}, function(receive) {
if(receive.type == "data"){
dataUriScheme.push(receive.data);
return;
}
var xhr = receive.data;
xhr.dataUriScheme = dataUriScheme.join("");
switch(xhr.readyState){
case 4:
xhr.getAllResponseHeaders = function(){
return xhr.responseHeaders;
};
var response_header = ResponseHeadersParseObject(xhr.responseHeaders);
xhr.getResponseHeader = function(label){
return response_header[label];
};
if((200 <= xhr.status && xhr.status < 300) || xhr.status == 304){
// 成功を返す
response(true,xhr);
}else{
// 失敗を返す
response(false,xhr);
}
break;
}
});
return true;
}
// XMLHttpRequest 作成
var xhr = null;
if(GM_xmlhttpRequestSupported()){
xhr = new GM_xmlhttpRequestCreate();
}else{
xhr = XMLHttpRequestCreate();
}
// 未対応
if(!xhr){
return false;
}
var sended = false;
var response_type = "";
// ステート変更時に実行されるイベント
xhr.onreadystatechange = function(r){
if(!sended) return;
switch(xhr.readyState){
case 4:
if((200 <= xhr.status && xhr.status < 300) || xhr.status == 304){
switch(response_type){
case "blob":
var file_reader = new FileReader();
file_reader.onload = function(){
xhr.dataUriScheme = file_reader.result;
response(true,xhr);
};
file_reader.onerror = function(){
response(false,xhr);
};
file_reader.readAsDataURL(xhr.response);
break;
case "arraybuffer":
Base64_From_ArrayBuffer_Async(xhr.response,function(base64){
// data URI scheme 変換
xhr.dataUriScheme = "data:" + xhr.getResponseHeader("Content-Type") + ";base64," + base64;
// 成功を返す
response(true,xhr);
});
break;
case "User-Defined":
Base64_From_XUserDefined_Async(xhr.responseText,function(base64){
// data URI scheme 変換
xhr.dataUriScheme = "data:" + xhr.getResponseHeader("Content-Type") + ";base64," + base64;
// 成功を返す
response(true,xhr);
});
break;
default:
// 成功を返す
response(true,xhr);
break;
}
}else{
// 失敗を返す
response(false,xhr);
}
}
};
// 読み込み開始
try{
xhr.open(_request.method,_request.url,true);
}catch(e){
return false;
}
var headers = _request.headers;
for(var name in headers){
xhr.setRequestHeader(name,headers[name]);
}
if(xhr.responseType !== undefined){
if(window.FileReader){
xhr.responseType = response_type = "blob";
}else{
xhr.responseType = response_type = "arraybuffer";
}
}else if(xhr.overrideMimeType){
xhr.overrideMimeType("text/plain; charset=x-user-defined");
response_type = "User-Defined";
}
if(_request.timeout){
xhr.timeout = _request.timeout;
}
try{
xhr.send(_request.data);
sended = true;
}catch(e){
return false;
}
return true;
}
// ------------------------------
// ロード失敗(内部用)
// ------------------------------
function loadError(){
loader_queue.addCountError();
if(_this.onerror) _this.onerror();
_queue_element.release();
}
// ------------------------------
// ロード成功(内部用)
// ------------------------------
function loadSuccess(v){
if(_this.onload) _this.onload(v);
_queue_element.release();
}
// ------------------------------
// プライベート変数
// ------------------------------
var _request;
var _queue_element;
var _count;
var _single_count;
var _single_type;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_request = {
headers:new Object(),
method:"GET",
url:"",
data:null,
timeout:project.getLoadTimeout()
};
_count = 0;
_single_count = 0;
_queue_element = loader_queue.createElement();
})();
}
// ------------------------------
// ダウンローダーキュー
// ------------------------------
function DownloaderQueue(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
var queue = _this.queue;
while(queue != queue._next){
var next = queue._next;
if(next.onabort) next.onabort();
ElementRemove(next);
}
var queue = _this.queue_single;
while(queue != queue._next){
var next = queue._next;
if(next.onabort) next.onabort();
ElementRemove(next);
}
};
// ------------------------------
// 要素を作成
// ------------------------------
_this.createElement = function(){
var _element = new Object();
// ------------------------------
// 開始イベント
// ------------------------------
_element.onstart = function(){};
// ------------------------------
// 中止イベント
// ------------------------------
_element.onabort = function(){};
// ------------------------------
// 完了を通知
// ------------------------------
_element.complete = function(){
_thread_count -= 1;
dequeue();
};
// ------------------------------
// 要素を破棄
// ------------------------------
_element.release = function(){
ElementRemove(_element);
_queue_count -= 1;
dequeue();
};
// ------------------------------
// 通常最前列に処理を追加
// ------------------------------
_element.attachFirst = function(){
ElementRemove(_element);
var _prev = _this.queue;
var _next = _prev._next;
_prev._next = _element;
_next._prev = _element;
_element._prev = _prev;
_element._next = _next;
dequeue();
};
// ------------------------------
// 通常最後尾に追加
// ------------------------------
_element.attachLast = function(){
ElementRemove(_element);
var _next = _this.queue;
var _prev = _next._prev;
_prev._next = _element;
_next._prev = _element;
_element._prev = _prev;
_element._next = _next;
dequeue();
};
// ------------------------------
// シングル最後尾に追加
// ------------------------------
_element.attachSingle = function(){
ElementRemove(_element);
var _next = _this.queue_single;
var _prev = _next._prev;
_prev._next = _element;
_next._prev = _element;
_element._prev = _prev;
_element._next = _next;
dequeue();
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element._prev = _element;
_element._next = _element;
_queue_count += 1;
})();
return _element;
};
// ------------------------------
// 要素のロード開始(内部用)
// ------------------------------
function ElementLoadStart(element){
ElementRemove(element);
_thread_count += 1;
element.onstart();
}
// ------------------------------
// 要素を外す(内部用)
// ------------------------------
function ElementRemove(element){
var _prev = element._prev;
var _next = element._next;
_prev._next = _next;
_next._prev = _prev;
element._prev = element;
element._next = element;
}
// ------------------------------
// デキュー(内部用)
// ------------------------------
function dequeue(){
// 通常キュー
while(_thread_count < _thread_max){
var element = _this.queue._next;
// キューが空
if(element == _this.queue){
break;
}
ElementLoadStart(element);
}
// シングルキュー
if(_thread_count <= 0){
var element = _this.queue_single._next;
if(element != _this.queue_single){
ElementLoadStart(element);
}
}
}
// ------------------------------
// キューの数を取得
// ------------------------------
_this.getCountQueue = function(){
return _queue_count;
};
// ------------------------------
// スレッドの数を取得
// ------------------------------
_this.getCountThread = function(){
return _thread_count;
};
// ------------------------------
// エラー数を取得
// ------------------------------
_this.getCountError = function(){
return _error_count;
};
// ------------------------------
// エラー数を加算
// ------------------------------
_this.addCountError = function(){
_error_count += 1;
};
// ------------------------------
// スレッドの最大数を取得
// ------------------------------
_this.getMaxThread = function(){
return _thread_max;
};
// ------------------------------
// ロードスレッドの最大数をセット
// ------------------------------
_this.setMaxThread = function(v){
_thread_max = v;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _queue_count;
var _thread_count;
var _thread_max;
var _error_count;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_queue_count = 0;
_thread_count = 0;
_this.setMaxThread(10);
_error_count = 0;
var queue = new Object();
queue._prev = queue;
queue._next = queue;
_this.queue = queue;
var queue_single = new Object();
queue_single._prev = queue_single;
queue_single._next = queue_single;
_this.queue_single = queue_single;
})();
}
// ------------------------------
// ダウンローダー
// ------------------------------
function Downloader(){
var _this = this;
// ------------------------------
// URL をセット
// ------------------------------
_this.setURL = function(url){
_this._url = url;
};
// ------------------------------
// 保存ファイル名をセット
// ------------------------------
_this.setFileName = function(file_name){
file_name = file_name.replace(new RegExp("[/\\\\]+","ig"),"/");
file_name = file_name.replace(new RegExp("[\":*?<>|]","ig"),"-");
_this._file_name = file_name;
};
// ------------------------------
// 保存タイアログを使用する
// ------------------------------
_this.setSaveAs = function(use){
_this._save_as = use;
};
// ------------------------------
// ダウンロード開始
// ------------------------------
_this.start = function(){
var queue_element = downloader_queue.createElement();
queue_element.onstart = function(){
download(function(result){
if(!result){
downloader_queue.addCountError();
}
// ロード完了を通知
queue_element.complete();
queue_element.release();
if(_this.oncomplete){
_this.oncomplete(result);
}
});
};
queue_element.attachLast();
};
// ------------------------------
// 完了イベント
// ------------------------------
_this.oncomplete = function(){};
// ------------------------------
// ダウンロード(内部用)
// ------------------------------
function download(callback){
if(address_collection.hasAddress("download",_this._url)){
callback(true);
return;
}
// アドレスを登録
address_collection.addAddress("download",_this._url);
if(0){
extension_message.sendRequest({command:"download",url:_this._url,file_name:_this._file_name,save_as:_this._save_as}, function(response) {
callback(response.result);
});
return;
}else{
var anchor = DocumentCreateElement("a");
if(anchor.download !== undefined){
var anchor_download = function (data_url){
anchor.target = "PageExpandDownload";
anchor.href = data_url;
anchor.download = _this._file_name;
document.body.appendChild(anchor);
anchor.click();
DomNodeRemove(anchor);
anchor.href = "";
anchor.download = "";
callback(true);
};
if(_this._url.search(new RegExp("^(data|blob):","i")) >= 0){
anchor_download(_this._url);
return;
}else{
// ローダーオブジェクトを作成
var loader = new Loader();
// 成功
loader.onload = anchor_download;
// 失敗
loader.onerror = function(){
callback(false);
};
// DataURIScheme の読み込み
loader.setMethod("GET");
loader.setURL(_this._url);
loader.loadDataUriScheme();
return;
}
}
}
callback(false);
}
}
// ------------------------------
// ダウンロードリスト
// ------------------------------
function DownloadList(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
while(_queue != _queue._next){
_queue._next.release();
}
};
// ------------------------------
// アイテム生成
// ------------------------------
_this.createItem = function(){
var _item = new Object();
// ------------------------------
// 開放
// ------------------------------
_item.release = function(){
var _prev = _item._prev;
var _next = _item._next;
_prev._next = _next;
_next._prev = _prev;
_item._prev = _item;
_item._next = _item;
};
// ------------------------------
// URL をセット
// ------------------------------
_item.setURL = function(url){
_item._url = url;
};
// ------------------------------
// ファイル名をセット
// ------------------------------
_item.setFileName = function(file_name){
file_name = file_name.replace(new RegExp("[/\\\\]+","ig"),"/");
file_name = file_name.replace(new RegExp("[\":*?<>|]","ig"),"-");
_item._file_name = file_name;
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
var _next = _queue;
var _prev = _next._prev;
_prev._next = _item;
_next._prev = _item;
_item._prev = _prev;
_item._next = _next;
})();
return _item;
};
// ------------------------------
// アーカイブを作成
// ------------------------------
_this.createArchive = function(){
// ------------------------------
// 初期化
// ------------------------------
var crc32 = new CRC32();
var progress = new DownloadProgress(document.body);
var blob_url;
var closed = false;
var event_dispatcher = new EventDispatcher();
var event_handler_release;
// ------------------------------
// 終了
// ------------------------------
function close(){
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
if(blob_url){
BlobURLRevoke(blob_url);
blob_url = null;
}
if(event_dispatcher){
// イベントを発火
event_dispatcher.dispatchEvent("close",_this);
event_dispatcher.release();
event_dispatcher = null;
}
}
// ------------------------------
// 中断イベント
// ------------------------------
progress.onclose = function (){
closed = true;
close();
};
// ------------------------------
// 開放イベント
// ------------------------------
event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
progress.onclose();
});
// ------------------------------
// 開く
// ------------------------------
progress.open(function (){
// ------------------------------
// バイナリを読み込み
// ------------------------------
function loadBinary(url,callback){
var loader = new Loader();
loader.onload = function(str){
callback(str);
};
loader.onerror = function(){
callback(null);
};
loader.setMethod("GET");
loader.setURL(url);
loader.overrideMimeType("text/plain; charset=x-user-defined");
loader.loadText();
}
// ------------------------------
// ファイル名変換
// ------------------------------
function phaseConvertFileName(items,callback){
progress.setMessage("Converting ...",0);
progress.setMessage("",1);
progress.setValueProgress(0.0,0);
progress.setValueProgress(0.0,1);
var dic = new Object();
var ary = new Array();
var pos = 0;
var num = items.length;
(function callee(){
if(closed) return;
if(pos >= num){
callback(ary);
return;
}
var d = 1.0;
if(num > 1) d = pos / (num - 1);
item = items[pos];
pos ++;
progress.setValueProgress(d,1);
progress.setMessage(item._url,1);
if(dic[item._url] === undefined){
var name = String_To_ArrayBuffer_As_UTF8(item._file_name);
if(name){
ary.push({
file_name:name,
item:item
});
}
dic[item._url] = true;
}else{
item.release();
}
execute_queue.attachFirst(callee,null);
})();
}
// ------------------------------
// 読み込み
// ------------------------------
function phaseDownload(items,callback){
progress.setMessage("Downloading ...",0);
progress.setMessage("",1);
progress.setValueProgress(0.0,0);
progress.setValueProgress(0.0,1);
var ary = new Array();
var ref = 0;
var i;
var num = items.length;
var total_byte = 0;
for(i=0;i<num;i++){
(function (){
var item = items[i];
loadBinary(item.item._url,function (binary){
if(closed) return;
if(binary){
ary.push(item);
item.binary = binary;
item.file_size = binary.length;
total_byte += item.file_size;
}
ref ++;
if(num <= ref){
callback(ary);
}
var d = 1.0;
if(num > 1) d = ref / (num - 1);
progress.setMessage(total_byte + " Byte (" + ref + "/" + num + ")",1);
progress.setValueProgress(d,1);
});
})();
}
if(!num){
callback(ary);
}
}
// ------------------------------
// CRC32 計算
// ------------------------------
function phaseCalculateCRC(items,callback){
var increment = 1024 * 10;
progress.setMessage("Calculate CRC ...",0);
progress.setMessage("",1);
progress.setValueProgress(0.0,0);
progress.setValueProgress(0.0,1);
var pos = 0;
var num = items.length;
(function callee(){
if(closed) return;
if(pos >= num){
callback(items);
return;
}
var upper = 1.0;
if(num > 1) upper = pos / (num);
item = items[pos];
pos ++;
progress.setValueProgress(upper * 0.5,0);
progress.setValueProgress(0.0,1);
progress.setMessage(item.item._url,1);
var p = 0;
var s = increment;
var n = item.file_size;
crc32.initialize();
execute_queue.attachLastForInterrupt(function f(){
if(n - p < s){
s = n - p;
}
if(s <= 0){
execute_queue.attachLastForInterrupt(callee,null);
return;
}
p += s;
var loawer = 1.0;
if(n > 0) loawer = p / n;
progress.setValueProgress((upper + (loawer / num)) * 0.5,0);
progress.setValueProgress(loawer,1);
item.crc32 = crc32.getFromStringOfBinaryData(item.binary,s);
execute_queue.attachFirst(f,null);
},null);
})();
}
// ------------------------------
// アーカイブの作成
// ------------------------------
function phaseCreateArchive(items,callback){
// ------------------------------
// 初期化
// ------------------------------
var pos = 0;
var total = 0;
var central_directory_pos = 0;
var central_directory_size = 0;
var ary_buffer;
var data_view;
var little_endian = true;
// ------------------------------
// local file header のサイズを取得
// ------------------------------
function getSize_LocalFileHeader(item){
var file_name_size = item.file_name.byteLength;
var extra_size = 0;
return (30 + file_name_size + extra_size);
}
// ------------------------------
// file data のサイズを取得
// ------------------------------
function getSize_LocalFileData(item){
return (item.file_size);
}
// ------------------------------
// file header のサイズを取得
// ------------------------------
function getSize_FileHeader(item){
var file_name_size = item.file_name.byteLength;
var extra_size = 0;
var comment_size = 0;
return (46 + file_name_size + extra_size + comment_size);
}
// ------------------------------
// End of central dir record のサイズを取得
// ------------------------------
function getSize_EndOfCentralDirRecord(){
return 22;
}
// ------------------------------
// 時刻を出力
// ------------------------------
function writeLastModFileTime(item){
var date_obj = item.date;
var v =
((date_obj.getHours() & 0x1f) << 11) |
((date_obj.getMinutes() & 0x3f) << 5) |
(Math.round(date_obj.getSeconds() / 2) & 0x1f);
data_view.setUint16(pos , v , little_endian);
pos += 2;
}
// ------------------------------
// 日付を出力
// ------------------------------
function writeLastModFileDate(item){
var date_obj = item.date;
var v =
(((date_obj.getFullYear() - 1980) & 0x7f) << 9) |
(((date_obj.getMonth() + 1) & 0x0f) << 5) |
( date_obj.getDate() & 0x1f);
data_view.setUint16(pos , v , little_endian);
pos += 2;
}
// ------------------------------
// local file header を出力
// ------------------------------
function writeLocalFileHeader(item){
var name = item.file_name;
var name_u8 = new Uint8Array(name);
var name_size = name.byteLength;
var file_size = item.file_size;
var extra_size = 0;
// シグネチャ
data_view.setUint32(pos , 0x04034b50 , little_endian);
pos += 4;
// バージョン
data_view.setUint16(pos , 10 , little_endian);
pos += 2;
// オプション
data_view.setUint16(pos , 0x80 , little_endian);
pos += 2;
// 圧縮アルゴリズム
data_view.setUint16(pos , 0 , little_endian);
pos += 2;
// タイムスタンプ(時刻)
writeLastModFileTime(item);
// タイムスタンプ(日付)
writeLastModFileDate(item);
// CRC32
data_view.setUint32(pos , item.crc32 , little_endian);
pos += 4;
// ファイルサイズ
data_view.setUint32(pos , file_size , little_endian);
pos += 4;
// 圧縮サイズ
data_view.setUint32(pos , file_size , little_endian);
pos += 4;
// ファイル名のサイズ
data_view.setUint16(pos , name_size , little_endian);
pos += 2;
// 拡張フィールドサイズ
data_view.setUint16(pos , extra_size , little_endian);
pos += 2;
// ファイル名
for(i=0;i<name_size;i++){
data_view.setUint8(pos , name_u8[i] , little_endian);
pos += 1;
}
}
// ------------------------------
// file header を出力
// ------------------------------
function writeFileHeader(item){
var name = item.file_name;
var name_u8 = new Uint8Array(name);
var name_size = name.byteLength;
var file_size = item.file_size;
var extra_size = 0;
var comment_size = 0;
// シグネチャ
data_view.setUint32(pos , 0x02014b50 , little_endian);
pos += 4;
// バージョン
data_view.setUint16(pos , 10 , little_endian);
pos += 2;
// OS
data_view.setUint16(pos , 0 , little_endian);
pos += 2;
// オプション
data_view.setUint16(pos , 0x80 , little_endian);
pos += 2;
// 圧縮アルゴリズム
data_view.setUint16(pos , 0 , little_endian);
pos += 2;
// タイムスタンプ(時刻)
writeLastModFileTime(item);
// タイムスタンプ(日付)
writeLastModFileDate(item);
// CRC32
data_view.setUint32(pos , item.crc32 , little_endian);
pos += 4;
// ファイルサイズ
data_view.setUint32(pos , file_size , little_endian);
pos += 4;
// 圧縮サイズ
data_view.setUint32(pos , file_size , little_endian);
pos += 4;
// ファイル名のサイズ
data_view.setUint16(pos , name_size , little_endian);
pos += 2;
// 拡張フィールドサイズ
data_view.setUint16(pos , extra_size , little_endian);
pos += 2;
// コメントサイズ
data_view.setUint16(pos , comment_size , little_endian);
pos += 2;
// ファイルヘッダのディスク位置
data_view.setUint16(pos , 0 , little_endian);
pos += 2;
// 内部ファイル属性
data_view.setUint16(pos , 0 , little_endian);
pos += 2;
// 外部ファイル属性
data_view.setUint32(pos , 0 , little_endian);
pos += 4;
// Local file header 開始オフセット(先頭から)
data_view.setUint32(pos , item.offset , little_endian);
pos += 4;
// ファイル名
for(i=0;i<name_size;i++){
data_view.setUint8(pos , name_u8[i] , little_endian);
pos += 1;
}
}
// ------------------------------
// End of central dir record を出力
// ------------------------------
function writeEndOfCentralDirRecord(){
var file_num = items.length;
// シグネチャ
data_view.setUint32(pos , 0x06054b50 , little_endian);
pos += 4;
// 同ディスク位置
data_view.setUint16(pos , 0 , little_endian);
pos += 2;
// ファイル開始ディスク位置
data_view.setUint16(pos , 0 , little_endian);
pos += 2;
// 同ディスク内ファイル総数
data_view.setUint16(pos , file_num , little_endian);
pos += 2;
// ファイル総数
data_view.setUint16(pos , file_num , little_endian);
pos += 2;
// Central directory 総サイズ
data_view.setUint32(pos , central_directory_size , little_endian);
pos += 4;
// File header 開始オフセット
data_view.setUint32(pos , central_directory_pos , little_endian);
pos += 4;
// コメントサイズ
data_view.setUint16(pos , 0 , little_endian);
pos += 2;
}
// ------------------------------
// ファイルデータ出力
// ------------------------------
function phaseWriteFileData(items,callback){
var increment = 1024 * 10;
progress.setMessage("Write File Data ...",0);
progress.setMessage("",1);
progress.setValueProgress(0.5,0);
progress.setValueProgress(0.0,1);
var i = 0;
var num = items.length;
(function callee(){
if(closed) return;
if(i >= num){
callback(items);
return;
}
var upper = 1.0;
if(num > 1) upper = i / (num);
item = items[i];
i ++;
progress.setValueProgress(upper * 0.5 + 0.5,0);
progress.setValueProgress(0.0,1);
progress.setMessage(item.item._url,1);
writeLocalFileHeader(item);
var p = 0;
var s = increment;
var n = item.file_size;
var e;
var binary = item.binary;
delete item.binary;
crc32.initialize();
execute_queue.attachLastForInterrupt(function f(){
if(n - p < s){
s = n - p;
}
if(s <= 0){
execute_queue.attachLastForInterrupt(callee,null);
return;
}
e = p + s;
while(p < e){
data_view.setUint8(pos , (binary.charCodeAt(p) & 0xff) , little_endian);
pos += 1;
p ++;
}
var loawer = 1.0;
if(n > 0) loawer = p / n;
progress.setValueProgress(loawer,1);
progress.setValueProgress((upper + (loawer / num)) * 0.5 + 0.5,0);
execute_queue.attachFirst(f,null);
},null);
})();
}
// ------------------------------
// 中央ディレクトリ出力
// ------------------------------
function phaseWriteCentralDirectory(items,callback){
var increment = 1024 * 10;
progress.setMessage("Write Central Directory ...",0);
progress.setMessage("",1);
progress.setValueProgress(1.0,0);
progress.setValueProgress(0.0,1);
var i = 0;
var num = items.length;
(function callee(){
if(closed) return;
if(i >= num){
writeEndOfCentralDirRecord();
callback(items);
return;
}
item = items[i];
i ++;
var lower = 1.0;
if(num > 1) lower = i / (num);
progress.setValueProgress(lower,1);
progress.setMessage(item.item._url,1);
writeFileHeader(item);
execute_queue.attachLastForInterrupt(callee,null);
})();
}
(function(){
var date_obj = new Date();
// 総サイズ
var i;
var num = items.length;
for(i=0;i<num;i++){
var item = items[i];
item.offset = total;
total += getSize_LocalFileHeader(item);
total += getSize_LocalFileData(item);
item.index = i;
item.date = date_obj;
}
central_directory_pos = total;
for(i=0;i<num;i++){
var item = items[i];
central_directory_size += getSize_FileHeader(item);
}
total += central_directory_size;
total += getSize_EndOfCentralDirRecord();
// バイナリ生成
ary_buffer = new ArrayBuffer(total);
data_view = new DataView(ary_buffer);
// 出力
phaseWriteFileData(items,function(items){
phaseWriteCentralDirectory(items,function(items){
var download_file_name = "PageExpand_" + date_obj.getTime() + ".zip";
// クローズイベント
function close_event(){
var event_handler = event_dispatcher.createEventHandler("close");
event_handler.setFunction(function(){
var i = 0;
var num = items.length;
for(i=0;i<num;i++){
var item = items[i];
item.item.release();
}
});
}
// 成功
function success(){
if(closed) return;
close_event();
progress.close();
close();
}
// 失敗
function failure(src){
if(closed) return;
close_event();
progress.setMessage("Complete",0);
progress.setMessage("Save Zip File As ...",1);
progress.setAnchor({href:src,download:download_file_name});
}
progress.setMessage("",1);
progress.setValueProgress(1.0,0);
progress.setValueProgress(1.0,1);
if(0){
progress.setMessage("Create Blob URL ...",0);
setTimeout(function(){
var blob = new Blob([ary_buffer],{type:"application/zip"});
blob_url = BlobURLCreate(blob);
progress.setMessage("Wait ...",0);
setTimeout(function(){
var downloader = new Downloader();
downloader.setURL(blob_url);
downloader.setFileName(download_file_name);
downloader.setSaveAs(true);
downloader.oncomplete = function(result){
progress.setMessage("Complete",0);
if(result){
success();
}else{
failure(blob_url);
}
}
downloader.start();
},1);
},1);
}else{
progress.setMessage("Create Blob URL ...",0);
setTimeout(function(){
try{
var blob = new Blob([ary_buffer],{type:"application/zip"});
blob_url = BlobURLCreate(blob);
}catch(e){
}
if(blob_url){
failure(blob_url);
}else{
progress.setMessage("Create Data URI Scheme ...",0);
Base64_From_ArrayBuffer_Async(ary_buffer,function(base64){
progress.setMessage("Wait ...",0);
progress.setMessage("",1);
progress.setValueProgress(1.0,1);
setTimeout(function(){
window.location.assign("data:application/zip;base64," + base64);
success();
},1);
},{
onprogress:function(e){
progress.setMessage(e.loaded + "/" + e.total + " Byte",1);
progress.setValueProgress(e.loaded/e.total,1);
}
});
}
},1)
}
});
});
})();
}
(function(){
// 配列に格納
var items = new Array();
var item = _queue._next;
while(_queue != item){
items.push(item);
item = item._next;
}
phaseConvertFileName(items,function(items){
phaseDownload(items,function(items){
phaseCalculateCRC(items,function(items){
phaseCreateArchive(items,function(items){
progress.close();
});
});
});
});
})();
});
};
// ------------------------------
// クリア
// ------------------------------
_this.clear = function(){
_queue._prev = _queue;
_queue._next = _queue;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _queue;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_queue = new Object();
_queue._prev = _queue;
_queue._next = _queue;
})();
}
// ------------------------------
// タスクコンテナ
// ------------------------------
function TaskContainer(){
var _this = this;
// ------------------------------
// タスク生成
// ------------------------------
_this.createTask = function(parent){
var _task = new Object();
// ------------------------------
// タスクを実行
// ------------------------------
_task.execute = function(level){
if(!_task._alive) return;
if(_task._execute_func){
if(level & _task._level){
try{
_task._execute_func(_task);
}catch(e){
if(project.getEnableDebugMode()){
ConsoleError(e.stack);
}
}
}
}
};
// ------------------------------
// タスクを破棄
// ------------------------------
_task.release = function(){
_task.releaseChild();
TaskRelease(_task);
};
// ------------------------------
// 子タスクをすべて破棄
// ------------------------------
_task.releaseChild = function(){
var a = new Array();
var child = _task._child;
var task = child._next;
while(task != child){
a.push(task);
task = task._next;
}
var i;
var num = a.length;
for(i=0;i<num;i++){
task = a[i];
task.releaseChild();
TaskRelease(task);
}
};
// ------------------------------
// 子タスクとして登録
// ------------------------------
_task.attachChild = function(task){
task.removeParent();
var prev = _task._child;
var next = prev._next;
prev._next = task;
next._prev = task;
task._prev = prev;
task._next = next;
task._parent = _task;
_task._child_count += 1;
};
// ------------------------------
// 自身の親子関係を外す
// ------------------------------
_task.removeParent = function(){
if(_task._parent){
_task._parent._child_count -= 1;
var prev = _task._prev;
var next = _task._next;
prev._next = next;
next._prev = prev;
_task._prev = _task;
_task._next = _task;
_task._parent = null;
}
};
// ------------------------------
// 子の親子関係を外す
// ------------------------------
_task.removeChild = function(){
var a = new Array();
var child = _task._child;
var task = child._next;
while(task != child){
a.push(task);
task = task._next;
}
var i;
var num = a.length;
for(i=0;i<num;i++){
task = a[i];
task.removeParent();
}
};
// ------------------------------
// 子を取得
// ------------------------------
_task.getChild = function(func){
var a = new Array();
var child = _task._child;
var task = child._next;
while(task != child){
a.push(task);
task = task._next;
}
var i;
var num = a.length;
for(i=0;i<num;i++){
task = a[i];
func(task);
}
};
// ------------------------------
// 親を取得
// ------------------------------
_task.getParent = function(){
return _task._parent;
};
// ------------------------------
// 実行関数をゲット
// ------------------------------
_task.getExecuteFunc = function(){
return _task._execute_func;
};
// ------------------------------
// 実行関数をセット
// ------------------------------
_task.setExecuteFunc = function(func){
_task._execute_func = func;
};
// ------------------------------
// デストラクタ関数をゲット
// ------------------------------
_task.getDestructorFunc = function(){
return _task._destructor_func;
};
// ------------------------------
// デストラクタ関数をゲット
// ------------------------------
_task.setDestructorFunc = function(func){
_task._destructor_func = func;
};
// ------------------------------
// 自身の前の優先度でタスクを登録
// ------------------------------
_task.attachPrioPrev = function(task){
TaskRemovePrio(task);
var prev = _task._prio_prev;
var next = _task;
prev._prio_next = task;
next._prio_prev = task;
task._prio_prev = prev;
task._prio_next = next;
};
// ------------------------------
// 自身の後の優先度でタスクを登録
// ------------------------------
_task.attachPrioNext = function(task){
TaskRemovePrio(task);
var prev = _task;
var next = _task._prio_next;
prev._prio_next = task;
next._prio_prev = task;
task._prio_prev = prev;
task._prio_next = next;
};
// ------------------------------
// 自身の直前の優先度に位置するタスクを取得
// ------------------------------
_task.getPrioPrev = function(){
return _task._prio_prev;
};
// ------------------------------
// 自身の直後の優先度に位置するタスクを取得
// ------------------------------
_task.getPrioNext = function(){
return _task._prio_next;
};
// ------------------------------
// 子の総数を取得
// ------------------------------
_task.getCountChild = function(){
return _task._child_count;
};
// ------------------------------
// タスクレベルをゲット
// ------------------------------
_task.getLevel = function(){
return _task._level;
};
// ------------------------------
// タスクレベルをセット
// ------------------------------
_task.setLevel = function(level){
_task._level = level;
};
// ------------------------------
// 生存状態をゲット
// ------------------------------
_task.getAlive = function(){
return _task._alive;
};
// ------------------------------
// ユーザーワークを取得
// ------------------------------
_task.getUserWork = function(){
return _task._user_work;
};
// ------------------------------
// 初期化
// ------------------------------
_task._prio_prev = _task;
_task._prio_next = _task;
_task._prev = _task;
_task._next = _task;
_task._parent = null;
_task._child_count = 0;
_task._child = new Object();
_task._child._prev = _task._child;
_task._child._next = _task._child;
_task._alive = true;
_task._level = 0xffffffff;
_task._user_work = new Object();
_task._execute_func = null;
_task._destructor_func = null;
if(parent){
parent.attachChild(_task);
}
_this.attachPrioLast(_task);
if(_task_count == 1){
if(_start_func) _start_func();
}
_task_count += 1;
return _task;
};
// ------------------------------
// タスクコンテナ実行
// ------------------------------
_this.execute = function(level){
var a = new Array();
var task = _this._prio_next;
while(task != _this){
a.push(task);
task = task._prio_next;
}
var i;
var num = a.length;
for(i=0;i<num;i++){
task = a[i];
if(task.getAlive()){
task.execute(level);
}else{
// 開放
var prev = task._prio_prev;
var next = task._prio_next;
prev._prio_next = next;
next._prio_prev = prev;
task._prio_prev = task;
task._prio_next = task;
}
}
};
// ------------------------------
// タスクコンテナ開放
// ------------------------------
_this.release = function(){
var a = new Array();
var task = _this._prio_next;
while(task != _this){
a.push(task);
task = task._prio_next;
}
var prev;
var next;
var i;
var num = a.length;
for(i=0;i<num;i++){
task = a[i];
TaskRelease(task);
prev = task._prio_prev;
next = task._prio_next;
prev._prio_next = next;
next._prio_prev = prev;
task._prio_prev = task;
task._prio_next = task;
}
};
// ------------------------------
// 子としてタスクを登録
// ------------------------------
_this.attachChild = function(task){
_root_task.attachChild(task);
};
// ------------------------------
// 優先度を最前列で登録
// ------------------------------
_this.attachPrioFirst = function(task){
TaskRemovePrio(task);
var prev = _this;
var next = prev._prio_next;
prev._prio_next = task;
next._prio_prev = task;
task._prio_prev = prev;
task._prio_next = next;
};
// ------------------------------
// 優先度を最後尾で登録
// ------------------------------
_this.attachPrioLast = function(task){
TaskRemovePrio(task);
var next = _this;
var prev = next._prio_prev;
prev._prio_next = task;
next._prio_prev = task;
task._prio_prev = prev;
task._prio_next = next;
};
// ------------------------------
// 優先度を外す(内部用)
// ------------------------------
function TaskRemovePrio(task){
var next = task._prio_next;
if(task != next){
var prev = task._prio_prev;
prev._prio_next = next;
next._prio_prev = prev;
task._prio_prev = task;
task._prio_next = task;
}
}
// ------------------------------
// 開放(内部用)
// ------------------------------
function TaskRelease(task){
if(task._alive){
task._alive = false;
if(task._destructor_func){
task._destructor_func(task);
}
task.removeParent();
task._user_work = null;
_task_count -= 1;
if(_task_count == 1){
if(_end_func) _end_func();
}
}
}
// ------------------------------
// タスク総数を取得
// ------------------------------
_this.getCountTask = function(){
return _task_count - 1;
};
// ------------------------------
// 開始関数をセット
// ------------------------------
_this.setStartFunc = function(f){
_start_func = f;
};
// ------------------------------
// 終了関数をセット
// ------------------------------
_this.setEndFunc = function(f){
_end_func = f;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _root_task;
var _task_count;
var _start_func = null;
var _end_func = null;
// ------------------------------
// 初期化
// ------------------------------
_task_count = 0;
_this._prio_prev = _this;
_this._prio_next = _this;
_root_task = _this.createTask(null);
}
// ------------------------------
// リダイレクト辞書
// ------------------------------
function RedirectUrlDictionary(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
};
// ------------------------------
// 要素を作成
// ------------------------------
function createElement(current_url){
var _element = new Object();
// ------------------------------
// 双方向リストを外す
// ------------------------------
_element.release = function(){
_element.remove();
delete _dictionary[current_url];
_count -= 1;
};
// ------------------------------
// 双方向リストを外す
// ------------------------------
_element.remove = function(){
var _prev = _element._prev;
var _next = _element._next;
_prev._next = _next;
_next._prev = _prev;
_element._prev = _element;
_element._next = _element;
};
// ------------------------------
// リダイレクト先 URL を取得
// ------------------------------
_element.getURL = function(){
return _url;
};
// ------------------------------
// リダイレクト先 URL をセット
// ------------------------------
_element.setURL = function(url){
_url = url;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _url;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element._prev = _element;
_element._next = _element;
_dictionary[current_url] = _element;
_count += 1;
})();
return _element;
}
// ------------------------------
// URL を登録
// ------------------------------
_this.addURL = function(current_url,url){
var element = null;
element = _dictionary[current_url];
if(element){
element.remove();
}else{
// 要素を新規作成
element = createElement(current_url);
}
// 最新へ登録
element.setURL(url);
var _next = _this._prev;
var _prev = _next._prev;
_prev._next = element;
_next._prev = element;
element._prev = _prev;
element._next = _next;
// 古い要素を破棄
if(_count >= _cache_max){
element = _this._next;
element.release();
}
};
// ------------------------------
// リダイレクト先 URL を繰り返し取得する
// ------------------------------
_this.getRedirectURL = function(current_url){
var i;
var num = _repeat_max;
for(i=0;i<num;i++){
if(!_dictionary[current_url]) break;
if(current_url == _dictionary[current_url].getURL()) break;
current_url = _dictionary[current_url].getURL();
}
if(i) return current_url;
return null;
};
// ------------------------------
// キャッシュ最大数をセット
// ------------------------------
_this.setMaxCache = function(v){
_cache_max = v;
};
// ------------------------------
// 繰り返し最大数をセット
// ------------------------------
_this.setMaxRepeat = function(v){
_cache_max = v;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _dictionary;
var _count;
var _cache_max;
var _repeat_max;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_dictionary = new Object();
_this._prev = _this;
_this._next = _this;
_count = 0;
_cache_max = 256;
_repeat_max = 16;
})();
}
// ------------------------------
// ローダー進捗通知
// ------------------------------
function NotifyProgress(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(_task){
_task.release();
_task = null;
}
};
// ------------------------------
// 要素生成
// ------------------------------
_this.createElement = function(){
var _element = new Object();
// ------------------------------
// 開放
// ------------------------------
_element.release = function(){
// マウスイベントを外す
removeEventMouseOver();
// タッチイベントを外す
removeEventTouchStart();
// タスクを破棄
releaseTask();
};
// ------------------------------
// 当たり判定用エレメントをセット
// ------------------------------
_element.setElementHitArea = function(element){
_element_hit_area = element;
// マウスイベントを開始
addEventMouseOver();
// タッチイベントを開始
addEventTouchStart();
// マウスとの当たり判定
if(ElementHitTestMousePosition(element,input_mouse.getPositionClient(),true)){
createTask();
}
};
// ------------------------------
// 通知をセット
// ------------------------------
_element.setNotify = function(type){
_notify = type;
ElementSetNotify(_element,_notify);
};
// ------------------------------
// 通知をセット
// ------------------------------
_element.hitTest = function(){
return _hittest;
};
// ------------------------------
// マウスオーバーイベントを追加(内部用)
// ------------------------------
function addEventMouseOver(){
removeEventMouseOver();
if(_element_hit_area.addEventListener){
_element_hit_area.addEventListener("mouseover",mouseOver,false);
}else if(_element_hit_area.attachEvent){
_element_hit_area.attachEvent("onmouseover",mouseOver);
}
}
// ------------------------------
// マウスオーバーイベントを外す(内部用)
// ------------------------------
function removeEventMouseOver(){
if(_element_hit_area.removeEventListener){
_element_hit_area.removeEventListener("mouseover",mouseOver,false);
}else if(_element_hit_area.detachEvent){
_element_hit_area.detachEvent("onmouseover",mouseOver);
}
}
// ------------------------------
// タッチスタートイベントを追加(内部用)
// ------------------------------
function addEventTouchStart(){
removeEventTouchStart();
if(_element_hit_area.addEventListener){
//_element_hit_area.addEventListener("touchstart",touchStart,false);
}
}
// ------------------------------
// タッチスタートイベントを外す(内部用)
// ------------------------------
function removeEventTouchStart(){
if(_element_hit_area.removeEventListener){
//_element_hit_area.removeEventListener("touchstart",touchStart,false);
}
}
// ------------------------------
// マウスオーバーイベント(内部用)
// ------------------------------
function mouseOver(e){
// マウス入力を更新
input_mouse.setMouseEvent(e);
// タスクを生成
createTask();
}
// ------------------------------
// タッチスタートイベント(内部用)
// ------------------------------
function touchStart(e){
// タッチ入力を更新
input_touch.setTouchEvent(e);
// タスクを生成
createTask();
}
// ------------------------------
// マウスムーブ(内部用)
// ------------------------------
function mouseMove(){
if(!_task) return;
var work = _task.getUserWork();
var hit = ElementHitTestPosition(_element_hit_area,input_mouse.getPositionClient(),true);
if(!input_mouse.getEnableMouse()){
hit = false;
}
if(!hit){
releaseTask();
}
}
// ------------------------------
// タスク生成(内部用)
// ------------------------------
function createTask(){
if(!_task){
_hittest = true;
ElementFocus(_element);
ElementSetNotify(_element,_notify);
_task = task_container.createTask();
_task.setDestructorFunc(function(){
_hittest = false;
ElementBlur(_element);
_task = null;
});
_task.setExecuteFunc(function(){
mouseMove();
});
_task.execute(0xffffffff);
}
}
// ------------------------------
// タスク破棄(内部用)
// ------------------------------
function releaseTask(){
if(_task){
_task.release();
_task = null;
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element_hit_area;
var _notify;
var _task;
var _hittest;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element_hit_area = null;
_notify = NotifyProgress.NOTIFY_TYPE_UNKNOWN;
_task = null;
_hittest = false;
})();
return _element;
};
// ------------------------------
// アクティブ
// ------------------------------
function ElementFocus(element){
_active = element;
if(!_task){
// タスクを生成
_task = task_container.createTask();
_task.setDestructorFunc(NotifyIconDestructor);
_task.setExecuteFunc(NotifyIconInitialize);
_task.execute(0xffffffff);
}else{
_task.setExecuteFunc(NotifyIconFadeIn);
}
}
// ------------------------------
// 非アクティブ
// ------------------------------
function ElementBlur(element){
if(element != _active) return;
if(_task){
_task.setExecuteFunc(NotifyIconFadeOut);
}
}
// ------------------------------
// 通知をセット
// ------------------------------
function ElementSetNotify(element,type){
if(element != _active) return;
if(_notify == type) return;
switch(type){
case NotifyProgress.NOTIFY_TYPE_LOADING:
_icon.src = "data:image/gif;base64,R0lGODlhGAAYALMAAP//3vf31sXFtYyMjHuEjGNrc0pSY0JKUv///wAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCAAIACwAAAAAGAAYAAAEexDJSZExNetpQsBbRVQHABwhNQgFVZ6pRAhA0EovGiNFUN+dz07Sq4Euw0lRl6wYmM2o5nk4gFJUq8VnEoY6JiO4e51yjZaqNpYtS7FQlzuzzJRsoaIXuf1p9EAeIIAiNHg4JkxFAiMqLC6JFAUCAxqNEzkiSUFzTXwhEQAh+QQJCAAIACwAAAAAFgAYAAAEfxDJSZExNWsbAt4TUR0AcFQiNQgFRZpUIQyhAASt9J5SEQCCFMJ3yxk6HyKuovxcJMeihshzSTeG6ugD6mayhwPXC/2VPORJ9Dwmg8XpuByqdbVjvzqCtMw0oU4/fRNKRkg9gjkIBDaDO4Q/QRMrinslWjI0FEI6lyhuh3OAIBEAIfkECQgACAAsAAAAABgAGAAABHoQyUmRMTXraULAW0VUBwAcojYIBVWeVCEMogAErfSiUhEAglHsh5N0Pj1iruK7gS5GZajJc92WG0OVBAp5vdrDoRsKjy0/E7KcdnZMTnAbaSZnxeevXqPdb6h+TERPdlNSaGteBDZFOiZbIStYO35CE5SBFEeFgVBeEQAh+QQJCAAIACwAAAAAGAAWAAAEexDJSZExNetpQsBbRVQHAByiNggFVZ5UIQyiAASt9KJSEQCCUeyHk3Q+PWKu4ruBLkZlqMlz3ZYbQ5UECnm92sOhGwqPLT8Tspx2dkxOcBtpJmfF569eo93kpz9bOleAcRVvRRlNiYpSFAQ2jBpNQRUrWBsyNBlCep0IEQAh+QQJCAAIACwAAAAAGAAYAAAEeRDJSZExNetpQsBbRVQHAByiNggFVZ5UIQyiAASt9KJSEQCCUeyHk3Q+PWKu4ruBLkZlqMlz3ZYbQ5UECnm92sOhGwqPLT8Tspx2dkxOcBtpJmfF569+77LzdVd/Fk9Se0cgTUV6OxNNQYsmWzI0kDAUQnqHghVQXhEAIfkECQgACAAsAgAAABYAGAAABH0QyTmNoThTE8LVFIEdAHBgIjUIBUWaVCEMEyEAQSu9p1QEAEEK8cPpOB4fMIcpJhEWCceoKfZcVJDhOvqAvuDw5kD2iqHA0vM8VZvF2/J5vgUd3jEgd5dtLj9RaH1KWUgfTjoINn08E0VCEyuJCI2OMygjJXtDX4ZzGIFfEQAh+QQJCAAIACwAAAAAGAAYAAAEfBDJSZExNetpQsBbKB0AcFSESJEmVQiDOpanVASAkKrdZ+OBgkxyIQKFwwopmNQcQM2k4UCFhqZVC67ku24Bn04JbM2IuRjsU6YuR0XTzVp0aynBSE29W9Ti9UdGXXt5EgQCfzN2CHU6FQMChSw1NjAaOxOTKFIebk19IREAIfkECQgACAAsAAACABgAFgAABHgQSUSmvbLiIQrGhTBchAAE3icVASBoE3umYIt+cmBghk3XgAPmMFNNDMLPYWdsOpGHpRMBlfYAWF3zmjVwT0zVV1sNG8vTNC85NONa7AnxpsoxvZIr/ZJL9bQIfSQme0RBMS0vFxw/hnEhIxgwEo4kan9uanmZFxEAOw==";
break;
case NotifyProgress.NOTIFY_TYPE_COMPLETE:
_icon.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAA3NCSVQICAjb4U/gAAAAwFBMVEX///+A/4CA/4D///+A/4CA/4CA/4CA/4Dn5+eA/4CA/4CA/4CA/4CA/4CSkpIqWyr5+fng4OB9fX0REREAAAAgSiAxajH6+vrz8/Pw8PDq6urX19fHx8fExMSqqqqnp6ejo6Oenp6ZmZmWlpYtLS0lJSUeHh6Mx4yu564IHAg0RTQ5TTk4STgqNioLIAtxd3FwfXBcdVyP+Y9Ci0ImUibT09O7u7uJiYmCgoJ6enpsbGxgYGBHR0c+Pj42NjYnJyeRSLVtAAAAQHRSTlMA7iL/iFUzRP8Rd6rdzP/u///////M7v////////////////////8iM3eZqqq7u8zd3e7u7v//////////////aE0y2QAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDcvMTOlb7SWAAAA4UlEQVQokZ3R1xKCMBAFUNJIKFawF6zYe+///1dmJaA4vOh9PDczm9nVtH9jYBUj7ljnnMlwruO4M5O+YjJ9GHNq2UjGtig7ea3721NI5Vgn5OAGcz/dKxORd4MfYG5aocvnIu1yrApqK6+BO4WwYFR57uVFyr4K8I5fRFGxXEldowZ4L4OiolVrdGWzJ4S0waNisSuVyqIpvXoFt2k4/JHLEoi4bGGUZarCGN8q0Ii8A56iTFcrxtNzBdwNPVownnSz1bSzCZb4uXg8a7b7BbX2+EH8/jzpUJo2GCWf9oc8AZktDpWygbAkAAAAAElFTkSuQmCC";
break;
case NotifyProgress.NOTIFY_TYPE_ERROR:
_icon.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAA3NCSVQICAjb4U/gAAAAwFBMVEX/////VVX3UlJNbGyULi4mDw86GhoMERHoTEzPRET/pqb/ZmZ0MTGZMzN0JCQYIiIMERH/xcWfqqrDWVnUS0u+T0+SPz9sQkJ6OTkRGBj84ODzZmboWVl3YmJhIiJMIiJBIiIGCAgRGBiIv79okpIuQUEGCAjk///N9va66enW3Ny11tb/trbqkpKOm5u7hYWGfHyycXFZfHzgVFSsX1+cTk6xQUF3SEhTTExSOzt5JCRiKysXCAh/srIRGBgpOTlzKqofAAAAQHRSTlMA///////////////////M3f//////////3f////////+ZzN3d3d3/////////////////////////////mZnMlM/YUAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDcvMTOlb7SWAAABLElEQVQokV2SZ2OCMBCG7yCJQAEBqWKdbUVbtzg6tPX//6teBiK9T8n75HYAjNmTwpYGdXtdzOOl53mrzSC/199n8QNq6x2+Kv3tqZSl7f2a7gw558J3LbTSs4mj3g+f1UW0ibhjlXem4hgAzQzRYl06LWIV2R39anI90oVcfubkkNKrNGtq8tlDK7RhQg6nqQgodEl2iEEExRJRAIxORPwXBbYEGmB7iJxu50cK58uksK4B6EjSliRBZBoIqEh+AytEMwNJ8FhACzGMwN5Q2doFPkiivmk+gsY/oLIzXQ4MWnqOTGbND7Ic08Ja6Y6Yqk77MqnZQir174sJTQT7u+06SVpK5+VCOnur2pMT3nQaCHMNchi/3C+9Ow5ZwBgLBZ/++yd21CCLbt/nD9ghFMIF8V9xAAAAAElFTkSuQmCC";
break;
}
_notify = type;
}
// ------------------------------
// マウスムーブ(内部用)
// ------------------------------
function mouseMove(){
if(!_task) return;
var work = _task.getUserWork();
var mouse_pos = input_mouse.getPositionClient();
_icon.style.left = (mouse_pos.x - 24.0/2.0) + "px";
_icon.style.top = (mouse_pos.y - 24.0-2.0) + "px";
}
// ------------------------------
// 初期化(内部用)
// ------------------------------
function NotifyIconInitialize(task){
var work = task.getUserWork();
work.anime_pos = 0.0;
work.anime_spd = 0.0;
// 最前面に配置
_icon.style.zIndex = 0x7FFFFFFF;
_icon.style.position = "fixed";
_icon.style.pointerEvents = "none";
document.body.appendChild(_icon);
task.setExecuteFunc(NotifyIconFadeIn);
task.execute(0xffffffff);
}
// ------------------------------
// デストラクタ(内部用)
// ------------------------------
function NotifyIconDestructor(task){
DomNodeRemove(_icon);
_task = null;
}
// ------------------------------
// フェードイン(内部用)
// ------------------------------
function NotifyIconFadeIn(task){
var work = task.getUserWork();
// マウスムーブ
mouseMove();
var sub = 1.0 - work.anime_pos;
sub *= 0.4;
if(sub > 0.0){
work.anime_spd += 0.05;
if(work.anime_spd > 0.2) work.anime_spd = 0.2;
if(work.anime_spd > sub) work.anime_spd = sub;
}
work.anime_pos += work.anime_spd;
if(work.anime_pos > 0.999){
work.anime_spd = 0.0;
work.anime_pos = 1.0;
task.setExecuteFunc(NotifyIconShowInit);
}
_icon.style.opacity = work.anime_pos;
}
// ------------------------------
// 表示(内部用)
// ------------------------------
function NotifyIconShowInit(task){
var work = task.getUserWork();
work.anime_pos = 1.0;
work.anime_spd = 0.0;
_icon.style.opacity = work.anime_pos;
task.setExecuteFunc( NotifyIconShowExec);
task.execute(0xffffffff);
}
function NotifyIconShowExec(task){
var work = task.getUserWork();
// マウスムーブ
mouseMove();
}
// ------------------------------
// フェードアウト(内部用)
// ------------------------------
function NotifyIconFadeOut(task){
var work = task.getUserWork();
// マウスムーブ
mouseMove();
var sub = 0.0 - work.anime_pos;
sub *= 0.4;
if(sub < 0.0){
work.anime_spd -= 0.2;
if(work.anime_spd < sub) work.anime_spd = sub;
}
work.anime_pos += work.anime_spd;
if(work.anime_pos < 0.001){
work.anime_spd = 0.0;
work.anime_pos = 0.0;
task.setExecuteFunc(NotifyIconClose);
}
_icon.style.opacity = work.anime_pos;
}
// ------------------------------
// 閉じる(内部用)
// ------------------------------
function NotifyIconClose(task){
var work = task.getUserWork();
task.release();
}
// ------------------------------
// プライベート変数
// ------------------------------
var _icon;
var _active;
var _notify;
var _task;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_icon = DocumentCreateElement("img");
_notify = NotifyProgress.NOTIFY_TYPE_UNKNOWN;
})();
}
NotifyProgress.NOTIFY_TYPE_UNKNOWN = 0;
NotifyProgress.NOTIFY_TYPE_LOADING = 1;
NotifyProgress.NOTIFY_TYPE_COMPLETE = 2;
NotifyProgress.NOTIFY_TYPE_ERROR = 3;
NotifyProgress.NOTIFY_TYPE_RELEASE = 4;
// ------------------------------
// ダブルタッチ補助
// ------------------------------
function DoubleTouchAssist(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function (){
if(_task){
_task.release();
}
_line = null;
};
// ------------------------------
// 表示開始
// ------------------------------
_this.setShow = function (pos,vec){
if(_task){
_task.release();
_task = null;
}
_task = task_container.createTask();
_task.setDestructorFunc(AssistLineDestructor);
_task.setExecuteFunc(AssistLineInitialize);
var work = _task.getUserWork();
work.pos = pos;
work.vec = vec;
_task.execute(0xffffffff);
};
// ------------------------------
// 初期化(内部用)
// ------------------------------
function AssistLineInitialize(task){
var work = task.getUserWork();
var style = _line.style;
style.left = "0px";
style.top = "0px";
style.width = "0px";
document.body.appendChild(_line);
var pos = work.pos;
var vec = work.vec;
var bounding_size = ElementGetBoundingClientRect(_line);
var x = vec.x * 0.5;
var y = vec.y * 0.5;
var r = Math.atan2(vec.y,vec.x);
var w = Math.sqrt(vec.x * vec.x + vec.y * vec.y);
style.left = (pos.x - bounding_size.left - x - (w * 0.5)) + "px";
style.top = (pos.y - bounding_size.top - 0 - y) + "px";
style.width = (w) + "px";
style.transform = style.MozTransform = style.webkitTransform = "rotate(" + (r) + "rad)";
style.opacity = 0.5;
work.anime_pos = 0.0;
work.anime_spd = 0.0;
task.setExecuteFunc(AssistLineShowInit);
task.execute(0xffffffff);
}
// ------------------------------
// デストラクタ(内部用)
// ------------------------------
function AssistLineDestructor(task){
DomNodeRemove(_line);
_task = null;
}
// ------------------------------
// 表示(内部用)
// ------------------------------
function AssistLineShowInit(task){
var work = task.getUserWork();
work.frame = 30;
task.setExecuteFunc( AssistLineShowExec);
task.execute(0xffffffff);
}
function AssistLineShowExec(task){
var work = task.getUserWork();
work.frame -= 1;
if(work.frame < 0){
task.setExecuteFunc(AssistLineFadeOutInit);
}
}
// ------------------------------
// フェードアウト(内部用)
// ------------------------------
function AssistLineFadeOutInit(task){
var work = task.getUserWork();
work.anime_pos = 1.0;
work.anime_spd = 0.0;
task.setExecuteFunc( AssistLineFadeOutExec);
task.execute(0xffffffff);
}
function AssistLineFadeOutExec(task){
var work = task.getUserWork();
var sub = 0.0 - work.anime_pos;
sub *= 0.5;
if(sub < 0.0){
work.anime_spd -= 0.25;
if(work.anime_spd < sub) work.anime_spd = sub;
}
work.anime_pos += work.anime_spd;
if(work.anime_pos < 0.01){
work.anime_spd = 0.0;
work.anime_pos = 0.0;
task.setExecuteFunc(AssistLineClose);
}
_line.style.opacity = work.anime_pos * 0.5;
}
// ------------------------------
// 閉じる(内部用)
// ------------------------------
function AssistLineClose(task){
var work = task.getUserWork();
task.release();
}
// ------------------------------
// プライベート変数
// ------------------------------
var _line;
var _task;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_line = DocumentCreateElement("div");
_line.style.cssText = "height:2px; border:1px solid #000; background:#FFF; border-radius:2px; box-shadow:0px 0px 2px #888;";
_line.style.zIndex = 0x7FFFFFFF;
_line.style.position = "absolute";
_line.style.pointerEvents = "none";
})();
}
// ------------------------------
// 可視制限コンテナ(数指定)
// ------------------------------
function ElementLimiterByCount(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
while(_use_list != _use_list._next){
_use_list._next.release();
}
while(_rest_list != _rest_list._next){
_rest_list._next.release();
}
};
// ------------------------------
// 要素生成
// ------------------------------
_this.createElement = function(){
var _element = new Object();
// ------------------------------
// 開放
// ------------------------------
_element.release = function(){
_element.remove();
removeObserver();
ElementRemove(_element);
_count -= 1;
};
// ------------------------------
// 当たり判定用エレメントをセット
// ------------------------------
_element.setElementHitArea = function(element){
_element._element_hit_area = element;
};
// ------------------------------
// アタッチイベント
// ------------------------------
_element.onattach = function(){};
// ------------------------------
// リムーブイベント
// ------------------------------
_element.onremove = function(){};
// ------------------------------
// アタッチ
// ------------------------------
_element.attach = function(){
if(!(_element._use)){
_element._use = true;
_use_count += 1;
ElementAttachUseList(_element);
removeObserver();
_element.onattach();
}
};
// ------------------------------
// リムーブ
// ------------------------------
_element.remove = function(){
if(_element._use){
_element._use = false;
_use_count -= 1;
ElementAttachRestList(_element);
attachObserver();
if(_element.onremove){
_element.onremove();
}
}
};
// ------------------------------
// 監視開始
// ------------------------------
function attachObserver (){
removeObserver();
if(!_observer_Scroll){
_observer_Scroll = document_observer_scroll.createElement();
_observer_Scroll.setFunction(_element.update);
}
}
// ------------------------------
// 監視終了
// ------------------------------
function removeObserver (){
if(_observer_Scroll){
_observer_Scroll.release();
_observer_Scroll = null;
}
}
// ------------------------------
// 更新
// ------------------------------
_element.update = function(){
if(_use_count < _use_max){
// アタッチ
_element.attach();
}else{
var client_size = DocumentGetClientSize(document);
var r = DomTreeGetBoundingClientRect(_element._element_hit_area);
if(r.right < 0){
}else if(client_size.width < r.left){
}else if(r.bottom < 0){
}else if(client_size.height < r.top){
}else{
if(!_inner){
// 遠い要素を外す
var element_far = getElementFar();
if(element_far){
element_far.remove();
}
// アタッチ
_element.attach();
}
_inner = true;
return;
}
_inner = false;
}
};
// ------------------------------
// プライベート変数
// ------------------------------
var _observer_Scroll;
var _inner;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element._use = false;
_element._prev = _element;
_element._next = _element;
_element._element_hit_area = null;
attachObserver();
ElementAttachRestList(_element);
_inner = false;
_count += 1;
})();
return _element;
};
// ------------------------------
// 使用数を取得
// ------------------------------
_this.getCountUse = function(){
return _use_count;
};
// ------------------------------
// 使用最大数を取得
// ------------------------------
_this.getMaxUse = function(){
return _use_max;
};
// ------------------------------
// 使用最大数をセット
// ------------------------------
_this.setMaxUse = function(v){
_use_max = v;
};
// ------------------------------
// 使用数を取得
// ------------------------------
_this.getCount = function(){
return _count;
};
// ------------------------------
// エレメントを外す(内部用)
// ------------------------------
function ElementRemove(element){
var _prev = element._prev;
var _next = element._next;
_prev._next = _next;
_next._prev = _prev;
element._prev = element;
element._next = element;
}
// ------------------------------
// エレメント未使用リストに登録(内部用)
// ------------------------------
function ElementAttachRestList(element){
ElementRemove(element);
var _prev = _rest_list;
var _next = _prev._next;
_prev._next = element;
_next._prev = element;
element._prev = _prev;
element._next = _next;
element._use = false;
}
// ------------------------------
// エレメント使用リストに登録(内部用)
// ------------------------------
function ElementAttachUseList(element){
ElementRemove(element);
var _prev = _use_list;
var _next = _prev._next;
_prev._next = element;
_next._prev = element;
element._prev = _prev;
element._next = _next;
element._use = true;
}
// ------------------------------
// 一番遠い要素を取得(内部用)
// ------------------------------
function getElementFar(){
var client_size = DocumentGetClientSize(document);
var client_x = client_size.width * 0.5;
var client_y = client_size.height * 0.5;
var element = null;
var distance = 0;
// 使用リスト
var list = _use_list._next;
while(list != _use_list){
var next = list._next;
var r = DomTreeGetBoundingClientRect(list._element_hit_area);
var element_x = (r.left + r.right) * 0.5;
var element_y = (r.top + r.bottom) * 0.5;
var x = element_x - client_x;
var y = element_y - client_y;
var d = x * x + y * y;
if(d > distance){
distance = d;
element = list;
}
list = list._next;
}
return element;
}
// ------------------------------
// プライベート変数
// ------------------------------
var _use_list;
var _rest_list;
var _count;
var _use_count;
var _use_max;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_use_list = new Object();
_rest_list = new Object();
_count = 0;
_use_count = 0;
_use_max = 0;
_use_list._prev = _use_list;
_use_list._next = _use_list;
_rest_list._prev = _rest_list;
_rest_list._next = _rest_list;
})();
}
// ------------------------------
// 可視制限コンテナ(バイト数指定)
// ------------------------------
function ElementLimiterByByteSize(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
while(_use_list != _use_list._next){
_use_list._next.release();
}
while(_rest_list != _rest_list._next){
_rest_list._next.release();
}
};
// ------------------------------
// 要素生成
// ------------------------------
_this.createElement = function(){
var _element = new Object();
// ------------------------------
// 開放
// ------------------------------
_element.release = function(){
_element.remove();
removeObserver();
ElementRemove(_element);
_count -= 1;
};
// ------------------------------
// プリロード設定をセット
// ------------------------------
_element.setEnablePreload = function(v){
_element._preload = v;
};
// ------------------------------
// 当たり判定用エレメントをセット
// ------------------------------
_element.setElementHitArea = function(element){
_element._element_hit_area = element;
};
// ------------------------------
// サイズをセット
// ------------------------------
_element.setByteSize = function(size){
_element._byte_size = size;
_byte_size_now += size;
};
// ------------------------------
// アタッチイベント
// ------------------------------
_element.onattach = function(){};
// ------------------------------
// リムーブイベント
// ------------------------------
_element.onremove = function(){};
// ------------------------------
// アタッチ
// ------------------------------
_element.attach = function(){
if(!(_element._use)){
_element._use = true;
_use_count += 1;
ElementAttachUseList(_element);
removeObserver();
_element.onattach();
}
};
// ------------------------------
// リムーブ
// ------------------------------
_element.remove = function(){
if(_element._use){
_element._use = false;
_use_count -= 1;
ElementAttachRestList(_element);
attachObserver();
if(_element.onremove){
_element.onremove();
}
_byte_size_now -= _element._byte_size;
_element._byte_size = 0;
}
};
// ------------------------------
// 監視開始
// ------------------------------
function attachObserver (){
removeObserver();
if(!_observer_Scroll){
_observer_Scroll = document_observer_scroll.createElement();
_observer_Scroll.setFunction(_element.update);
}
}
// ------------------------------
// 監視終了
// ------------------------------
function removeObserver (){
if(_observer_Scroll){
_observer_Scroll.release();
_observer_Scroll = null;
}
}
// ------------------------------
// 更新
// ------------------------------
_element.update = function(){
var preload = false;
if(_element._preload){
if(!_limit){
preload = true;
}
}
if(preload){
// アタッチ
_element.attach();
}else{
var client_size = DocumentGetClientSize(document);
var r = DomTreeGetBoundingClientRect(_element._element_hit_area);
if(r.right < 0){
}else if(client_size.width < r.left){
}else if(r.bottom < 0){
}else if(client_size.height < r.top){
}else{
if(!_inner){
// 古いデータを破棄
_this.removeOldElements();
// アタッチ
_element.attach();
}
_inner = true;
return;
}
_inner = false;
}
};
// ------------------------------
// プライベート変数
// ------------------------------
var _observer_Scroll;
var _inner;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element._use = false;
_element._byte_size = 0;
_element._prev = _element;
_element._next = _element;
_element._element_hit_area = null;
_element.setEnablePreload(true);
attachObserver();
ElementAttachRestList(_element);
_inner = false;
_count += 1;
})();
return _element;
};
// ------------------------------
// 古い要素を破棄
// ------------------------------
_this.removeOldElements = function(){
if(!_enable_unload) return;
if(_byte_size_now > _byte_size_max){
_limit = true;
var client_size = DocumentGetClientSize(document);
var list = _use_list._prev;
do {
if(list == _use_list) return;
var r = DomTreeGetBoundingClientRect(list._element_hit_area);
if(r.right < 0){
}else if(client_size.width < r.left){
}else if(r.bottom < 0){
}else if(client_size.height < r.top){
}else{
list = list._prev;
continue;
}
list = list._prev;
list._next.remove();
} while(_byte_size_now > _byte_size_max);
}
};
// ------------------------------
// 使用数を取得
// ------------------------------
_this.getCountUse = function(){
return _use_count;
};
// ------------------------------
// 現在の使用バイト数を取得
// ------------------------------
_this.getByteSizeNow = function(){
return _byte_size_now;
};
// ------------------------------
// 使用最大バイト数をセット
// ------------------------------
_this.setByteSizeMax = function(v){
_byte_size_max = v * 1024 * 1024;
};
// ------------------------------
// アンロード設定のセット
// ------------------------------
_this.setEnableUnload = function(v){
_enable_unload = v;
};
// ------------------------------
// 使用数を取得
// ------------------------------
_this.getCount = function(){
return _count;
};
// ------------------------------
// エレメントを外す(内部用)
// ------------------------------
function ElementRemove(element){
var _prev = element._prev;
var _next = element._next;
_prev._next = _next;
_next._prev = _prev;
element._prev = element;
element._next = element;
}
// ------------------------------
// エレメント未使用リストに登録(内部用)
// ------------------------------
function ElementAttachRestList(element){
ElementRemove(element);
var _prev = _rest_list;
var _next = _prev._next;
_prev._next = element;
_next._prev = element;
element._prev = _prev;
element._next = _next;
element._use = false;
}
// ------------------------------
// エレメント使用リストに登録(内部用)
// ------------------------------
function ElementAttachUseList(element){
ElementRemove(element);
var _prev = _use_list;
var _next = _prev._next;
_prev._next = element;
_next._prev = element;
element._prev = _prev;
element._next = _next;
element._use = true;
}
// ------------------------------
// プライベート変数
// ------------------------------
var _use_list;
var _rest_list;
var _count;
var _use_count;
var _byte_size_now;
var _byte_size_max;
var _enable_unload;
var _limit;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_use_list = new Object();
_rest_list = new Object();
_count = 0;
_use_count = 0;
_byte_size_now = 0;
_byte_size_max = 0;
_limit = false;
_use_list._prev = _use_list;
_use_list._next = _use_list;
_rest_list._prev = _rest_list;
_rest_list._next = _rest_list;
})();
}
// ------------------------------
// イベントディスパッチャー
// ------------------------------
function EventDispatcher(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_this.removeAll();
};
// ------------------------------
// イベントハンドラ生成
// ------------------------------
_this.createEventHandler = function(name){
var _event_handler = new Object();
// ------------------------------
// 開放
// ------------------------------
_event_handler.release = function(){
var _prev = _event_handler._prev;
var _next = _event_handler._next;
_prev._next = _next;
_next._prev = _prev;
_event_handler._prev = _event_handler;
_event_handler._next = _event_handler;
var list = _dictionary[name];
if(list){
if(list == list._next){
ObjectDeleteProperty(_dictionary,name);
}
}
};
// ------------------------------
// 関数を登録
// ------------------------------
_event_handler.setFunction = function(func){
_event_handler._func = func;
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
_event_handler._func = null;
_event_handler._prev = _event_handler;
_event_handler._next = _event_handler;
var list = _dictionary[name];
if(!list){
list = new Object();
list._prev = list;
list._next = list;
_dictionary[name] = list;
}
var _next = list;
var _prev = _next._prev;
_prev._next = _event_handler;
_next._prev = _event_handler;
_event_handler._prev = _prev;
_event_handler._next = _next;
})();
return _event_handler;
};
// ------------------------------
// 発火
// ------------------------------
_this.dispatchEvent = function(name,param){
var list = _dictionary[name];
if(!list) return;
var a = new Array();
var handler = list._next;
while(list != handler){
a.push(handler);
handler = handler._next;
}
var i;
var num = a.length;
for(i=0;i<num;i++){
var handler = a[i];
if(handler._func){
handler._func(param);
}
}
};
// ------------------------------
// すべてのイベントハンドラを外す
// ------------------------------
_this.removeAll = function(){
for(var p in _dictionary){
var list = _dictionary[p];
while(true){
var handler = list._next;
if(list == handler) break;
handler.release();
}
}
};
// ------------------------------
// プライベート変数
// ------------------------------
var _dictionary;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_dictionary = new Object();
})();
}
// ------------------------------
// スクロール補正
// ------------------------------
function DocumentReviseScroll(){
var _this = this;
// ------------------------------
// エレメントの挿入直前に実行
// ------------------------------
_this.executeAttachElementBefore = function(element){
update();
};
// ------------------------------
// エレメントの挿入直後に実行
// ------------------------------
_this.executeAttachElementAfter = function(element){
var bounding_size = DomTreeGetBoundingClientRect(element);
_enable_revise_x = (bounding_size.right < 0) ? true : false;
_enable_revise_y = (bounding_size.bottom < 0) ? true : false;
revise();
};
// ------------------------------
// エレメントのリムーブ直前に実行
// ------------------------------
_this.executeRemoveElementBefore = function(element){
var bounding_size = DomTreeGetBoundingClientRect(element);
_enable_revise_x = (bounding_size.right < 0) ? true : false;
_enable_revise_y = (bounding_size.bottom < 0) ? true : false;
update();
};
// ------------------------------
// エレメントのリムーブ直後に実行
// ------------------------------
_this.executeRemoveElementAfter = function(element){
revise();
};
// ------------------------------
// 更新
// ------------------------------
function update(){
_scroll_pos = WindowGetScrollPosition(window);
_document_size = DocumentGetDocumentSize(document);
}
// ------------------------------
// 補正
// ------------------------------
function revise(){
var vec = {x:0,y:0};
var document_size = DocumentGetDocumentSize(document);
if(_enable_revise_x){
var sub_x = document_size.width - _document_size.width;
vec.x = sub_x;
WindowSetScrollPositionX(window,_scroll_pos.x + sub_x);
}
if(_enable_revise_y){
var sub_y = document_size.height - _document_size.height;
vec.y = sub_y;
WindowSetScrollPositionY(window,_scroll_pos.y + sub_y);
}
// イベント発火
page_expand_event_dispatcher.dispatchEvent("revise_scroll",vec);
}
// ------------------------------
// プライベート変数
// ------------------------------
var _scroll_pos;
var _document_size;
var _enable_revise_x;
var _enable_revise_y;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_enable_revise_x = false;
_enable_revise_y = false;
update();
})();
}
// ------------------------------
// マウス入力
// ------------------------------
function InputMouse(window_obj){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(!_mouse_input_func) return;
if(_document_obj.removeEventListener){
_document_obj.removeEventListener("mousemove",mouse_move_func,true);
_document_obj.removeEventListener("mouseout",mouse_out_func,true);
_document_obj.removeEventListener("mousedown",mouse_down_func,true);
_document_obj.removeEventListener("mouseup",mouse_up_func,true);
_document_obj.removeEventListener("dragstart",mouse_down_func,true);
_document_obj.removeEventListener("drag",mouse_move_func,true);
_document_obj.removeEventListener("dragend",mouse_up_func,true);
window_obj.removeEventListener("blur",blur_func);
}else if(_document_obj.detachEvent){
_document_obj.detachEvent("onmousemove",mouse_move_func);
_document_obj.detachEvent("onmouseout",mouse_out_func,true);
_document_obj.detachEvent("onmousedown",mouse_down_func);
_document_obj.detachEvent("onmouseup",mouse_up_func);
_document_obj.detachEvent("ondragstart",mouse_down_func);
_document_obj.detachEvent("ondrag",mouse_move_func);
_document_obj.detachEvent("ondragend",mouse_up_func);
window_obj.detachEvent("onblur",blur_func);
}
_mouse_input_func = null;
};
// ------------------------------
// マウスイベントをセット
// ------------------------------
_this.setMouseEvent = function(e){
if(!_mouse_input_func) return;
mouse_move_func(e);
};
// ------------------------------
// マウス操作をセット
// ------------------------------
_this.setInputMouse = function(input_mouse){
_buttons = input_mouse.getButtons();
_key_shift = input_mouse.getKeyShift();
_key_ctrl = input_mouse.getKeyCtrl();
_enable_mouse = input_mouse.getEnableMouse();
}
// ------------------------------
// タッチ操作をセット
// ------------------------------
_this.setInputTouch = function(input_touch){
if(!_mouse_input_func) return;
if(!input_touch.getEnableTouch()){
_buttons = 0x00;
}
_pos_client = input_touch.getPositionAverage();
}
// ------------------------------
// 座標を取得
// ------------------------------
_this.getPositionClient = function(){
return ObjectCopy(_pos_client);
};
// ------------------------------
// ボタンの押下状態を取得
// ------------------------------
_this.getButtons = function(){
return _buttons;
};
// ------------------------------
// 左ボタンの押下状態を取得
// ------------------------------
_this.getButtonLeft = function(){
return (_buttons & 0x01) ? true:false;
};
// ------------------------------
// 右ボタンの押下状態を取得
// ------------------------------
_this.getButtonRight = function(){
return (_buttons & 0x02) ? true:false;
};
// ------------------------------
// 中央ボタンの押下状態を取得
// ------------------------------
_this.getButtonCenter = function(){
return (_buttons & 0x04) ? true:false;
};
// ------------------------------
// Shift キーの押下状態を取得
// ------------------------------
_this.getKeyShift = function(){
return _key_shift;
};
// ------------------------------
// Ctrl キーの押下状態を取得
// ------------------------------
_this.getKeyCtrl = function(){
return _key_ctrl;
};
// ------------------------------
// マウスが有効か調べる
// ------------------------------
_this.getEnableMouse = function(){
return _enable_mouse;
};
// ------------------------------
// マウス移動(内部用)
// ------------------------------
function mouse_move_func(e){
_enable_mouse = true;
_mouse_input_func(e,false);
}
// ------------------------------
// マウスアウト(内部用)
// ------------------------------
function mouse_out_func(e){
// クライアントサイズ
var client_size = DocumentGetClientSize(document);
if(e.clientX < 0) _enable_mouse = false;
if(e.clientY < 0) _enable_mouse = false;
if(e.clientX >= client_size.width ) _enable_mouse = false;
if(e.clientY >= client_size.height) _enable_mouse = false;
_mouse_input_func(e,false);
}
// ------------------------------
// マウスボタンダウン(内部用)
// ------------------------------
function mouse_down_func(e){
_mouse_input_func(e,false);
}
// ------------------------------
// マウスボタンアップ(内部用)
// ------------------------------
function mouse_up_func(e){
_mouse_input_func(e,true);
}
// ------------------------------
// 非アクティブ(内部用)
// ------------------------------
function blur_func(e){
_buttons = 0x00;
_key_shift = false;
_key_ctrl = false;
//_enable_mouse = false;
}
// ------------------------------
// プライベート変数
// ------------------------------
var _document_obj;
var _pos_client;
var _buttons;
var _key_shift;
var _key_ctrl;
var _enable_mouse;
var _mouse_input_func;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_document_obj = window_obj.document;
_pos_client = new Object();
_pos_client.x = -1;
_pos_client.y = -1;
_buttons = 0x00;
_key_shift = false;
_key_ctrl = false;
_enable_mouse = false;
var event_type_down = { "mousedown":true , "dragstart":true };
var event_type_move = { "mousemove":true , "drag":true };
var event_type_up = { "mouseup":true , "dragend":true };
if(_document_obj.addEventListener){
_document_obj.addEventListener("mousemove",mouse_move_func,true);
_document_obj.addEventListener("mouseout",mouse_out_func,true);
_document_obj.addEventListener("mousedown",mouse_down_func,true);
_document_obj.addEventListener("mouseup",mouse_up_func,true);
_document_obj.addEventListener("dragstart",mouse_down_func,true);
_document_obj.addEventListener("drag",mouse_move_func,true);
_document_obj.addEventListener("dragend",mouse_up_func,true);
window_obj.addEventListener("blur",blur_func);
_mouse_input_func = function(e,r){
if(e.buttons !== undefined){
_buttons = e.buttons;
}
if(event_type_down[e.type]){
if(e.button == 0) _buttons |= 0x01;
if(e.button == 1) _buttons |= 0x04;
if(e.button == 2) _buttons |= 0x02;
}else if(event_type_up[e.type]){
if(e.button == 0) _buttons &= ~0x01;
if(e.button == 1) _buttons &= ~0x04;
if(e.button == 2) _buttons &= ~0x02;
}
_pos_client.x = e.clientX;
_pos_client.y = e.clientY;
_key_shift = e.shiftKey;
_key_ctrl = e.ctrlKey;
};
}else if(_document_obj.attachEvent){
_document_obj.attachEvent("onmousemove",mouse_move_func);
_document_obj.attachEvent("onmouseout",mouse_out_func,true);
_document_obj.attachEvent("onmousedown",mouse_down_func);
_document_obj.attachEvent("onmouseup",mouse_up_func);
_document_obj.attachEvent("ondragstart",mouse_down_func);
_document_obj.attachEvent("ondrag",mouse_move_func);
_document_obj.attachEvent("ondragend",mouse_up_func);
window_obj.attachEvent("onblur",blur_func);
_mouse_input_func = function(e,r){
if(event_type_up[e.type]){
_buttons &= ~(e.button);
}else{
_buttons = (e.button);
}
_pos_client.x = e.clientX;
_pos_client.y = e.clientY;
_key_shift = e.shiftKey;
_key_ctrl = e.ctrlKey;
};
}
})();
}
// ------------------------------
// タッチ入力
// ------------------------------
function InputTouch(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(document.removeEventListener){
document.removeEventListener("touchstart",touch_move_func,true);
document.removeEventListener("touchmove",touch_move_func,true);
document.removeEventListener("touchend",touch_end_func,true);
document.removeEventListener("touchcancel",touch_end_func,true);
window.removeEventListener("blur",blur_func);
}
if(_event_dispatcher){
_event_dispatcher.release();
_event_dispatcher = null;
}
};
// ------------------------------
// タッチイベントをセット
// ------------------------------
_this.setTouchEvent = function(e){
touch_move_func(e);
};
// ------------------------------
// 平均座標を取得
// ------------------------------
_this.getPositionAverage = function(){
return ObjectCopy(_pos_average);
};
// ------------------------------
// タッチが有効か調べる
// ------------------------------
_this.getEnableTouch = function(){
return _enable_touch;
};
// ------------------------------
// タッチリストを取得する
// ------------------------------
_this.getTouchList = function(){
return _touch_list;
};
// ------------------------------
// イベントハンドラを作成
// ------------------------------
_this.createEventHandler = function(type){
return _event_dispatcher.createEventHandler(type);
};
// ------------------------------
// タッチ入力移動(内部用)
// ------------------------------
function touch_input_func(e){
var touch_list = e.changedTouches;
var i;
var num = touch_list.length;
for(i=0;i<num;i++){
var touch = touch_list[i];
_touch_list[touch.identifier] = touch;
}
var x = 0;
var y = 0;
var count = 0;
num = _touch_list.length;
for(i=0;i<num;i++){
var touch = _touch_list[i];
if(!touch) continue;
x += touch.clientX;
y += touch.clientY;
count ++;
}
if(count){
_pos_average.x = x / count;
_pos_average.y = y / count;
}
}
// ------------------------------
// タッチ移動(内部用)
// ------------------------------
function touch_move_func(e){
_enable_touch = true;
touch_input_func(e);
// イベントを発火
_event_dispatcher.dispatchEvent("update",_this);
}
// ------------------------------
// タッチ終了(内部用)
// ------------------------------
function touch_end_func(e){
touch_input_func(e);
var touch_list = e.changedTouches;
var i;
var num = touch_list.length;
for(i=0;i<num;i++){
var touch = touch_list[i];
_touch_list[touch.identifier] = null;
}
i = _touch_list.length - 1;
while(i >= 0){
if(_touch_list[i]) break;
i --;
}
_touch_list.length = i + 1;
if(!(_touch_list.length)){
_enable_touch = false;
}
// イベントを発火
_event_dispatcher.dispatchEvent("update",_this);
}
// ------------------------------
// 非アクティブ(内部用)
// ------------------------------
function blur_func(e){
_enable_touch = false;
_touch_list.length;
// イベントを発火
_event_dispatcher.dispatchEvent("update",_this);
}
// ------------------------------
// プライベート変数
// ------------------------------
var _pos_average;
var _touch_list;
var _enable_touch;
var _event_dispatcher;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_touch_list = new Array();
_pos_average = new Object();
_pos_average.x = -1;
_pos_average.y = -1;
_enable_touch = false;
_event_dispatcher = new EventDispatcher();
if(document.addEventListener){
document.addEventListener("touchstart",touch_move_func,true);
document.addEventListener("touchmove",touch_move_func,true);
document.addEventListener("touchend",touch_end_func,true);
document.addEventListener("touchcancel",touch_end_func,true);
window.addEventListener("blur",blur_func);
}
})();
}
// ------------------------------
// 仮想マウスポインタ
// ------------------------------
function VirtualMousePointer(document_obj){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_element_active = null;
};
// ------------------------------
// 座標をセット
// ------------------------------
_this.setPosition = function(pos){
_mouse_pos = pos;
mouse_move_func();
};
// ------------------------------
// 移動量を加算
// ------------------------------
_this.addVector = function(vec){
var pos_end = {
x:_mouse_pos.x + vec.x,
y:_mouse_pos.y + vec.y
};
var len = Math.sqrt((vec.x * vec.x) + (vec.y * vec.y))
var size = 1;
var num = Math.floor(len / size);
len = (1 / len) * size;
var vx = vec.x * len;
var vy = vec.y * len;
var i;
for(i=0;i<num;i++){
_mouse_pos.x += vx;
_mouse_pos.y += vy;
mouse_move_func();
}
_mouse_pos = pos_end;
mouse_move_func();
};
// ------------------------------
// マウス移動(内部用)
// ------------------------------
function mouse_move_func(){
var node = document_obj.elementFromPoint(_mouse_pos.x,_mouse_pos.y);
while(node){
var work = analyze_work_dictionary.getAnalyzeWork(node);
if(work){
break;
}
node = node.parentNode;
}
if(node != _element_active){
if(_element_active){
// マウスアウトイベント発行
//var mouse_event = document_obj.createEvent("MouseEvent");
//mouse_event.initMouseEvent("mouseout",false,false,document_obj.defaultView,0,0,0,_mouse_pos.x,_mouse_pos.y,false,false,false,false,0,_element_active);
//_element_active.dispatchEvent (mouse_event);
}
if(node){
// マウスオーバーイベント発行
var mouse_event = document_obj.createEvent("MouseEvent");
mouse_event.initMouseEvent("mouseover",false,false,document_obj.defaultView,0,0,0,_mouse_pos.x,_mouse_pos.y,false,false,false,false,0,node);
node.dispatchEvent (mouse_event);
}
}
_element_active = node;
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element_active;
var _mouse_pos;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element_active = null;
_mouse_pos = new Object();
_mouse_pos.x = -1;
_mouse_pos.y = -1;
})();
}
// ------------------------------
// URLキャッシュ辞書
// ------------------------------
function UrlCacheDictionary(){
var _this = this;
// ------------------------------
// オブジェクトを取得
// ------------------------------
_this.getObject = function(url){
var obj = _dictionary[url];
if(obj){
var prev = obj.prev;
var next = obj.next;
prev.next = next;
next.prev = prev;
prev = _queue;
prev = prev.next;
prev.next = obj;
next.prev = obj;
obj.prev = prev;
obj.next = next;
return obj;
}
obj = new Object();
obj.url = url;
var prev = _queue;
var next = prev.next;
prev.next = obj;
next.prev = obj;
obj.prev = prev;
obj.next = next;
_queue_count ++;
_dictionary[url] = obj;
if(_queue_count >= _queue_max){
var o = _queue.prev;
prev = o.prev;
next = o.next;
prev.next = next;
next.prev = prev;
_queue_count --;
delete _dictionary[o.url];
}
return obj;
};
// ------------------------------
// キャッシュの最大数をセット
// ------------------------------
_this.setCacheMax = function(v){
_queue_max = v;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _dictionary;
var _queue;
var _queue_count;
var _queue_max;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_dictionary = new Object();
_queue = new Object();
_queue.prev = _queue;
_queue.next = _queue;
_queue_count = 0;
_queue_max = 16;
})();
}
// ------------------------------
// 要素管理
// ------------------------------
function ElementAnalyzeManager(element,outsider){
var _this = this;
// ------------------------------
// 解放
// ------------------------------
_this.release = function(){
if(!_element) return;
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
// 解析辞書除外
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
DomNodeRemove(_element);
_element = null;
};
// ------------------------------
// 解析
// ------------------------------
_this.analyze = function(){
// 解析有効化
AnalyzeWorkClearInvalid(_analyze_work);
// 解析開始
execute_queue.attachLastForInsertDomNode(DomNodeAnalyzeRoot,_element);
};
// ------------------------------
// プライベート変数
// ------------------------------
var _element;
var _analyze_work;
var _observer_remove;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element = element;
element = null;
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element);
_observer_remove.setFunction(_this.release);
// 解析ワーク
_analyze_work = analyze_work_dictionary.getAnalyzeWork(_element);
if(_analyze_work){
}else{
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element);
}
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
if(outsider) attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// 解析無効化
AnalyzeWorkSetInvalid(_analyze_work);
})();
}
// ------------------------------
// 解析ワーク作成
// ------------------------------
function AnalyzeWorkCreate(node){
return {
node:node,
modify:1
};
}
// ------------------------------
// 解析ワークから DOM オブジェクトを取得
// ------------------------------
function AnalyzeWorkGetDomNode(work){
return work.node;
}
// ------------------------------
// 解析ワークにアンカー要素を登録
// ------------------------------
function AnalyzeWorkClearAnchorElement(work){ ObjectDeleteProperty(work,"anchor"); }
function AnalyzeWorkSetAnchorElement(work,anchor){ work.anchor = anchor; }
function AnalyzeWorkGetAnchorElement(work){ return work.anchor; }
// ------------------------------
// エレメント監視初期化状況
// ------------------------------
function AnalyzeWorkClearInitializedObserverElement(work){ ObjectDeleteProperty(work,"i_obs"); }
function AnalyzeWorkSetInitializedObserverElement(work){ work.i_obs = true; }
function AnalyzeWorkGetInitializedObserverElement(work){ return work.i_obs; }
// ------------------------------
// アンカーオーバーライド状況
// ------------------------------
function AnalyzeWorkClearOverrodeAnchorElement(work){ ObjectDeleteProperty(work,"o_anc"); }
function AnalyzeWorkSetOverrodeAnchorElement(work){ work.o_anc = true; }
function AnalyzeWorkGetOverrodeAnchorElement(work){ return work.o_anc; }
// ------------------------------
// 「エレメントの置換」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedReplacementToElement(work){ ObjectDeleteProperty(work,"a_rte"); }
function AnalyzeWorkSetAnalyzedReplacementToElement(work){ work.a_rte = true; }
function AnalyzeWorkGetAnalyzedReplacementToElement(work){ return work.a_rte; }
// ------------------------------
// 「テキストの置換」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedReplacementToText(work){ ObjectDeleteProperty(work,"a_rtt"); }
function AnalyzeWorkSetAnalyzedReplacementToText(work){ work.a_rtt = true; }
function AnalyzeWorkGetAnalyzedReplacementToText(work){ return work.a_rtt; }
// ------------------------------
// 「アンカーの置換」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedReplacementToAnchor(work){ ObjectDeleteProperty(work,"a_rta"); }
function AnalyzeWorkSetAnalyzedReplacementToAnchor(work){ work.a_rta = true; }
function AnalyzeWorkGetAnalyzedReplacementToAnchor(work){ return work.a_rta; }
// ------------------------------
// 「ハイパーリンクの置換」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedReplacementToLink(work){ ObjectDeleteProperty(work,"a_rtl"); }
function AnalyzeWorkSetAnalyzedReplacementToLink(work){ work.a_rtl = true; }
function AnalyzeWorkGetAnalyzedReplacementToLink(work){ return work.a_rtl; }
// ------------------------------
// 展開 URL 先を設定
// ------------------------------
function AnalyzeWorkClearExpandUrl(work){ ObjectDeleteProperty(work,"expand_url"); }
function AnalyzeWorkSetExpandUrl(work,url){ work.expand_url = url; }
function AnalyzeWorkGetExpandUrl(work){ return work.expand_url; }
// ------------------------------
// 展開コンテンツタイプを設定
// ------------------------------
function AnalyzeWorkClearExpandContentType(work){ ObjectDeleteProperty(work,"expand_content_type"); }
function AnalyzeWorkAddContentType(work,type){ if(!(work.expand_content_type)){ work.expand_content_type = new Array(); } work.expand_content_type.push(type); }
function AnalyzeWorkGetContentType(work){ if(work.expand_content_type){ return work.expand_content_type; } return []; }
// ------------------------------
// 「ハイパーリンク化の置換」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedMakeLinkToText(work){ ObjectDeleteProperty(work,"a_mlt"); }
function AnalyzeWorkSetAnalyzedMakeLinkToText(work){ work.a_mlt = true; }
function AnalyzeWorkGetAnalyzedMakeLinkToText(work){ return work.a_mlt; }
// ------------------------------
// 「短縮 URL の展開」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandShortUrl(work){ ObjectDeleteProperty(work,"a_esu"); }
function AnalyzeWorkSetAnalyzedExpandShortUrl(work){ work.a_esu = true; }
function AnalyzeWorkGetAnalyzedExpandShortUrl(work){ return work.a_esu; }
// ------------------------------
// 「テキストの展開」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandInlineText(work){ ObjectDeleteProperty(work,"a_eit"); }
function AnalyzeWorkSetAnalyzedExpandInlineText(work){ work.a_eit = true; }
function AnalyzeWorkGetAnalyzedExpandInlineText(work){ return work.a_eit; }
// ------------------------------
// 「イメージのサムネイル展開」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandThumbnailImage(work){ ObjectDeleteProperty(work,"a_eti"); }
function AnalyzeWorkSetAnalyzedExpandThumbnailImage(work){ work.a_eti = true; }
function AnalyzeWorkGetAnalyzedExpandThumbnailImage(work){ return work.a_eti; }
// ------------------------------
// 「イメージのポップアップ展開」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandPopupImage(work){ ObjectDeleteProperty(work,"a_epi"); }
function AnalyzeWorkSetAnalyzedExpandPopupImage(work){ work.a_epi = true; }
function AnalyzeWorkGetAnalyzedExpandPopupImage(work){ return work.a_epi; }
// ------------------------------
// 「ポップアップ」のワーク埋め込み
// ------------------------------
function AnalyzeWorkClearPopupImage(work){ ObjectDeleteProperty(work,"popup_image"); }
function AnalyzeWorkSetPopupImage(work,obj){ work.popup_image = obj; }
function AnalyzeWorkGetPopupImage(work){ return work.popup_image; }
// ------------------------------
// 「サウンドのインライン展開」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandInlineSound(work){ ObjectDeleteProperty(work,"a_eis"); }
function AnalyzeWorkSetAnalyzedExpandInlineSound(work){ work.a_eis = true; }
function AnalyzeWorkGetAnalyzedExpandInlineSound(work){ return work.a_eis; }
// ------------------------------
// 「ビデオのインライン展開」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandInlineVideo(work){ ObjectDeleteProperty(work,"a_eiv"); }
function AnalyzeWorkSetAnalyzedExpandInlineVideo(work){ work.a_eiv = true; }
function AnalyzeWorkGetAnalyzedExpandInlineVideo(work){ return work.a_eiv; }
// ------------------------------
// 「インラインの展開」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandInlineIframe(work){ ObjectDeleteProperty(work,"a_eif"); }
function AnalyzeWorkSetAnalyzedExpandInlineIframe(work){ work.a_eif = true; }
function AnalyzeWorkGetAnalyzedExpandInlineIframe(work){ return work.a_eif; }
// ------------------------------
// 「インラインフレーム内コンテンツ展開」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandIframeContent(work){ ObjectDeleteProperty(work,"a_eic"); }
function AnalyzeWorkSetAnalyzedExpandIframeContent(work){ work.a_eic = true; }
function AnalyzeWorkGetAnalyzedExpandIframeContent(work){ return work.a_eic; }
// ------------------------------
// 「縮小画像のポップアップ」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedPopupReducedImage(work){ ObjectDeleteProperty(work,"a_pri"); }
function AnalyzeWorkSetAnalyzedPopupReducedImage(work){ work.a_pri = true; }
function AnalyzeWorkGetAnalyzedPopupReducedImage(work){ return work.a_pri; }
// ------------------------------
// 「掲示板拡張」の解析状況
// ------------------------------
function AnalyzeWorkClearAnalyzedExpandBbs(work){ ObjectDeleteProperty(work,"a_ebb"); }
function AnalyzeWorkSetAnalyzedExpandBbs(work){ work.a_ebb = true; }
function AnalyzeWorkGetAnalyzedExpandBbs(work){ return work.a_ebb; }
// ------------------------------
// 解析無効化
// ------------------------------
function AnalyzeWorkClearInvalid(work){ ObjectDeleteProperty(work,"a_inv"); }
function AnalyzeWorkSetInvalid(work){ work.a_inv = true; }
function AnalyzeWorkGetInvalid(work){ return work.a_inv; }
// ------------------------------
// 「修正カウンタ」の解析状況
// ------------------------------
function AnalyzeWorkInitializeModifyCount(work){ work.modify = 1; }
function AnalyzeWorkGetModifyCount(work){ return work.modify; }
function AnalyzeWorkAddModifyCount(work){ work.modify += 1; }
function AnalyzeWorkEqualModifyCount(work,modify){ if(work.modify){ return (modify == work.modify); } return (modify == 0); }
// ------------------------------
// イベントディスパッチャーの管理
// ------------------------------
function AnalyzeWorkClearEventDispatcher(work){ ObjectDeleteProperty(work,"event_dispatcher"); }
function AnalyzeWorkSetEventDispatcher(work,event_dispatcher){ work.event_dispatcher = event_dispatcher; }
function AnalyzeWorkGetEventDispatcher(work){ return work.event_dispatcher; }
// ------------------------------
// アンカー監視要素の管理
// ------------------------------
function AnalyzeWorkClearObserverModifyAnchor(work){ ObjectDeleteProperty(work,"observer_modify_anchor"); }
function AnalyzeWorkSetObserverModifyAnchor(work,element){ work.observer_modify_anchor = element; }
function AnalyzeWorkGetObserverModifyAnchor(work){ return work.observer_modify_anchor; }
// ------------------------------
// 掲示板コントロールの管理
// ------------------------------
function AnalyzeWorkClearBbsControl(work){ ObjectDeleteProperty(work,"bbs_control"); }
function AnalyzeWorkSetBbsControl(work,obj){ work.bbs_control = obj; }
function AnalyzeWorkGetBbsControl(work){ return work.bbs_control; }
// ------------------------------
// 要素の基本的な監視化
// ------------------------------
function AnalyzeWorkObserveElement(work){
if(AnalyzeWorkGetInitializedObserverElement(work)) return;
var node = AnalyzeWorkGetDomNode(work);
// 初期化済み
AnalyzeWorkSetInitializedObserverElement(work);
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(work);
// イベントディスパッチャー生成
var event_dispatcher = new EventDispatcher();
AnalyzeWorkSetEventDispatcher(work,event_dispatcher);
// デストラクタ発行
function dispatchDestructor(){
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
if(event_dispatcher){
// イベント発火
event_dispatcher.dispatchEvent("remove",null);
event_dispatcher.dispatchEvent("destructor",null);
}
}
// リムーブ監視
var observer_remove = new DomNodeObserverRemoveFromDocument(node);
observer_remove.setFunction(dispatchDestructor);
// 開放イベント
var event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(dispatchDestructor);
// 破棄イベント
var event_handler = event_dispatcher.createEventHandler("destructor");
event_handler.setFunction(function(){
// 修正カウンタ加算
AnalyzeWorkAddModifyCount(work);
var event_dispatcher = AnalyzeWorkGetEventDispatcher(work);
if(event_dispatcher){
// イベント発火
event_dispatcher.dispatchEvent("release",null);
event_dispatcher.release();
AnalyzeWorkClearEventDispatcher(work);
}
// リムーブ監視を破棄
if(observer_remove){
observer_remove.release();
observer_remove = null;
}
// イベントを破棄
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
// 解析辞書除外
analyze_work_dictionary.removeAnalyzeWork(work);
if(!(window.addEventListener)){
DomNodeClearInserted(node);
}
});
}
// ------------------------------
// 解析辞書登録フラグ
// ------------------------------
function AnalyzeWorkDictionaryAttachOptions(){
var _this = this;
// ------------------------------
// PageExpand 生成ノード
// ------------------------------
_this.SetOutsider = function(){
_this._flag |= ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_OUTSIDER;
};
// ------------------------------
// PageExpand ゲストノード
// ------------------------------
_this.SetGuest = function(){
_this._flag |= ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_GUEST;
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
_this._flag = 0;
})();
}
var ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_OUTSIDER = 0x00000001;
var ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_GUEST = 0x00000002;
var ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_MAX = 2;
// ------------------------------
// 解析辞書
// ------------------------------
function AnalyzeWorkDictionary(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
for(var id in _dictionary){
_this.removeAnalyzeWork(_dictionary[id]);
}
_dictionary = null;
};
// ------------------------------
// 解析ワークを登録
// ------------------------------
_this.attachAnalyzeWork = function(work,attach_options){
if(work.id) return true;
var node = AnalyzeWorkGetDomNode(work);
if(node){
var flag = 0;
if(attach_options){
flag = attach_options._flag;
}
var id = (_identity << ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_MAX) | flag;
_dictionary[id] = work;
_identity += 1;
work.id = id;
node._pageexpand_ = id;
if(node.setAttribute){
node.setAttribute("_pageexpand_",id);
}
return true;
}
return false;
};
// ------------------------------
// 解析ワークを除外
// ------------------------------
_this.removeAnalyzeWork = function(work){
var id = work.id;
if(!id) return false;
try{
ObjectDeleteProperty(_dictionary,id);
ObjectDeleteProperty(work,"id");
}catch(e){}
};
// ------------------------------
// エレメントからオブジェクトを取得
// ------------------------------
_this.getAnalyzeWork = function(node){
var id;
id = node._pageexpand_;
if(id){
var work = _dictionary[parseInt(id)];
if(work){
if(AnalyzeWorkGetDomNode(work) == node){
return work;
}
}
}
return null;
};
// ------------------------------
// クローンであるか確認する
// ------------------------------
_this.verifyClone = function(node){
if(node.getAttribute){
var id = node.getAttribute("_pageexpand_");
if(id){
var id = parseInt(id);
if(id & ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_OUTSIDER){
var work = _dictionary[id];
if(!work) return true;
if(AnalyzeWorkGetDomNode(work) != node){
return true;
}
}
}
}
return false;
};
// ------------------------------
// 解放後の要素であるか確認する
// ------------------------------
_this.verifyRemoved = function(node){
if(node.getAttribute){
var id = node.getAttribute("_pageexpand_");
if(id){
var id = parseInt(id);
var work = _dictionary[id];
if(!work) return true;
if(AnalyzeWorkGetDomNode(work) != node){
return true;
}
}
}
return false;
};
// ------------------------------
// ゲスト要素であるか確認する
// ------------------------------
_this.verifyGuest = function(node){
if(node.getAttribute){
var id = node.getAttribute("_pageexpand_");
if(id){
var id = parseInt(id);
if(id & ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_GUEST){
return true;
}
}
}
return false;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _identity;
var _dictionary;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_identity = 1;
_dictionary = new Array();
})();
}
// ------------------------------
// 掲示板辞書
// ------------------------------
function BbsDictionary(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
for(n in _number_dictionary){
_number_dictionary[n].release();
}
};
// ------------------------------
// フォロー生成
// ------------------------------
function createFollow(follower_response,following_response){
var _follow = new Object();
// ------------------------------
// 開放
// ------------------------------
_follow.release = function(){
var _follower_prev = _follow._follower_prev;
var _follower_next = _follow._follower_next;
_follower_prev._follower_next = _follower_next;
_follower_next._follower_prev = _follower_prev;
_follow._follower_prev = _follow;
_follow._follower_next = _follow;
var _following_prev = _follow._following_prev;
var _following_next = _follow._following_next;
_following_prev._following_next = _following_next;
_following_next._following_prev = _following_prev;
_follow._following_prev = _follow;
_follow._following_next = _follow;
var following = _follow.getResponseFollowing();
if(following){
following.addCountFollower(-1);
}
};
// ------------------------------
// フォロワーレスポンスを取得
// ------------------------------
_follow.getResponseFollower = function(){
return follower_response;
};
// ------------------------------
// フォローイングレスポンスを取得
// ------------------------------
_follow.getResponseFollowing = function(){
return following_response;
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
_follow._follower_prev = _follow;
_follow._follower_next = _follow;
_follow._following_prev = _follow;
_follow._following_next = _follow;
})();
return _follow;
}
// ------------------------------
// レスポンス生成
// ------------------------------
function createResponse(number){
var _response = new Object();
// ------------------------------
// 開放
// ------------------------------
_response.release = function(obj){
if(_released) return;
_released = true;
release();
_analyzed = false;
// フォロワーを開放
var follow = _response._follow;
while(true){
var follower = follow._follower_next;
if(follow == follower) break;
follower.release();
}
// イベント解放
if(_event_dispatcher){
_event_dispatcher.release();
_event_dispatcher = null;
}
// 番号を破棄
delete _number_dictionary[number];
};
// ------------------------------
// レスポンスを消去
// ------------------------------
_response.erase = function(){
// 消去イベント実行
if(_response.onerase){
_response.onerase();
}
release();
};
// ------------------------------
// 開放(内部用)
// ------------------------------
function release(){
// イベントを外す
removeEventRelease();
// オリジナルエレメントをクリア
_response.clearOriginalElements();
// フォローイングをクリア
_response.clearFollowing();
// ID を開放
removeId();
// 名前を開放
removeName();
// ホストを開放
removeHost();
// イベント発火
_event_dispatcher.dispatchEvent("release",null);
}
// ------------------------------
// リリースイベントを追加(内部用)
// ------------------------------
function addEventRelease(){
removeEventRelease();
var i;
var num = _elements_original.length;
for(i=0;i<num;i++){
if(!_observer_remove[i]){
var obj = _elements_original[i];
_observer_remove[i] = new DomNodeObserverRemoveFromDocument(obj.element);
_observer_remove[i].setFunction(_response.release);
}
}
}
// ------------------------------
// リリースイベントを外す(内部用)
// ------------------------------
function removeEventRelease(){
var i;
var num = _elements_original.length;
for(i=0;i<num;i++){
if(_observer_remove[i]){
var obj = _elements_original[i];
// 監視を破棄
_observer_remove[i].release();
_observer_remove[i] = null;
}
}
}
// ------------------------------
// 番号を取得
// ------------------------------
_response.getNumber = function(){
return number;
};
// ------------------------------
// ID を登録(内部用)
// ------------------------------
function attachId(id){
removeId();
var id_list = _id_dictionary[id];
if(!id_list){
id_list = new Object();
id_list._id_prev = id_list;
id_list._id_next = id_list;
_id_dictionary[id] = id_list;
}
var list = id_list._id_prev;
while(list != id_list){
if(_response.getNumber() >= list.getNumber()){
break;
}
list = list._id_prev;
}
var _id_prev = list;
var _id_next = _id_prev._id_next;
_id_prev._id_next = _response;
_id_next._id_prev = _response;
_response._id_prev = _id_prev;
_response._id_next = _id_next;
// カウンタ
addCountId(id,1);
_id = id;
}
// ------------------------------
// ID の登録を外す(内部用)
// ------------------------------
function removeId(){
if(_response != _response._id_next){
// カウンタ
addCountId(_id,-1);
}
var _id_prev = _response._id_prev;
var _id_next = _response._id_next;
_id_prev._id_next = _id_next;
_id_next._id_prev = _id_prev;
_response._id_prev = _response;
_response._id_next = _response;
}
// ------------------------------
// ID を取得
// ------------------------------
_response.getId = function(){
return _id;
};
// ------------------------------
// ID をセット
// ------------------------------
_response.setId = function(id){
attachId(id);
};
// ------------------------------
// 名前を登録(内部用)
// ------------------------------
function attachName(name){
removeName();
var name_list = _name_dictionary[name];
if(!name_list){
name_list = new Object();
name_list._name_prev = name_list;
name_list._name_next = name_list;
_name_dictionary[name] = name_list;
}
var list = name_list._name_prev;
while(list != name_list){
if(_response.getNumber() >= list.getNumber()){
break;
}
list = list._name_prev;
}
var _name_prev = list;
var _name_next = _name_prev._name_next;
_name_prev._name_next = _response;
_name_next._name_prev = _response;
_response._name_prev = _name_prev;
_response._name_next = _name_next;
// カウンタ
addCountName(name,1);
_name = name;
}
// ------------------------------
// 名前の登録を外す(内部用)
// ------------------------------
function removeName(){
if(_response != _response._name_next){
// カウンタ
addCountName(_name,-1);
}
var _name_prev = _response._name_prev;
var _name_next = _response._name_next;
_name_prev._name_next = _name_next;
_name_next._name_prev = _name_prev;
_response._name_prev = _response;
_response._name_next = _response;
}
// ------------------------------
// 名前を取得
// ------------------------------
_response.getName = function(){
return _name;
};
// ------------------------------
// 名前をセット
// ------------------------------
_response.setName = function(name){
attachName(name);
};
// ------------------------------
// ホストを登録(内部用)
// ------------------------------
function attachHost(host){
removeHost();
var host_list = _host_dictionary[host];
if(!host_list){
host_list = new Object();
host_list._host_prev = host_list;
host_list._host_next = host_list;
_host_dictionary[host] = host_list;
}
var list = host_list._host_prev;
while(list != host_list){
if(_response.getNumber() >= list.getNumber()){
break;
}
list = list._host_prev;
}
var _host_prev = list;
var _host_next = _host_prev._host_next;
_host_prev._host_next = _response;
_host_next._host_prev = _response;
_response._host_prev = _host_prev;
_response._host_next = _host_next;
// カウンタ
addCountHost(host,1);
_host = host;
}
// ------------------------------
// ホストの登録を外す(内部用)
// ------------------------------
function removeHost(){
if(_response != _response._host_next){
// カウンタ
addCountHost(_host,-1);
}
var _host_prev = _response._host_prev;
var _host_next = _response._host_next;
_host_prev._host_next = _host_next;
_host_next._host_prev = _host_prev;
_response._host_prev = _response;
_response._host_next = _response;
}
// ------------------------------
// ホストを取得
// ------------------------------
_response.getHost = function(){
return _host;
};
// ------------------------------
// ホストをセット
// ------------------------------
_response.setHost = function(host){
attachHost(host);
};
// ------------------------------
// 解析済みクリア
// ------------------------------
_response.clearAnalyzed = function(){
_analyzed = false;;
};
// ------------------------------
// 解析済みか調べる
// ------------------------------
_response.getAnalyzed = function(){
return _analyzed;
};
// ------------------------------
// 解析済みをセット
// ------------------------------
_response.setAnalyzed = function(){
_analyzed = true;
};
// ------------------------------
// オリジナルエレメントをクリア
// ------------------------------
_response.clearOriginalElements = function(){
// イベントを外す
removeEventRelease();
var i;
var num = _elements_original_work.length;
for(i=0;i<num;i++){
// 解析クリア
AnalyzeWorkClearAnalyzedExpandBbs(_elements_original_work[i]);
// 解析辞書除外
analyze_work_dictionary.removeAnalyzeWork(_elements_original_work[i]);
}
_elements_original.length = 0;
_elements_clone.length = 0;
_elements_original_work.length = 0;
};
// ------------------------------
// オリジナルエレメントを取得
// ------------------------------
_response.getOriginalElements = function(){
return _elements_original;
};
// ------------------------------
// オリジナルエレメントをセット
// ------------------------------
_response.addOriginalElements = function(name,element){
_elements_original.push({name:name,element:element});
// 解析ワーク
var analyze_work = analyze_work_dictionary.getAnalyzeWork(element);
if(analyze_work){
}else{
// 解析ワーク作成
analyze_work = AnalyzeWorkCreate(element);
}
_elements_original_work.push(analyze_work);
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(analyze_work);
// 解析済み
AnalyzeWorkSetAnalyzedExpandBbs(analyze_work);
// 複製して保有
_elements_clone.push({name:name,element:ElementCloneNode(element,true)});
// リリースイベント
addEventRelease();
};
// ------------------------------
// 複製エレメントを取得
// ------------------------------
_response.getCloneElements = function(){
var ary = new Array();
var i;
var num = _elements_clone.length;
for(i=0;i<num;i++){
var obj = _elements_clone[i];
ary.push({name:obj.name,element:ElementCloneNode(obj.element,true)});
}
return ary;
};
// ------------------------------
// フォローイングをクリア
// ------------------------------
_response.clearFollowing = function(){
var follow = _response._follow;
while(true){
var following = follow._following_next;
if(follow == following) break;
following.release();
}
};
// ------------------------------
// フォロワーカウント数取得
// ------------------------------
_response.getCountFollower = function(){
return _follower_count;
};
// ------------------------------
// フォロワーカウント数加算
// ------------------------------
_response.addCountFollower = function(v){
_follower_count += v;
// イベント発火
var event_dispatcher = _follower_counter_event_dictionary[number];
if(event_dispatcher){
event_dispatcher.dispatchEvent("update",_follower_count);
}
};
// ------------------------------
// フォロワー取得
// ------------------------------
_response.getFollower = function(){
var ary = new Array();
var follow = _response._follow._follower_next;
while(follow != _response._follow){
ary.push(follow.getResponseFollower());
follow = follow._follower_next;
}
return ary;
};
// ------------------------------
// フォロワーを加算
// ------------------------------
_response.addFollower = function(target){
var follow = createFollow(target,_response);
var _prev;
var _next;
var list = _response._follow._follower_prev;
while(list != _response._follow){
if(target.getNumber() >= list.getResponseFollower().getNumber()){
break;
}
list = list._follower_prev;
}
_prev = list;
_next = _prev._follower_next;
_prev._follower_next = follow;
_next._follower_prev = follow;
follow._follower_prev = _prev;
follow._follower_next = _next;
_prev = target._follow._following_prev;
_next = _prev._following_next;
_prev._following_next = follow;
_next._following_prev = follow;
follow._following_prev = _prev;
follow._following_next = _next;
_response.addCountFollower(1);
};
// ------------------------------
// イベントディスパッチャーを取得
// ------------------------------
_response.getEventDispatcher = function(){
return _event_dispatcher;
};
// ------------------------------
// 消去イベント
// ------------------------------
_response.onerase = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _id;
var _name;
var _host;
var _analyzed;
var _released;
var _elements_original;
var _elements_original_work;
var _elements_clone;
var _follower_count;
var _observer_remove;
var _event_dispatcher;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_id = null;
_name = null;
_host = null;
_analyzed = false;
_released = false;
_elements_original = new Array();
_elements_original_work = new Array();
_elements_clone = new Array();
_follower_count = 0;
_response._follow = createFollow(null,null);
_response._id_prev = _response;
_response._id_next = _response;
_response._name_prev = _response;
_response._name_next = _response;
_response._host_prev = _response;
_response._host_next = _response;
_observer_remove = new Array();
_event_dispatcher = new EventDispatcher();
})();
return _response;
}
// ------------------------------
// 番号からレスポンスが存在するか調べる
// ------------------------------
_this.getExist = function(number){
if(_number_dictionary[number]){
return true;
}
return false;
};
// ------------------------------
// 番号からレスポンスを取得
// ------------------------------
_this.getResponse = function(number){
var response = _number_dictionary[number];
if(!response){
response = createResponse(number);
_number_dictionary[number] = response;
}
return response;
};
// ------------------------------
// ID からレスポンスを取得
// ------------------------------
_this.getResponsesFromId = function(id){
var ary = new Array();
var id_list = _id_dictionary[id];
if(id_list){
var list = id_list._id_next;
while(list != id_list){
ary.push(list);
list = list._id_next;
}
}
return ary;
};
// ------------------------------
// 名前からレスポンスを取得
// ------------------------------
_this.getResponsesFromName = function(name){
var ary = new Array();
var name_list = _name_dictionary[name];
if(name_list){
var list = name_list._name_next;
while(list != name_list){
ary.push(list);
list = list._name_next;
}
}
return ary;
};
// ------------------------------
// ホストからレスポンスを取得
// ------------------------------
_this.getResponsesFromHost = function(host){
var ary = new Array();
var host_list = _host_dictionary[host];
if(host_list){
var list = host_list._host_next;
while(list != host_list){
ary.push(list);
list = list._host_next;
}
}
return ary;
};
// ------------------------------
// ID カウント用のイベントハンドラを生成
// ------------------------------
_this.createEventHandlerForIdCounter = function(id){
var event_dispatcher = _id_counter_event_dictionary[id];
if(!event_dispatcher){
event_dispatcher = new EventDispatcher();
_id_counter_event_dictionary[id] = event_dispatcher;
}
return event_dispatcher.createEventHandler("update");
};
// ------------------------------
// 名前カウント用のイベントハンドラを生成
// ------------------------------
_this.createEventHandlerForNameCounter = function(name){
var event_dispatcher = _name_counter_event_dictionary[name];
if(!event_dispatcher){
event_dispatcher = new EventDispatcher();
_name_counter_event_dictionary[name] = event_dispatcher;
}
return event_dispatcher.createEventHandler("update");
};
// ------------------------------
// ホストカウント用のイベントハンドラを生成
// ------------------------------
_this.createEventHandlerForHostCounter = function(host){
var event_dispatcher = _host_counter_event_dictionary[host];
if(!event_dispatcher){
event_dispatcher = new EventDispatcher();
_host_counter_event_dictionary[host] = event_dispatcher;
}
return event_dispatcher.createEventHandler("update");
};
// ------------------------------
// フォロワーカウント用のイベントハンドラを生成
// ------------------------------
_this.createEventHandlerForFollowerCounter = function(number){
var event_dispatcher = _follower_counter_event_dictionary[number];
if(!event_dispatcher){
event_dispatcher = new EventDispatcher();
_follower_counter_event_dictionary[number] = event_dispatcher;
}
return event_dispatcher.createEventHandler("update");
};
// ------------------------------
// IDカウント数取得
// ------------------------------
_this.getCountId = function(id){
if(_id_counter_dictionary[id]) return _id_counter_dictionary[id];
return 0;
};
// ------------------------------
// IDカウント数加算(内部用)
// ------------------------------
function addCountId(id,v){
if(!_id_counter_dictionary[id]){
_id_counter_dictionary[id] = 0;
}
_id_counter_dictionary[id] += v;
// イベント発火
var event_dispatcher = _id_counter_event_dictionary[id];
if(event_dispatcher){
event_dispatcher.dispatchEvent("update",_id_counter_dictionary[id]);
}
}
// ------------------------------
// 名前カウント数取得
// ------------------------------
_this.getCountName = function(name){
if(_name_counter_dictionary[name]) return _name_counter_dictionary[name];
return 0;
};
// ------------------------------
// 名前カウント数加算(内部用)
// ------------------------------
function addCountName(name,v){
if(!_name_counter_dictionary[name]){
_name_counter_dictionary[name] = 0;
}
_name_counter_dictionary[name] += v;
// イベント発火
var event_dispatcher = _name_counter_event_dictionary[name];
if(event_dispatcher){
event_dispatcher.dispatchEvent("update",_name_counter_dictionary[name]);
}
}
// ------------------------------
// ホストカウント数取得
// ------------------------------
_this.getCountHost = function(host){
if(_host_counter_dictionary[host]) return _host_counter_dictionary[host];
return 0;
};
// ------------------------------
// ホストカウント数加算(内部用)
// ------------------------------
function addCountHost(host,v){
if(!_host_counter_dictionary[host]){
_host_counter_dictionary[host] = 0;
}
_host_counter_dictionary[host] += v;
// イベント発火
var event_dispatcher = _host_counter_event_dictionary[host];
if(event_dispatcher){
event_dispatcher.dispatchEvent("update",_host_counter_dictionary[host]);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _number_dictionary;
var _id_dictionary;
var _id_counter_dictionary;
var _id_counter_event_dictionary;
var _name_dictionary;
var _name_counter_dictionary;
var _name_counter_event_dictionary;
var _host_dictionary;
var _host_counter_dictionary;
var _host_counter_event_dictionary;
var _follower_counter_event_dictionary;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_number_dictionary = new Object();
_id_dictionary = new Object();
_id_counter_dictionary = new Object();
_id_counter_event_dictionary = new Object();
_name_dictionary = new Object();
_name_counter_dictionary = new Object();
_name_counter_event_dictionary = new Object();
_host_dictionary = new Object();
_host_counter_dictionary = new Object();
_host_counter_event_dictionary = new Object();
_follower_counter_event_dictionary = new Object();
})();
}
// ------------------------------
// 掲示板ポップアップレスポンス
// ------------------------------
function BbsResponseDialog(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(_released) return;
_released = true;
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
// 子を全て破棄
getChildren(function(dialog){
dialog.release();
return false;
});
// ダイアログの親子関係を外す
_this.removeParent();
// マウスイベントを外す
removeEventMouseOverHitArea();
// タッチイベントを外す
removeEventTouchStartHitArea();
// リリースイベントを外す
removeEventRelease();
// タスクを破棄
if(_task){
_task.release();
_task = null;
}
};
// ------------------------------
// 自殺
// ------------------------------
_this.suicide = function(){
if(_task){
_this.setElementHitArea(null);
_suicide = true;
}else{
_this.release();
}
};
// ------------------------------
// ヒットエリアとなる範囲を指定
// ------------------------------
_this.setElementHitArea = function(element){
// マウスイベントを外す
removeEventMouseOverHitArea();
// タッチイベントを外す
removeEventTouchStartHitArea();
// リリースイベントを外す
removeEventRelease();
_element_hit_area = element;
if(_element_hit_area){
_invalid_timestamp = (new Date()).getTime();
_invalid_once = true;
}
// マウスイベントを開始
addEventMouseOverHitArea();
// タッチイベントを開始
addEventTouchStartHitArea();
// リリースイベントを開始
addEventRelease();
};
// ------------------------------
// 配置用親エレメントを指定
// ------------------------------
_this.setElementParent = function(element){
_element_parent = element;
};
// ------------------------------
// ウィンドウとの当たり判定
// ------------------------------
_this.hittestWindow = function(pos){
if(!_window) return false;
return ElementHitTestPosition(_window,pos,false);
};
// ------------------------------
// 子ダイアログとして登録
// ------------------------------
_this.attachChild = function(child){
child.removeParent();
var _child = _this._child;
var _prev = _child;
var _next = _prev._next;
child._prev = _prev;
child._next = _next;
_prev._next = child;
_next._prev = child;
_this._parent = child;
};
// ------------------------------
// 親からの登録を外す
// ------------------------------
_this.removeParent = function(){
var _prev = _this._prev;
var _next = _this._next;
_prev._next = _next;
_next._prev = _prev;
_this._prev = _this;
_this._next = _this;
_this._parent = null;
};
// ------------------------------
// 子を取得(内部用)
// ------------------------------
function getChildren(func){
var queue = new Array();
var _child = _this._child;
var child = _child._next;
while(child != _child){
queue.push(child);
child = child._next;
}
while(true){
var dialog = queue.shift();
if(!dialog) break;
var _child = dialog._child;
var child = _child._next;
while(child != _child){
queue.push(child);
child = child._next;
}
if(func(dialog)){
return;
}
}
}
// ------------------------------
// ヒットエリアのマウスオーバーイベントを追加(内部用)
// ------------------------------
function addEventMouseOverHitArea(){
if(!_element_hit_area) return;
removeEventMouseOverHitArea();
if(_element_hit_area.addEventListener){
_element_hit_area.addEventListener("mouseover",mouseOverHitArea,false);
}else if(_element_hit_area.attachEvent){
_element_hit_area.attachEvent("onmouseover",mouseOverHitArea);
}
}
// ------------------------------
// ヒットエリアのマウスオーバーイベントを外す(内部用)
// ------------------------------
function removeEventMouseOverHitArea(){
if(!_element_hit_area) return;
if(_element_hit_area.removeEventListener){
_element_hit_area.removeEventListener("mouseover",mouseOverHitArea,false);
}else if(_element_hit_area.detachEvent){
_element_hit_area.detachEvent("onmouseover",mouseOverHitArea);
}
}
// ------------------------------
// ヒットエリアのタッチスタートイベントを追加(内部用)
// ------------------------------
function addEventTouchStartHitArea(){
if(!_element_hit_area) return;
removeEventTouchStartHitArea();
if(_element_hit_area.addEventListener){
//_element_hit_area.addEventListener("touchstart",touchStartHitArea,false);
}
}
// ------------------------------
// ヒットエリアのタッチスタートイベントを外す(内部用)
// ------------------------------
function removeEventTouchStartHitArea(){
if(!_element_hit_area) return;
if(_element_hit_area.removeEventListener){
//_element_hit_area.removeEventListener("touchstart",touchStartHitArea,false);
}
}
// ------------------------------
// リリースイベントを追加(内部用)
// ------------------------------
function addEventRelease(){
if(!_element_hit_area) return;
removeEventRelease();
if(!_observer_remove){
_observer_remove = new DomNodeObserverRemoveFromDocument(_element_hit_area);
_observer_remove.setFunction(_this.suicide);
}
}
// ------------------------------
// リリースイベントを外す(内部用)
// ------------------------------
function removeEventRelease(){
if(_observer_remove){
// 監視を破棄
_observer_remove.release();
_observer_remove = null;
}
}
// ------------------------------
// ヒットエリアのマウスオーバーイベント(内部用)
// ------------------------------
function mouseOverHitArea(e){
// マウス入力を更新
input_mouse.setMouseEvent(e);
// タスク生成
createTask();
}
// ------------------------------
// ヒットエリアのタッチスタートイベント(内部用)
// ------------------------------
function touchStartHitArea(e){
// タッチ入力を更新
input_touch.setTouchEvent(e);
// タスク生成
createTask();
}
// ------------------------------
// タスク生成(内部用)
// ------------------------------
function createTask(){
// 一度無効化
if(_invalid_once){
_invalid_once = false;
if((new Date()).getTime() - _invalid_timestamp < 100){
return;
}
}
// 再構築
if(_task){
var work = _task.getUserWork();
switch(work.type){
case "fade_out":
_task.setExecuteFunc(ResponseDialogClose);
_task.execute(0xffffffff);
break;
}
}
// Shift キー押下で無視
if(input_mouse.getKeyShift()) return;
// ドラッグ中は無視
if(input_mouse.getButtonLeft()) return;
// タスクを生成
if(!_task){
_task = task_container.createTask();
_task.setLevel(TASK_EXECUTE_LEVEL_POPUP);
_task.setDestructorFunc(ResponseDialogDestructor);
_task.setExecuteFunc(ResponseDialogInitialize);
_task.execute(0xffffffff);
}
}
// ------------------------------
// マウスムーブ(内部用)
// ------------------------------
function mouseMove(){
if(!_task) return;
var work = _task.getUserWork();
var hit = ElementHitTestPosition(_element_hit_area,input_mouse.getPositionClient(),false);
if(!hit){
hit = _this.hittestWindow(input_mouse.getPositionClient());
}
if(!hit){
getChildren(function(dialog){
hit = dialog.hittestWindow(input_mouse.getPositionClient());
return hit;
});
}
if(hit){
var client_size = DocumentGetClientSize(document);
var mouse_pos = input_mouse.getPositionClient();
if(mouse_pos.x < 1) hit = false;
if(mouse_pos.y < 1) hit = false;
if(client_size.width - 2 < mouse_pos.x) hit = false;
if(client_size.height - 2 < mouse_pos.y) hit = false;
if(!input_mouse.getEnableMouse()){
hit = false;
}
}
// アニメーション
if(project.getEnableAnimationPopupBbsResponse()){
if(hit){
switch(work.type){
case "wait_before_close":
// 表示へ
_task.setExecuteFunc(ResponseDialogShowInit);
_task.execute(0xffffffff);
break;
case "fade_out":
// フェードインへ
_task.setExecuteFunc(ResponseDialogFadeIn);
_task.execute(0xffffffff);
break;
}
}else{
switch(work.type){
case "wait_before_open":
// 閉じる
_task.setExecuteFunc(ResponseDialogClose);
_task.execute(0xffffffff);
break;
case "fade_in":
// フェードアウトへ
_task.setExecuteFunc(ResponseDialogFadeOut);
_task.execute(0xffffffff);
break;
case "show":
// フェードアウト待機へ
_task.setExecuteFunc(ResponseDialogWaitBeforeClose);
_task.execute(0xffffffff);
break;
}
}
}else{
if(hit){
switch(work.type){
case "wait_before_close":
// 表示へ
_task.setExecuteFunc(ResponseDialogShowInit);
_task.execute(0xffffffff);
break;
}
}else{
switch(work.type){
case "wait_before_open":
// 閉じる
_task.setExecuteFunc(ResponseDialogClose);
_task.execute(0xffffffff);
break;
case "show":
// フェードアウト待機へ
_task.setExecuteFunc(ResponseDialogWaitBeforeClose);
_task.execute(0xffffffff);
break;
}
}
}
}
// ------------------------------
// スクロール補正(内部用)
// ------------------------------
function reviseScroll(vec){
if(_task){
var work = _task.getUserWork();
var pos = work.pos;
pos.x += vec.x;
pos.y += vec.y;
ResponseDialogPositionUpdate(_task);
}
}
// ------------------------------
// 初期化(内部用)
// ------------------------------
function ResponseDialogInitialize(task){
var work = task.getUserWork();
work.type = "initialize";
work.anime_pos = 0.0;
work.anime_spd = 0.0;
task.setExecuteFunc(ResponseDialogWaitBeforeOpenInit);
task.execute(0xffffffff);
}
// ------------------------------
// オープン前待機(内部用)
// ------------------------------
function ResponseDialogWaitBeforeOpenInit(task){
var work = task.getUserWork();
work.type = "wait_before_open";
work.frame = project.getTimeWaitOpenPopupExpandBbsResponse() / 1000 * 60;
task.setExecuteFunc(ResponseDialogWaitBeforeOpenExec);
task.execute(0xffffffff);
}
function ResponseDialogWaitBeforeOpenExec(task){
var work = task.getUserWork();
// マウスムーブ
mouseMove();
work.frame -= 1;
if(work.frame < 0){
task.setExecuteFunc(ResponseDialogOpen);
task.execute(0xffffffff);
return;
}
}
// ------------------------------
// ダイアログオープン(内部用)
// ------------------------------
function ResponseDialogOpen(task){
var work = task.getUserWork();
work.type = "open";
work.anime_pos = 0.0;
work.anime_spd = 0.0;
// ウィンドウ作成
_window = DocumentCreateElement("div");
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_window);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// スタイルをセット
ElementSetStyle(_window,project.getStyleSheetExpandBbsPopupResponse());
// 最前面
_window.style.zIndex = 0x7FFFFFFF - 1;
_window.style.position = project.getStylePositionPopupBbsResponse();
try{
// 親からの継承を無効化
_window.style.minWidth = "0";
_window.style.minHeight = "0";
_window.style.maxWidth = "none";
_window.style.maxHeight = "none";
}catch(e){}
_window.style.left = "0px";
_window.style.top = "0px";
_window.style.width = "0px";
_window.style.height = "0px";
// スタイルのサイズを取得
var clone = ElementCloneNode(_window,false);
if(_element_parent){
_element_parent.appendChild(clone);
}else{
document.body.appendChild(clone);
}
var bounding_size = ElementGetBoundingClientRect(clone);
work.style_w = bounding_size.right - bounding_size.left;
work.style_h = bounding_size.bottom - bounding_size.top;
DomNodeRemove(clone);
var completed = false;
function abort(){
_task.setExecuteFunc(ResponseDialogClose);
_task.execute(0xffffffff);
}
function response(obj){
if(!task.getAlive()) return;
if(completed) return;
completed = true;
if(!(obj.result)){
abort();
return;
}
// クライアントサイズ
var client_size = DocumentGetClientSize(document);
// スクロール位置
var scroll_pos = WindowGetScrollPosition(window);
// サイズ
var percent = project.getPercentPopupBbsResponse();
var width = Math.floor(client_size.width * (percent.x / 100)) - work.style_w - 2;
var height = Math.floor(client_size.height * (percent.y / 100)) - work.style_h - 2;
// サイズをセット
_window.style.width = (width) + "px";
_window.style.height = "auto";
_window.style.maxHeight = (height) + "px";
if(_element_parent){
_element_parent.appendChild(_window);
}else{
document.body.appendChild(_window);
}
// バウンディングサイズ
var hit_bounding_size;
if(_element_hit_area){
if(DomNodeGetAttachedDocument(_element_hit_area)){
hit_bounding_size = ElementGetBoundingClientRect(_element_hit_area);
}
}
if(!hit_bounding_size){
var mouse_pos = ObjectCopy(input_mouse.getPositionClient());
hit_bounding_size = {
left :mouse_pos.x,
right :mouse_pos.x,
top :mouse_pos.y,
bottom:mouse_pos.y
};
}
hit_bounding_size.left = Math.ceil(hit_bounding_size.left);
hit_bounding_size.top = Math.ceil(hit_bounding_size.top);
hit_bounding_size.right = Math.floor(hit_bounding_size.right);
hit_bounding_size.bottom = Math.floor(hit_bounding_size.bottom);
// バウンディングサイズ
var window_bounding_size = ElementGetBoundingClientRect(_window);
var sub_x;
var sub_y;
var cx = (hit_bounding_size.left + hit_bounding_size.right) * 0.5;
var cy = (hit_bounding_size.top + hit_bounding_size.bottom) * 0.5;
// 表示位置
switch(project.getOriginPopupExpandBbsResponse()){
default:
case "adsorb_left_right":
// 左右吸着
if((cx / client_size.width) < 0.5){
sub_x = hit_bounding_size.right - window_bounding_size.left;
}else{
sub_x = hit_bounding_size.left - window_bounding_size.right;
}
if((cy / client_size.height) < 0.5){
sub_y = hit_bounding_size.top - window_bounding_size.top;
}else{
sub_y = hit_bounding_size.bottom - window_bounding_size.bottom;
}
break;
case "adsorb_top_bottom":
// 上下吸着
if((cx / client_size.width) < 0.5){
sub_x = hit_bounding_size.left - window_bounding_size.left;
}else{
sub_x = hit_bounding_size.right - window_bounding_size.right;
}
if((cy / client_size.height) < 0.5){
sub_y = hit_bounding_size.bottom - window_bounding_size.top;
}else{
sub_y = hit_bounding_size.top - window_bounding_size.bottom;
}
break;
}
window_bounding_size.left += sub_x;
window_bounding_size.right += sub_x;
window_bounding_size.top += sub_y;
window_bounding_size.bottom += sub_y;
var pos = {
x:window_bounding_size.left,
y:window_bounding_size.top
};
work.pos = pos;
// サイズ補正
if(client_size.width < window_bounding_size.right + 1) pos.x += client_size.width - 1 - window_bounding_size.right;
if(client_size.height < window_bounding_size.bottom + 1) pos.y += client_size.height - 1 - window_bounding_size.bottom;
if(pos.x < 1) pos.x = 1;
if(pos.y < 1) pos.y = 1;
var h = client_size.height - pos.y - work.style_h - 1;
if(h < height){
height = h;
_window.style.maxHeight = (height) + "px";
}
// 絶対座標系
if(project.getStylePositionPopupBbsResponse() == "absolute"){
pos.x -= bounding_size.left;
pos.y -= bounding_size.top;
// イベントハンドラを作成
_event_handler_revise_scroll = page_expand_event_dispatcher.createEventHandler("revise_scroll");
_event_handler_revise_scroll.setFunction(reviseScroll);
}
ResponseDialogPositionUpdate(task);
// DOMContentLoaded イベントに未対応
if(!document.addEventListener){
execute_queue.attachLastForInsertDomNode(DomNodeAnalyzeRoot,_window);
}
// マウスイベント有効化
_window.style.pointerEvents = "auto";
// アニメーション
if(project.getEnableAnimationPopupBbsResponse()){
task.setExecuteFunc(ResponseDialogFadeIn);
}else{
task.setExecuteFunc(ResponseDialogShowInit);
}
task.execute(0xffffffff);
}
// 待機
_task.setExecuteFunc(null);
// 生成イベント
var result = _this.oncreate(_window,response);
if(result !== undefined){
response({result:result});
}
}
// ------------------------------
// フェードイン(内部用)
// ------------------------------
function ResponseDialogFadeIn(task){
var work = task.getUserWork();
work.type = "fade_in";
// マウスムーブ
mouseMove();
var sub = 1.0 - work.anime_pos;
sub *= 0.4;
if(sub > 0.0){
work.anime_spd += 0.05;
if(work.anime_spd > 0.2) work.anime_spd = 0.2;
if(work.anime_spd > sub) work.anime_spd = sub;
}
work.anime_pos += work.anime_spd;
if(work.anime_pos > 0.999){
work.anime_spd = 0.0;
work.anime_pos = 1.0;
task.setExecuteFunc(ResponseDialogShowInit);
}
_window.style.opacity = work.anime_pos;
}
// ------------------------------
// 表示(内部用)
// ------------------------------
function ResponseDialogShowInit(task){
var work = task.getUserWork();
work.type = "show";
work.anime_pos = 1.0;
work.anime_spd = 0.0;
work.frame = project.getTimeWaitClosePopupExpandBbsResponse() / 1000 * 60;
_window.style.opacity = work.anime_pos;
task.setExecuteFunc(ResponseDialogShowExec);
task.execute(0xffffffff);
}
function ResponseDialogShowExec(task){
var work = task.getUserWork();
// マウスムーブ
mouseMove();
}
// ------------------------------
// 待機(内部用)
// ------------------------------
function ResponseDialogWaitBeforeClose(task){
var work = task.getUserWork();
work.type = "wait_before_close";
// マウスムーブ
mouseMove();
work.frame -= 1;
if(work.frame < 0){
// アニメーション
if(project.getEnableAnimationPopupBbsResponse()){
// マウスイベント無効化
_window.style.pointerEvents = "none";
task.setExecuteFunc(ResponseDialogFadeOut);
}else{
task.setExecuteFunc(ResponseDialogClose);
}
}
}
// ------------------------------
// フェードアウト(内部用)
// ------------------------------
function ResponseDialogFadeOut(task){
var work = task.getUserWork();
work.type = "fade_out";
var sub = 0.0 - work.anime_pos;
sub *= 0.4;
if(sub < 0.0){
work.anime_spd -= 0.2;
if(work.anime_spd < sub) work.anime_spd = sub;
}
work.anime_pos += work.anime_spd;
if(work.anime_pos < 0.001){
work.anime_spd = 0.0;
work.anime_pos = 0.0;
task.setExecuteFunc(ResponseDialogClose);
}
_window.style.opacity = work.anime_pos;
}
// ------------------------------
// 閉じる(内部用)
// ------------------------------
function ResponseDialogClose(task){
var work = task.getUserWork();
task.release();
}
// ------------------------------
// デストラクタ(内部用)
// ------------------------------
function ResponseDialogDestructor(task){
// 解放
if(_event_handler_revise_scroll){
_event_handler_revise_scroll.release();
_event_handler_revise_scroll = null;
}
if(_analyze_work){
// 解析辞書除外
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
if(_window){
DomNodeRemove(_window);
_window = null;
}
_task = null;
// 自殺
if(_suicide){
_this.release();
}
}
// ------------------------------
// サイズ更新(内部用)
// ------------------------------
function ResponseDialogPositionUpdate(task){
var work = task.getUserWork();
var pos = work.pos;
_window.style.left = (pos.x) + "px";
_window.style.top = (pos.y) + "px";
}
// ------------------------------
// ダイアログ生成イベント
// ------------------------------
_this.oncreate = function(element){};
// ------------------------------
// プライベート変数
// ------------------------------
var _task;
var _element_hit_area;
var _element_parent;
var _window;
var _invalid_once;
var _invalid_timestamp;
var _suicide;
var _released;
var _analyze_work;
var _observer_remove;
var _event_handler_revise_scroll;
var _event_handler_release;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_task = null;
_window = null;
_invalid_once = false;
_invalid_timestamp = 0;
_suicide = false;
_released = false;
_this._parent = null;
_this._prev = _this;
_this._next = _this;
var _child = new Object();
_child._prev = _child;
_child._next = _child;
_this._child = _child;
_event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// 掲示板コントロール レスアンカー
// ------------------------------
function BbsControlResponseAnchor(element,outsider){
var _this = this;
// ------------------------------
// タイプを取得
// ------------------------------
_this.getType = function(id){
return "res_a";
};
// ------------------------------
// ResponseAnchorNumbers オブジェクトを取得
// ------------------------------
_this.getResponseAnchorNumbers = function(){
return _numbers;
};
// ------------------------------
// ResponseAnchorNumbers オブジェクトをセット
// ------------------------------
_this.setResponseAnchorNumbers = function(numbers){
_numbers = numbers;
};
// ------------------------------
// レスポンスオブジェクトをセット
// ------------------------------
_this.setResponse = function(response){
if(!_response){
_response = response;
// 解放イベント
var event_dispatcher = response.getEventDispatcher();
_event_handler_release = event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(_this.release);
}
};
// ------------------------------
// 要素を取得
// ------------------------------
_this.getElement = function(){
return _element;
};
// ------------------------------
// テキストノードを取得
// ------------------------------
_this.getTextNode = function(){
return _text_node;
};
// ------------------------------
// テキストノードをセット
// ------------------------------
_this.setTextNode = function(node){
_text_node = node;
};
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_numbers = null;
_this.onchange(0);
// イベント解放
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
if(_event_handler_abort){
_event_handler_abort.release();
_event_handler_abort = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
if(_analyze_work){
// 解析辞書除外
AnalyzeWorkClearBbsControl(_analyze_work);
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
if(_element){
if(outsider){
DomNodeRemove(_element);
}
_element = null;
}
};
// ------------------------------
// 更新通知
// ------------------------------
_this.onchange = function(v){};
// ------------------------------
// プライベート変数
// ------------------------------
var _numbers;
var _element;
var _text_node;
var _analyze_work;
var _observer_remove;
var _response;
var _event_handler_release;
var _event_handler_abort;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(element){
_element = element;
element = null;
}else{
_element = DocumentCreateElement("a");
}
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element);
// 掲示板コントロール登録
AnalyzeWorkSetBbsControl(_analyze_work,_this);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
if(outsider) attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element);
_observer_remove.setFunction(_this.release);
// 開放イベント
_event_handler_abort = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_abort.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// 掲示板コントロール レスアンカー の存在確認
// ------------------------------
function BbsControlResponseAnchorExist(element){
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "res_a"){
return true;
}
}
}
}
return false;
}
// ------------------------------
// 掲示板コントロール レスアンカー の検索
// ------------------------------
function BbsControlResponseAnchorSearch(element,func){
var result = null;
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "res_a"){
result = func(control);
if(result){
return result;
}
}
}
}
}
return result;
}
// ------------------------------
// 掲示板コントロール 引用
// ------------------------------
function BbsControlQuote(element,outsider){
var _this = this;
// ------------------------------
// タイプを取得
// ------------------------------
_this.getType = function(id){
return "res_q";
};
// ------------------------------
// ResponseAnchorNumbers オブジェクトを取得
// ------------------------------
_this.getResponseAnchorNumbers = function(){
return _numbers;
};
// ------------------------------
// ResponseAnchorNumbers オブジェクトをセット
// ------------------------------
_this.setResponseAnchorNumbers = function(numbers){
_numbers = numbers;
};
// ------------------------------
// レスポンスオブジェクトをセット
// ------------------------------
_this.setResponse = function(response){
if(!_response){
_response = response;
// 解放イベント
var event_dispatcher = response.getEventDispatcher();
_event_handler_release = event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(_this.release);
}
};
// ------------------------------
// 要素を取得
// ------------------------------
_this.getElement = function(){
return _element;
};
// ------------------------------
// テキストノードを取得
// ------------------------------
_this.getTextNode = function(){
return _text_node;
};
// ------------------------------
// テキストノードをセット
// ------------------------------
_this.setTextNode = function(node){
_text_node = node;
};
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_numbers = null;
_this.onchange(0);
// イベント解放
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
if(_event_handler_abort){
_event_handler_abort.release();
_event_handler_abort = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
if(_analyze_work){
// 解析辞書除外
AnalyzeWorkClearBbsControl(_analyze_work);
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
if(_element){
if(outsider){
DomNodeRemove(_element);
}
_element = null;
}
};
// ------------------------------
// 更新通知
// ------------------------------
_this.onchange = function(v){};
// ------------------------------
// プライベート変数
// ------------------------------
var _numbers;
var _element;
var _text_node;
var _analyze_work;
var _observer_remove;
var _response;
var _event_handler_release;
var _event_handler_abort;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(element){
_element = element;
element = null;
}else{
_element = DocumentCreateElement("span");
}
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element);
// 掲示板コントロール登録
AnalyzeWorkSetBbsControl(_analyze_work,_this);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
if(outsider) attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element);
_observer_remove.setFunction(_this.release);
// 開放イベント
_event_handler_abort = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_abort.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// 掲示板コントロール 引用 の存在確認
// ------------------------------
function BbsControlQuoteExist(element){
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "res_q"){
return true;
}
}
}
}
return false;
}
// ------------------------------
// 掲示板コントロール 引用 の検索
// ------------------------------
function BbsControlQuoteSearch(element,func){
var result = null;
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "res_q"){
result = func(control);
if(result){
return result;
}
}
}
}
}
return result;
}
// ------------------------------
// 掲示板コントロール ID
// ------------------------------
function BbsControlId(element,outsider){
var _this = this;
// ------------------------------
// タイプを取得
// ------------------------------
_this.getType = function(id){
return "id";
};
// ------------------------------
// ID を取得
// ------------------------------
_this.getId = function(){
return _id;
};
// ------------------------------
// ID をセット
// ------------------------------
_this.setId = function(id){
if(!_id){
_id = id;
// ID 数の更新イベント
_event_handler_update = bbs_dictionary.createEventHandlerForIdCounter(_id);
_event_handler_update.setFunction(function(v){
_this.onchange(v);
});
}
};
// ------------------------------
// レスポンスオブジェクトをセット
// ------------------------------
_this.setResponse = function(response){
if(!_response){
_response = response;
// 解放イベント
var event_dispatcher = response.getEventDispatcher();
_event_handler_release = event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(_this.release);
}
};
// ------------------------------
// 要素を取得
// ------------------------------
_this.getElement = function(){
return _element;
};
// ------------------------------
// テキストノードを取得
// ------------------------------
_this.getTextNode = function(){
return _text_node;
};
// ------------------------------
// テキストノードをセット
// ------------------------------
_this.setTextNode = function(node){
_text_node = node;
};
// ------------------------------
// 更新
// ------------------------------
_this.update = function(){
var v = bbs_dictionary.getCountId(_id);
_this.onchange(v);
};
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_this.onchange(0);
// イベント解放
if(_event_handler_update){
_event_handler_update.release();
_event_handler_update = null;
}
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
if(_event_handler_abort){
_event_handler_abort.release();
_event_handler_abort = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
if(_analyze_work){
// 解析辞書除外
AnalyzeWorkClearBbsControl(_analyze_work);
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
if(_element){
removeEventClick();
if(outsider){
DomNodeRemove(_element);
}
_element = null;
}
};
// ------------------------------
// 更新通知
// ------------------------------
_this.onchange = function(v){};
// ------------------------------
// マウスクリック時に実行される関数(内部用)
// ------------------------------
function mouseClick(e){
removeEventClick();
var ary = bbs_dictionary.getResponsesFromId(_id);
var num = ary.length;
var i = num - 1;
function f(){
ary[i].erase();
i --;
if(i >= 0){
execute_queue.attachFirst(f,null);
}else{
_this.release();
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// クリックイベントを外す(内部用)
// ------------------------------
function removeEventClick(){
if(_element.removeEventListener){
_element.removeEventListener("click",mouseClick);
}else if(_element.detachEvent){
_element.detachEvent("onclick",mouseClick);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element;
var _text_node;
var _analyze_work;
var _observer_remove;
var _response;
var _id;
var _event_handler_update;
var _event_handler_release;
var _event_handler_abort;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(element){
_element = element;
element = null;
}else{
_element = DocumentCreateElement("span");
}
if(_element.addEventListener){
_element.addEventListener("click",mouseClick);
}else if(_element.attachEvent){
_element.attachEvent("onclick",mouseClick);
}
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element);
// 掲示板コントロール登録
AnalyzeWorkSetBbsControl(_analyze_work,_this);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
if(outsider) attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element);
_observer_remove.setFunction(_this.release);
// 開放イベント
_event_handler_abort = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_abort.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// 掲示板コントロール ID の存在確認
// ------------------------------
function BbsControlIdExist(element){
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "id"){
return true;
}
}
}
}
return false;
}
// ------------------------------
// 掲示板コントロール ID の検索
// ------------------------------
function BbsControlIdSearch(element,func){
var result = null;
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "id"){
result = func(control);
if(result){
return result;
}
}
}
}
}
return result;
}
// ------------------------------
// 掲示板コントロール 名前
// ------------------------------
function BbsControlName(element,outsider){
var _this = this;
// ------------------------------
// タイプを取得
// ------------------------------
_this.getType = function(name){
return "name";
};
// ------------------------------
// 名前を取得
// ------------------------------
_this.getName = function(){
return _name;
};
// ------------------------------
// 名前をセット
// ------------------------------
_this.setName = function(name){
if(!_name){
_name = name;
// 名前数の更新イベント
_event_handler_update = bbs_dictionary.createEventHandlerForNameCounter(_name);
_event_handler_update.setFunction(function(v){
_this.onchange(v);
});
}
};
// ------------------------------
// レスポンスオブジェクトをセット
// ------------------------------
_this.setResponse = function(response){
if(!_response){
_response = response;
// 解放イベント
var event_dispatcher = response.getEventDispatcher();
_event_handler_release = event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(_this.release);
}
};
// ------------------------------
// 要素を取得
// ------------------------------
_this.getElement = function(){
return _element;
};
// ------------------------------
// テキストノードを取得
// ------------------------------
_this.getTextNode = function(){
return _text_node;
};
// ------------------------------
// テキストノードをセット
// ------------------------------
_this.setTextNode = function(node){
_text_node = node;
};
// ------------------------------
// 更新
// ------------------------------
_this.update = function(){
var v = bbs_dictionary.getCountName(_name);
_this.onchange(v);
};
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_this.onchange(0);
// イベント解放
if(_event_handler_update){
_event_handler_update.release();
_event_handler_update = null;
}
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
if(_event_handler_abort){
_event_handler_abort.release();
_event_handler_abort = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
if(_analyze_work){
// 解析辞書除外
AnalyzeWorkClearBbsControl(_analyze_work);
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
if(_element){
removeEventClick();
if(outsider){
DomNodeRemove(_element);
}
_element = null;
}
};
// ------------------------------
// 更新通知
// ------------------------------
_this.onchange = function(v){};
// ------------------------------
// マウスクリック時に実行される関数(内部用)
// ------------------------------
function mouseClick(e){
removeEventClick();
var ary = bbs_dictionary.getResponsesFromName(_name);
var num = ary.length;
var i = num - 1;
function f(){
ary[i].erase();
i --;
if(i >= 0){
execute_queue.attachFirst(f,null);
}else{
_this.release();
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// クリックイベントを外す(内部用)
// ------------------------------
function removeEventClick(){
if(_element.removeEventListener){
_element.removeEventListener("click",mouseClick);
}else if(_element.detachEvent){
_element.detachEvent("onclick",mouseClick);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element;
var _text_node;
var _analyze_work;
var _observer_remove;
var _response;
var _name;
var _event_handler_update;
var _event_handler_release;
var _event_handler_abort;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(element){
_element = element;
element = null;
}else{
_element = DocumentCreateElement("span");
}
if(_element.addEventListener){
_element.addEventListener("click",mouseClick);
}else if(_element.attachEvent){
_element.attachEvent("onclick",mouseClick);
}
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element);
// 掲示板コントロール登録
AnalyzeWorkSetBbsControl(_analyze_work,_this);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
if(outsider) attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element);
_observer_remove.setFunction(_this.release);
// 開放イベント
_event_handler_abort = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_abort.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// 掲示板コントロール 名前 の存在確認
// ------------------------------
function BbsControlNameExist(element){
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "name"){
return true;
}
}
}
}
return false;
}
// ------------------------------
// 掲示板コントロール 名前 の検索
// ------------------------------
function BbsControlNameSearch(element,func){
var result = null;
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "name"){
result = func(control);
if(result){
return result;
}
}
}
}
}
return result;
}
// ------------------------------
// 掲示板コントロール ホスト
// ------------------------------
function BbsControlHost(element,outsider){
var _this = this;
// ------------------------------
// タイプを取得
// ------------------------------
_this.getType = function(host){
return "host";
};
// ------------------------------
// ホストを取得
// ------------------------------
_this.getHost = function(){
return _host;
};
// ------------------------------
// ホストをセット
// ------------------------------
_this.setHost = function(host){
if(!_host){
_host = host;
// ホスト数の更新イベント
_event_handler_update = bbs_dictionary.createEventHandlerForHostCounter(_host);
_event_handler_update.setFunction(function(v){
_this.onchange(v);
});
}
};
// ------------------------------
// レスポンスオブジェクトをセット
// ------------------------------
_this.setResponse = function(response){
if(!_response){
_response = response;
// 解放イベント
var event_dispatcher = response.getEventDispatcher();
_event_handler_release = event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(_this.release);
}
};
// ------------------------------
// 要素を取得
// ------------------------------
_this.getElement = function(){
return _element;
};
// ------------------------------
// テキストノードを取得
// ------------------------------
_this.getTextNode = function(){
return _text_node;
};
// ------------------------------
// テキストノードをセット
// ------------------------------
_this.setTextNode = function(node){
_text_node = node;
};
// ------------------------------
// 更新
// ------------------------------
_this.update = function(){
var v = bbs_dictionary.getCountHost(_host);
_this.onchange(v);
};
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_this.onchange(0);
// イベント解放
if(_event_handler_update){
_event_handler_update.release();
_event_handler_update = null;
}
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
if(_event_handler_abort){
_event_handler_abort.release();
_event_handler_abort = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
if(_analyze_work){
// 解析辞書除外
AnalyzeWorkClearBbsControl(_analyze_work);
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
if(_element){
removeEventClick();
if(outsider){
DomNodeRemove(_element);
}
_element = null;
}
};
// ------------------------------
// 更新通知
// ------------------------------
_this.onchange = function(v){};
// ------------------------------
// マウスクリック時に実行される関数(内部用)
// ------------------------------
function mouseClick(e){
removeEventClick();
var ary = bbs_dictionary.getResponsesFromHost(_host);
var num = ary.length;
var i = num - 1;
function f(){
ary[i].erase();
i --;
if(i >= 0){
execute_queue.attachFirst(f,null);
}else{
_this.release();
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// クリックイベントを外す(内部用)
// ------------------------------
function removeEventClick(){
if(_element.removeEventListener){
_element.removeEventListener("click",mouseClick);
}else if(_element.detachEvent){
_element.detachEvent("onclick",mouseClick);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element;
var _text_node;
var _analyze_work;
var _observer_remove;
var _response;
var _host;
var _event_handler_update;
var _event_handler_release;
var _event_handler_abort;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(element){
_element = element;
element = null;
}else{
_element = DocumentCreateElement("span");
}
if(_element.addEventListener){
_element.addEventListener("click",mouseClick);
}else if(_element.attachEvent){
_element.attachEvent("onclick",mouseClick);
}
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element);
// 掲示板コントロール登録
AnalyzeWorkSetBbsControl(_analyze_work,_this);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
if(outsider) attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element);
_observer_remove.setFunction(_this.release);
// 開放イベント
_event_handler_abort = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_abort.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// 掲示板コントロール ホスト の存在確認
// ------------------------------
function BbsControlHostExist(element){
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "host"){
return true;
}
}
}
}
return false;
}
// ------------------------------
// 掲示板コントロール ホスト の検索
// ------------------------------
function BbsControlHostSearch(element,func){
var result = null;
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "host"){
result = func(control);
if(result){
return result;
}
}
}
}
}
return result;
}
// ------------------------------
// 掲示板コントロール Follower
// ------------------------------
function BbsControlFollower(element,outsider){
var _this = this;
// ------------------------------
// タイプを取得
// ------------------------------
_this.getType = function(id){
return "follower";
};
// ------------------------------
// レスポンスオブジェクトをセット
// ------------------------------
_this.setResponse = function(response){
if(!_response){
_response = response;
// フォロワー数の更新イベント
_event_handler_update = bbs_dictionary.createEventHandlerForFollowerCounter(response.getNumber());
_event_handler_update.setFunction(function(v){
_this.onchange(v);
});
// 解放イベント
var event_dispatcher = response.getEventDispatcher();
_event_handler_release = event_dispatcher.createEventHandler("release");
_event_handler_release.setFunction(_this.release);
}
};
// ------------------------------
// 要素を取得
// ------------------------------
_this.getElement = function(){
return _element;
};
// ------------------------------
// テキストノードを取得
// ------------------------------
_this.getTextNode = function(){
return _text_node;
};
// ------------------------------
// テキストノードをセット
// ------------------------------
_this.setTextNode = function(node){
_text_node = node;
};
// ------------------------------
// 更新
// ------------------------------
_this.update = function(){
var v = _response.getCountFollower();
_this.onchange(v);
};
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
// イベント解放
if(_event_handler_update){
_event_handler_update.release();
_event_handler_update = null;
}
if(_event_handler_release){
_event_handler_release.release();
_event_handler_release = null;
}
if(_event_handler_abort){
_event_handler_abort.release();
_event_handler_abort = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
if(_analyze_work){
// 解析辞書除外
AnalyzeWorkClearBbsControl(_analyze_work);
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
if(_element){
removeEventClick();
if(outsider){
DomNodeRemove(_element);
}
_element = null;
}
};
// ------------------------------
// 更新通知
// ------------------------------
_this.onchange = function(v){};
// ------------------------------
// マウスクリック時に実行される関数(内部用)
// ------------------------------
function mouseClick(e){
removeEventClick();
var ary = _response.getFollower();
var num = ary.length;
var i = num - 1;
function f(){
var follower = bbs_dictionary.getResponse(ary[i].getNumber());
follower.erase();
i --;
if(i >= 0){
execute_queue.attachFirst(f,null);
}else{
_this.release();
}
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// クリックイベントを外す(内部用)
// ------------------------------
function removeEventClick(){
if(_element.removeEventListener){
_element.removeEventListener("click",mouseClick);
}else if(_element.detachEvent){
_element.detachEvent("onclick",mouseClick);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element;
var _text_node;
var _analyze_work;
var _observer_remove;
var _response;
var _event_handler_update;
var _event_handler_release;
var _event_handler_abort;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(element){
_element = element;
element = null;
}else{
_element = DocumentCreateElement("span");
}
if(_element.addEventListener){
_element.addEventListener("click",mouseClick);
}else if(_element.attachEvent){
_element.attachEvent("onclick",mouseClick);
}
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element);
// 掲示板コントロール登録
AnalyzeWorkSetBbsControl(_analyze_work,_this);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
if(outsider) attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element);
_observer_remove.setFunction(_this.release);
// 開放イベント
_event_handler_abort = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_abort.setFunction(function(){
_this.release();
});
})();
}
// ------------------------------
// 掲示板コントロール Follower の存在確認
// ------------------------------
function BbsControlFollowerExist(element){
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "follower"){
return true;
}
}
}
}
return false;
}
// ------------------------------
// 掲示板コントロール Follower の検索
// ------------------------------
function BbsControlFollowerSearch(element,func){
var result = null;
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=0;i<num;i++){
// 解析ワーク取得
var work = analyze_work_dictionary.getAnalyzeWork(nodes[i]);
if(work){
var control = AnalyzeWorkGetBbsControl(work);
if(control){
if(control.getType() == "follower"){
result = func(control);
if(result){
return result;
}
}
}
}
}
return result;
}
// ------------------------------
// 掲示板コントロール ReadMoreButton
// ------------------------------
function BbsControlReadMoreButton(){
var _this = this;
// ------------------------------
// タイプを取得
// ------------------------------
_this.getType = function(id){
return "read_more";
};
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
// イベント解放
if(_event_handler_abort){
_event_handler_abort.release();
_event_handler_abort = null;
}
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
if(_analyze_work){
// 解析辞書除外
AnalyzeWorkClearBbsControl(_analyze_work);
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
if(_element){
if(_element.removeEventListener){
_element.removeEventListener("click",mouseClick);
}else if(_element.detachEvent){
_element.detachEvent("onclick",mouseClick);
}
DomNodeRemove(_element);
_element = null;
}
};
// ------------------------------
// 要素取得
// ------------------------------
_this.getElement = function(){
return _element;
};
// ------------------------------
// 待機時間を設定 (単位:ミリ秒)
// ------------------------------
_this.setWaitTime = function(v){
_wait_time = v;
};
// ------------------------------
// 初期化
// ------------------------------
_this.init = function(){
_element.value = "Read More";
_element.disabled = false;
_timer = _getTime();
if(_task){
_task.release();
_task = null;
}
};
// ------------------------------
// マウスクリック時に実行される関数(内部用)
// ------------------------------
function mouseClick(e){
if(_task) return;
_element.disabled = true;
// タスク生成
_task = task_container.createTask();
_task.setExecuteFunc(function(){
var time_sub = _getTime() - _timer;
var t = Math.ceil((_wait_time - time_sub) / 1000);
if(t < 0) t = 0;
_element.value = "wait ... " + t;
if(time_sub > _wait_time){
_task.release();
_task = null;
_element.value = "loading...";
if(_this.onclick){
_this.onclick();
}
}
});
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element;
var _task;
var _onclick;
var _timer;
var _wait_time;
var _analyze_work;
var _observer_remove;
var _event_handler_abort;
var _getTime;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_this.onclick = null;
_timer = 0;
_wait_time = 5000;
// ボタン
_element = DocumentCreateElement("input");
_element.type = "button";
ElementSetStyle(_element,"width:100%; height:50px; margin:25px 0px; padding:0px;");
if(_element.addEventListener){
_element.addEventListener("click",mouseClick);
}else if(_element.attachEvent){
_element.attachEvent("onclick",mouseClick);
}
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element);
// 掲示板コントロール登録
AnalyzeWorkSetBbsControl(_analyze_work,_this);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
// 解析辞書登録
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element);
_observer_remove.setFunction(_this.release);
// 開放イベント
_event_handler_abort = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_abort.setFunction(function(){
_this.release();
});
// 時間取得関数
_getTime = Date.now;
if(!_getTime) _getTime = function(){ return (new Date()).getTime(); };
_this.init();
})();
}
// ------------------------------
// 掲示板コントロール PopupIframe
// ------------------------------
function BbsControlPopupIframe(name){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
release_0();
release_1();
};
// ------------------------------
// 閉じる
// ------------------------------
_this.close = function(){
release_0();
(function(){
if(_fade_task){
_fade_task.release();
_fade_task = null;
}
_fade_task = task_container.createTask();
_fade_task.setDestructorFunc(function(){
_fade_task = null;
});
_fade_task.setExecuteFunc(function(){
_fade_alpha -= 0.2;
if(_fade_alpha < 0.0){
_fade_alpha = 0.0;
_fade_task.release();
release_1();
}
_element_container.style.opacity = _fade_alpha;
});
_fade_task.execute(0xffffffff);
})();
}
// ------------------------------
// 開放 0(内部用)
// ------------------------------
function release_0 (){
_element_iframe.src = "about:blank";
removeEvent();
// イベント解放
if(_event_handler_abort){
_event_handler_abort.release();
_event_handler_abort = null;
}
// マウスイベント無効化
_element_container.style.pointerEvents = "none";
};
// ------------------------------
// 開放 1(内部用)
// ------------------------------
function release_1 (){
DomNodeRemove(_element_container);
// リムーブ監視を破棄
if(_observer_remove){
_observer_remove.release();
_observer_remove = null;
}
// 解析辞書除外
if(_analyze_work){
analyze_work_dictionary.removeAnalyzeWork(_analyze_work);
_analyze_work = null;
}
// タスク破棄
if(_parent_task){
_parent_task.releaseChild();
_parent_task.release();
_parent_task = null;
}
};
// ------------------------------
// IFRAME 要素取得
// ------------------------------
_this.getIFrameElement = function(){
return _element_iframe;
};
// ------------------------------
// サイズをセット
// ------------------------------
_this.setWindowSize = function(w,h){
_element_window.style.width = w + "px";
_element_iframe.style.height = h + "px";
resize();
};
// ------------------------------
// 中断イベント
// ------------------------------
_this.onclose = function(){};
// ------------------------------
// リサイズ(内部用 )
// ------------------------------
function resize(){
var scroll_pos = WindowGetScrollPosition(window);
var client_size = DocumentGetClientSize(document);
var dialog_rect = ElementGetBoundingClientRect(_element_window);
var w = dialog_rect.right - dialog_rect.left;
var h = dialog_rect.bottom - dialog_rect.top;
_element_window.style.left = (client_size.width / 2 - w / 2 + scroll_pos.x) + "px";
if(client_size.height > h){
_element_window.style.top = (client_size.height / 2 - h / 2 + scroll_pos.y) + "px";
_fitted_top = false;
}else{
if(!_fitted_top){
_element_window.style.top = (scroll_pos.y) + "px";
_fitted_top = true;
}
}
}
// ------------------------------
// イベント登録(内部用 )
// ------------------------------
function addEvent(){
// イベントリスナーに対応している
if(window.addEventListener){
window.addEventListener("scroll" ,resize);
window.addEventListener("resize" ,resize);
// アタッチイベントに対応している
}else if(window.attachEvent){
window.attachEvent("onscroll" ,resize);
window.attachEvent("onresize" ,resize);
}
}
// ------------------------------
// イベント破棄(内部用 )
// ------------------------------
function removeEvent(){
// イベントリスナーに対応している
if(window.removeEventListener){
window.removeEventListener("scroll" ,resize);
window.removeEventListener("resize" ,resize);
// アタッチイベントに対応している
}else if(window.detachEvent){
window.detachEvent("onscroll" ,resize);
window.detachEvent("onresize" ,resize);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _element_container;
var _element_background;
var _element_window;
var _element_iframe;
var _button_cancel;
var _observer_remove;
var _event_handler_abort;
var _parent_task;
var _fade_task;
var _fade_alpha;
var _analyze_work;
var _fitted_top;
// ------------------------------
// 初期化
// ------------------------------
(function(){
// コンテナ
_element_container = DocumentCreateElement("div");
ElementSetStyle(_element_container,CSSTextGetInitialDivElement());
// 背景
_element_background = DocumentCreateElement("div");
ElementSetStyle(_element_background,CSSTextGetInitialDivElement());
ElementAddStyle(_element_background,"position:fixed; top:0px; bottom:0px; left:0px; right:0px; opacity:0.5; background:#000; line-height:1.0; z-index:2147483646; pointer-events:inherit;");
_element_container.appendChild(_element_background);
// ウィンドウ
_element_window = DocumentCreateElement("div");
ElementSetStyle(_element_window,CSSTextGetInitialDivElement());
ElementAddStyle(_element_window,"position:absolute; width:600px; padding:25px; background:#00F; background-color:#FFF; border-radius:5px; box-shadow:5px 5px 10px #444; z-index:2147483646; pointer-events:inherit;");
_element_container.appendChild(_element_window);
// インラインフレーム
_element_iframe = DocumentCreateElement("iframe");
_element_iframe.src = "about:blank";
_element_iframe.name = name;
ElementSetStyle(_element_iframe,"width:100%; height:400px; margin-bottom:20px; padding:0px; background:#f8f8f8; pointer-events:inherit;");
_element_window.appendChild(_element_iframe);
// ボタン
_button_cancel = DocumentCreateElement("input");
_button_cancel.type = "button";
_button_cancel.value = "CANCEL";
ElementSetStyle(_button_cancel,CSSTextGetInitialButtonElement());
ElementAddStyle(_button_cancel,"width:100%; height:50px; pointer-events:inherit;");
_element_window.appendChild(_button_cancel);
_button_cancel.onclick = function(){
if(_this.onclose){
_this.onclose();
}
_this.close();
};
// 解析ワーク作成
_analyze_work = AnalyzeWorkCreate(_element_container);
// 解析済み
AnalyzeWorkSetInvalid(_analyze_work);
// 解析辞書登録オプション
var attach_options = new AnalyzeWorkDictionaryAttachOptions();
attach_options.SetOutsider();
analyze_work_dictionary.attachAnalyzeWork(_analyze_work,attach_options);
document.body.appendChild(_element_container);
// イベントを登録
addEvent();
// リサイズ
_this.setWindowSize(640,480);
// リムーブ監視
_observer_remove = new DomNodeObserverRemoveFromDocument(_element_container);
_observer_remove.setFunction(_this.release);
// 開放イベント
_event_handler_abort = page_expand_event_dispatcher.createEventHandler("release");
_event_handler_abort.setFunction(function(){
_this.release();
});
(function(){
// 親タスク
_parent_task = task_container.createTask();
_parent_task.setDestructorFunc(function(){
_parent_task = null;
});
// フェードインタスク
_fade_alpha = 0.0;
_fade_task = task_container.createTask(_parent_task);
_fade_task.setDestructorFunc(function(){
_fade_task = null;
});
_fade_task.setExecuteFunc(function(){
_fade_alpha += 0.2;
if(_fade_alpha > 1.0){
_fade_alpha = 1.0;
_fade_task.release();
}
_element_container.style.opacity = _fade_alpha;
});
_fade_task.execute(0xffffffff);
})();
})();
}
// ------------------------------
// 掲示板コントロールの不要物検索
// ------------------------------
function BbsControlSearchTrash(element,func){
var result = null;
var nodes = ElementGetElementsByTagName(element,"*");
var i;
var num = nodes.length;
for(i=num-1;i>=0;i--){
// 解析ワーク取得
if(analyze_work_dictionary.verifyRemoved(nodes[i])){
result = func(nodes[i]);
if(result){
return result;
}
}
}
return result;
}
// ------------------------------
// レスアンカー番号管理
// ------------------------------
function ResponseAnchorNumbers(){
var _this = this;
// ------------------------------
// 番号追加
// ------------------------------
_this.addNumber = function(number){
var p;
var n;
var list = _list.n;
while(list != _list){
if(list.num >= number) break;
list = list.n;
}
if((list != _list) && (list.num == number)){
}else{
var list_min = {num:number,d:0};
n = list;
p = n.p;
list_min.p = p;
list_min.n = n;
p.n = list_min;
n.p = list_min;
}
};
// ------------------------------
// 範囲追加
// ------------------------------
_this.addNumbers = function(min,max){
if(min > max){
var t = max;
max = min;
min = t;
}
var p;
var n;
var list = _list.n;
while(list != _list){
if(list.num >= min) break;
list = list.n;
}
// 最小値
if((list != _list) && (list.num == min)){
list.d += 1;
}else{
var list_min = {num:min,d:1};
n = list;
p = n.p;
list_min.p = p;
list_min.n = n;
p.n = list_min;
n.p = list_min;
list = list_min;
}
while(list != _list){
if(list.num >= max) break;
list = list.n;
}
// 最大値
if((list != _list) && (list.num == max)){
list.d -= 1;
}else{
var list_max = {num:max,d:-1};
n = list;
p = n.p;
list_max.p = p;
list_max.n = n;
p.n = list_max;
n.p = list_max;
}
};
// ------------------------------
// すべての番号を取得
// ------------------------------
_this.getNumbers = function(func){
var d = 0;
var min = 0;
var max = 0;
var list = _list.n;
while(list != _list){
d += list.d;
if(d == 0){
func(list.num);
}else if(d > 0){
min = list.num;
list = list.n;
while(list != _list){
d += list.d;
if(d == 0){
max = list.num + 1;
break;
}
list = list.n;
}
var i;
for(i=min;i<max;i++){
func(i);
}
}
list = list.n;
}
};
// ------------------------------
// すべての番号を配列形式で取得
// ------------------------------
_this.getNumberList = function(){
var a = new Array();
var d = 0;
var min = 0;
var max = 0;
var list = _list.n;
while(list != _list){
d += list.d;
if(d == 0){
a.push(list.num);
}else if(d > 0){
min = list.num;
list = list.n;
while(list != _list){
d += list.d;
if(d == 0){
max = list.num + 1;
break;
}
list = list.n;
}
var i;
for(i=min;i<max;i++){
a.push(i);
}
}
list = list.n;
}
return a;
};
// ------------------------------
// 総数を取得
// ------------------------------
_this.getCount = function(){
var count = 0;
var d = 0;
var min = 0;
var max = 0;
var list = _list.n;
while(list != _list){
d += list.d;
if(d == 0){
count += 1;
}else if(d > 0){
min = list.num;
list = list.n;
while(list != _list){
d += list.d;
if(d == 0){
max = list.num + 1;
break;
}
list = list.n;
}
count += max - min;
}
list = list.n;
}
return count;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _list;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_list = new Object();
_list.p = _list;
_list.n = _list;
})();
}
// ------------------------------
// InternetExplorer を使用しているか
// ------------------------------
function UserAgentGetInternetExplorer(){
if(window.navigator.userAgent.indexOf("Sleipnir") != -1) return false;
return (window.navigator.userAgent.indexOf("MSIE") != -1);
}
// ------------------------------
// Firefox を使用しているか
// ------------------------------
function UserAgentGetFirefox(){
return (window.navigator.userAgent.indexOf("Firefox") != -1);
}
// ------------------------------
// GoogleChrome を使用しているか
// ------------------------------
function UserAgentGetGoogleChrome(){
return (window.navigator.userAgent.indexOf("Chrome") != -1);
}
// ------------------------------
// Opera を使用しているか
// ------------------------------
function UserAgentGetOpera(){
return (window.navigator.userAgent.indexOf("Opera") != -1);
}
// ------------------------------
// Safari を使用しているか
// ------------------------------
function UserAgentGetSafari(){
if(window.navigator.userAgent.indexOf("Chrome") != -1) return false;
return (window.navigator.userAgent.indexOf("Safari") != -1);
}
// ------------------------------
// Sleipnir を使用しているか
// ------------------------------
function UserAgentGetSleipnir(){
return (window.navigator.userAgent.indexOf("Sleipnir") != -1);
}
// ------------------------------
// ブラウザの言語を調べる
// ------------------------------
function NavigatorGetBrowserLanguage() {
try {
return (window.navigator.browserLanguage || window.navigator.language || window.navigator.userLanguage).substr(0,2);
}
catch(e) {
return undefined;
}
}
// ------------------------------
// XMLHttpRequest オブジェクトを作成する関数
// ------------------------------
function XMLHttpRequestCreate(){
try{
return new XMLHttpRequest();
}catch(e){}
try{
return new ActiveXObject('MSXML2.XMLHTTP.6.0');
}catch(e){}
try{
return new ActiveXObject('MSXML2.XMLHTTP.3.0');
}catch(e){}
try{
return new ActiveXObject('MSXML2.XMLHTTP');
}catch(e){}
return null;
}
// ------------------------------
// GM_xmlhttpRequest のラッパー関数
// ------------------------------
function GM_xmlhttpRequestCreate(){
var _this = this;
// ------------------------------
// リクエストヘッダを設定
// ------------------------------
_this.setRequestHeader = function(name,value){
_param.headers[name] = value;
};
// ------------------------------
// オーバーライドコンテンツタイプを設定
// ------------------------------
_this.overrideMimeType = function(type){
_param.overrideMimeType = type;
};
// ------------------------------
// レスポンスヘッダを取得
// ------------------------------
_this.getResponseHeader = function(label){
return _response_header[label];
};
// ------------------------------
// すべてのレスポンスヘッダを取得
// ------------------------------
_this.getAllResponseHeaders = function(){
return _this.responseHeaders;
};
// ------------------------------
// 開く
// ------------------------------
_this.open = function(method,url){
_param.method = method;
_param.url = url;
};
// ------------------------------
// 送信開始
// ------------------------------
_this.send = function(data){
_param.data = data;
_param.onreadystatechange = function(r){
_this.readyState = r.readyState;
if(r.readyState >= 2){
_this.status = r.status;
}
if(r.readyState == 2){
_this.responseHeaders = r.responseHeaders;
_response_header = ResponseHeadersParseObject(r.responseHeaders);
}
if(r.readyState == 4){
try{
_this.responseText = r.responseText;
}catch(e){}
try{
_this.response = r.response;
}catch(e){}
_this.finalUrl = r.finalUrl;
}
_this.onreadystatechange(r);
};
if(ExecuteAsTrixieUserScript()){
_param.onload = function(r){
_this.readyState = 4;
_this.status = r.status;
_this.responseText = r.responseText;
_this.onreadystatechange(r);
};
_param.onerror = function(r){
_this.readyState = 4;
_this.status = 0;
_this.responseText = "";
_this.onreadystatechange(r);
};
}
if(_this.timeout){
_param.timeout = _this.timeout;
}
if(_this.responseType){
_param.responseType = _this.responseType;
}
try{
GM_xmlhttpRequest(_param);
}catch(e){
_param.onreadystatechange({readyState:4,status:0});
}
};
// ------------------------------
// 状態変更イベント
// ------------------------------
_this.onreadystatechange = function(){};
// ------------------------------
// プライベート変数
// ------------------------------
var _param;
var _response_header;
// ------------------------------
// 初期化
// ------------------------------
_param = new Object();
_response_header = new Object();
_param.headers = new Object();
_this.readyState = 0;
_this.status = 0;
_this.responseHeaders = null;
_this.responseText = "";
if(GM_infoVersionCompare("2.3") >= 0){
_this.responseType = "";
}
}
// ------------------------------
// GM_infoVersion 比較
// ------------------------------
function GM_infoVersionCompare(ver){
try{
var list0 = GM_info.version.split(".");
var list1 = ver.split(".");
var i;
var num = list0.length;
if(num < list1.length) num = list1.length;
for(i=0;i<num;i++){
if(list0[i]) list0[i] = Number(list0[i]);
else list0[i] = 0;
if(list1[i]) list1[i] = Number(list1[i]);
else list1[i] = 0;
}
for(i=0;i<num;i++){
if(list0[i] > list1[i]) return 1;
if(list0[i] < list1[i]) return -1;
}
return 0;
}catch(e){
}
return -1;
}
// ------------------------------
// コンソールにログ出力
// ------------------------------
function ConsoleLog(obj){
if(GM_logSupported()){
GM_log(obj);
return;
}
}
// ------------------------------
// コンソールにエラー出力
// ------------------------------
function ConsoleError(obj){
try{
console.error(obj);
}catch(e){}
}
// ------------------------------
// 文字列から DOMParser を作成
// ------------------------------
function DOMParserCreateFromString(text){
if (window.DOMParser){
var parser = new DOMParser();
return parser.parseFromString(text,"application/xml");
}
try{
var xml_doc = new ActiveXObject("Microsoft.XMLDOM");
xml_doc.async = false;
xml_doc.loadXML(text);
return xml_doc;
}catch(e){}
return null;
}
// ------------------------------
// MutationObserver が利用可能か
// ------------------------------
function MutationObserverSupported(){
try{
if(window.MutationObserver || window.WebKitMutationObserver){
return true;
}
}catch(e){
}
return false;
}
// ------------------------------
// MutationObserver を作成
// ------------------------------
function MutationObserverCreate(func){
try{
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var mutation_observer = new MutationObserver(func);
return mutation_observer;
}catch(e){
}
return null;
}
// ------------------------------
// JSON が利用可能か
// ------------------------------
function JSONSupported(){
try{
if(JSON) return true;
}catch(e){
}
return false;
}
// ------------------------------
// Object から JSON 文字列に変換
// ------------------------------
function JsonStringify(obj){
if(JSONSupported()){
return JSON.stringify(obj);
}
return "";
}
// ------------------------------
// JSON 文字列 から Object に変換
// ------------------------------
function JsonParse(str){
if(JSONSupported()){
return JSON.parse(str);
}
return eval("(" + str + ")");
}
// ------------------------------
// ArrayBuffer から Base64 文字列に変換する関数 (非同期実行)
// ------------------------------
function Base64_From_ArrayBuffer_Async(ary_buffer,callback,options){
var dic = [
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
];
var base64 = [];
var ary_u8 = new Uint8Array( ary_buffer );
var num = ary_u8.length;
var n = 0;
var b = 0;
var increment = 1024;
var onprogress;
if(options){
if(options.increment){
increment = options.increment;
}
onprogress = options.onprogress;
}
var i = 0;
var j = 0;
function f(){
var s = "";
while(i < num){
b = ary_u8[i];
s += dic[(b >> 2)];
n = (b & 0x03) << 4;
i ++;
if(i >= num) break;
b = ary_u8[i];
s += dic[n | (b >> 4)];
n = (b & 0x0f) << 2;
i ++;
if(i >= num) break;
b = ary_u8[i];
s += dic[n | (b >> 6)];
s += dic[(b & 0x3f)];
i ++;
j += 3;
if(j > increment){
j = 0;
base64.push(s);
if(onprogress){
onprogress({loaded:i,total:num});
}
execute_queue.attachFirst(f,null);
return;
}
}
var m = num % 3;
if(m){
s += dic[n];
}
if(m == 1){
s += "==";
}else if(m == 2){
s += "=";
}
base64.push(s);
callback(base64.join(""));
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// x-user-defined 文字列から Base64 文字列に変換する (非同期実行)
// ------------------------------
function Base64_From_XUserDefined_Async(x_user_defined,callback,increment){
var dic = [
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
];
var base64 = [];
var num = x_user_defined.length;
var n = 0;
var b = 0;
if(increment === undefined){
increment = 1024;
}
var i = 0;
var j = 0;
function f(){
var s = "";
while(i < num){
b = x_user_defined.charCodeAt(i) & 0xff;
s += dic[(b >> 2)];
n = (b & 0x03) << 4;
i ++;
if(i >= num) break;
b = x_user_defined.charCodeAt(i) & 0xff;
s += dic[n | (b >> 4)];
n = (b & 0x0f) << 2;
i ++;
if(i >= num) break;
b = x_user_defined.charCodeAt(i) & 0xff;
s += dic[n | (b >> 6)];
s += dic[(b & 0x3f)];
i ++;
j += 3;
if(j > increment){
j = 0;
base64.push(s);
execute_queue.attachFirst(f,null);
return;
}
}
var m = num % 3;
if(m){
s += dic[n];
}
if(m == 1){
s += "==";
}else if(m == 2){
s += "=";
}
base64.push(s);
callback(base64.join(""));
}
execute_queue.attachFirst(f,null);
}
// ------------------------------
// Blob URL を生成
// ------------------------------
function BlobURLCreate (src){
var winow_url = window.URL || window.webkitURL;
if(winow_url){
return winow_url.createObjectURL(src);
}
return null;
}
// ------------------------------
// Blob URL を破棄
// ------------------------------
function BlobURLRevoke (blob_url){
var winow_url = window.URL || window.webkitURL;
if(winow_url){
return winow_url.revokeObjectURL(blob_url);
}
}
// ------------------------------
// CRC32
// ------------------------------
function CRC32 (){
// ------------------------------
// 初期化
// ------------------------------
this.initialize = function (){
_crc32 = 0xffffffff;
_pos = 0;
};
// ------------------------------
// 位置をセット
// ------------------------------
this.setPosition = function (v){
_pos = v;
};
// ------------------------------
// ArrayBuffer から CRC32 を取得
// ------------------------------
this.getFromArrayBuffer = function (buffer,size){
var ary_u8 = new Uint8Array(buffer,_pos,size);
var i;
for (i=0;i<size;i++) {
_crc32 = _table[(_crc32 ^ ary_u8[i]) & 0xff] ^ (_crc32 >>> 8);
}
_pos += size;
return (_crc32 ^ 0xffffffff) >>> 0;
};
// ------------------------------
// バイナリ文字列から CRC32 を取得
// ------------------------------
this.getFromStringOfBinaryData = function (buffer,size){
size += _pos;
while(_pos<size){
_crc32 = _table[(_crc32 ^ (buffer.charCodeAt(_pos) & 0xff)) & 0xff] ^ (_crc32 >>> 8);
_pos ++;
}
return (_crc32 ^ 0xffffffff) >>> 0;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _crc32;
var _pos;
var _table = [
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
];
// ------------------------------
// 初期化
// ------------------------------
this.initialize();
}
// ------------------------------
// 文字列から ArrayBuffer に変換(UTF-8)
// ------------------------------
function String_To_ArrayBuffer_As_UTF8(str){
var i;
var c;
var size = 0;
var num = str.length;
for(i=0;i<num;i++){
c = str.charCodeAt(i);
if(c < 0x80){
size += 1;
}else if(c < 0x800){
size += 2;
}else if(c < 0x10000){
size += 3;
}else if(c < 0x200000){
size += 4;
}else if(c < 0x4000000){
size += 5;
}else{
size += 6;
}
}
var p = 0;
var a = new Uint8Array(size);
for(i=0;i<num;i++){
c = str.charCodeAt(i);
if(c < 0x80){
a[p] = (c & 0x7f) >>> 0;
p += 1;
}else if(c < 0x800){
a[p] = ((c & 0x000007c0) >>> 6) | 0xc0;
p += 1;
a[p] = ((c & 0x0000003f) >>> 0) | 0x80;
p += 1;
}else if(c < 0x10000){
a[p] = ((c & 0x0000f000) >>> 12) | 0xe0;
p += 1;
a[p] = ((c & 0x00000fc0) >>> 6) | 0x80;
p += 1;
a[p] = ((c & 0x0000003f) >>> 0) | 0x80;
p += 1;
}else if(c < 0x200000){
a[p] = ((c & 0x001c0000) >>> 18) | 0xf0;
p += 1;
a[p] = ((c & 0x0003f000) >>> 12) | 0x80;
p += 1;
a[p] = ((c & 0x00000fc0) >>> 6) | 0x80;
p += 1;
a[p] = ((c & 0x0000003f) >>> 0) | 0x80;
p += 1;
}else if(c < 0x4000000){
a[p] = ((c & 0x03000000) >>> 24) | 0xf8;
p += 1;
a[p] = ((c & 0x00fc0000) >>> 18) | 0x80;
p += 1;
a[p] = ((c & 0x0003f000) >>> 12) | 0x80;
p += 1;
a[p] = ((c & 0x00000fc0) >>> 6) | 0x80;
p += 1;
a[p] = ((c & 0x0000003f) >>> 0) | 0x80;
p += 1;
}else{
a[p] = ((c & 0x40000000) >>> 30) | 0xfc;
p += 1;
a[p] = ((c & 0x3f000000) >>> 24) | 0x80;
p += 1;
a[p] = ((c & 0x00fc0000) >>> 18) | 0x80;
p += 1;
a[p] = ((c & 0x0003f000) >>> 12) | 0x80;
p += 1;
a[p] = ((c & 0x00000fc0) >>> 6) | 0x80;
p += 1;
a[p] = ((c & 0x0000003f) >>> 0) | 0x80;
p += 1;
}
}
return a.buffer;
}
// ------------------------------
// レスポンスヘッダから Object に変換
// ------------------------------
function ResponseHeadersParseObject(str){
var o = new Object();
if(!str) return o;
// 改行コードを統一
var s = str.replace(/\r\n?/g,"\n");
var a = s.split("\n");
var i;
var num = a.length;
for(i=0;i<num;i++){
var m = a[i].match(new RegExp("^(.*):[ ](.*)$","i"));
if(m){
o[m[1]] = m[2];
}
}
return o;
}
// ------------------------------
// Trixie のユーザースクリプトとして動作しているか
// ------------------------------
function ExecuteAsTrixieUserScript(){
try{
if(GM_xmlhttpRequest.toString().match(/TrixieXmlHttp/)) return true;
}catch(e){
}
return false;
}
// ------------------------------
// JScript として動作しているか
// ------------------------------
function ExecuteAsJScript(){
try{
if(ScriptEngineMajorVersion() > 0) return true;
}catch(e){
}
return false;
}
// ------------------------------
// GM_xmlhttpRequest が利用可能か
// ------------------------------
function GM_xmlhttpRequestSupported(){
try{
if(GM_xmlhttpRequest) return true;
}catch(e){
}
return false;
}
// ------------------------------
// GM_getValue が利用可能か
// ------------------------------
function GM_getValueSupported(){
try{
if(GM_getValue) return true;
}catch(e){
}
return false;
}
// ------------------------------
// GM_setValue が利用可能か
// ------------------------------
function GM_setValueSupported(){
try{
if(GM_setValue) return true;
}catch(e){
}
return false;
}
// ------------------------------
// GM_deleteValue が利用可能か
// ------------------------------
function GM_deleteValueSupported(){
try{
if(GM_deleteValue) return true;
}catch(e){
}
return false;
}
// ------------------------------
// GM_log が利用可能か
// ------------------------------
function GM_logSupported(){
try{
if(GM_log) return true;
}catch(e){
}
return false;
}
// ------------------------------
// GM_registerMenuCommand が利用可能か
// ------------------------------
function GM_registerMenuCommandSupported(){
try{
if(GM_registerMenuCommand) return true;
}catch(e){
}
return false;
}
// ------------------------------
// ローカルストレージからロード
// ------------------------------
function LocalStorageGetItem(key,func){
function LocalStorageLoad(){
var result = new Object();
try{
if(window.localStorage){
result.value = localStorage.getItem(key);
result.result = true;
}else{
result.result = false;
result.message = "Do not support storage.";
}
}catch(e){
result.result = false;
result.message = e;
}
func(result);
}
if(GM_getValueSupported()){
func({result:true,value:GM_getValue(key,undefined)});
}else{
func({result:false,message:"Do not support storage."});
}
}
// ------------------------------
// ローカルストレージからセーブ
// ------------------------------
function LocalStorageSetItem(key,str,func){
function LocalStorageSave(){
var result = new Object();
try{
if(window.localStorage){
localStorage.setItem(key,str);
result.result = true;
}else{
result.result = false;
result.message = "Do not support storage.";
}
}catch(e){
result.result = false;
result.message = e;
}
func(result);
}
var result = new Object();
if(GM_setValueSupported()){
try{
GM_setValue(key,str);
result.result = true;
}catch(e){
result.result = false;
result.message = e;
}
}else{
result.result = false;
result.message = "Do not support storage.";
}
func(result);
}
// ------------------------------
// ローカルストレージから削除
// ------------------------------
function LocalStorageRemoveItem(key,func){
function LocalStorageDelete(){
var result = new Object();
try{
if(window.localStorage){
localStorage.removeItem(key);
result.result = true;
}else{
result.result = false;
result.message = "Do not support storage.";
}
}catch(e){
result.result = false;
result.message = e;
}
func(result);
}
var result = new Object();
if(GM_deleteValueSupported()){
try{
GM_deleteValue(key);
result.result = true;
}catch(e){
result.result = false;
result.message = e;
}
}else{
result.result = false;
result.message = "Do not support storage.";
}
func(result);
}
// ------------------------------
// 同期ストレージからロード
// ------------------------------
function SyncStorageGetItem(key,func){
}
// ------------------------------
// 同期ストレージからセーブ
// ------------------------------
function SyncStorageSetItem(key,str,func){
}
// ------------------------------
// 同期ストレージから削除
// ------------------------------
function SyncStorageRemoveItem(key,func){
}
// ------------------------------
// 全角アルファベットから半角アルファベットに変換
// ------------------------------
function StringConvertFromAlphabeticFullToAlphabeticHalf(s){
var r;
r = new RegExp("[a-zA-Z]","g");
return s.replace(r, function(c){
return String.fromCharCode(c.charCodeAt(0) - 65248);
});
}
// ------------------------------
// 半角アルファベットから全角アルファベットに変換
// ------------------------------
function StringConvertFromAlphabeticHalfToAlphabeticFull(s){
var r;
r = new RegExp("[a-zA-Z-.]","g");
return s.replace(r, function(c){
return String.fromCharCode(c.charCodeAt(0) + 65248);
});
}
// ------------------------------
// 全角数字から半角数字に変換
// ------------------------------
function StringConvertFromNumericFullToNumericHalf(s){
var r;
r = new RegExp("[0-9-.]","g");
return s.replace(r, function(c){
return String.fromCharCode(c.charCodeAt(0) - 65248);
});
}
// ------------------------------
// 半角英数字から全角英数字に変換
// ------------------------------
function StringConvertFromNumericHalfToNumericFull(s){
var r;
r = new RegExp("[0-9]","g");
return s.replace(r, function(c){
return String.fromCharCode(c.charCodeAt(0) + 65248);
});
}
// ------------------------------
// 全角記号から半角記号に変換
// ------------------------------
function StringConvertFromSignFullToSignHalf(s){
s = s.replace(/”/g, "\"");
s = s.replace(/’/g, "\'");
s = s.replace(/¥/g, "\\");
var r = new RegExp("[!-/:-@[-`{-~]","g");
return s.replace(r, function(c){
return String.fromCharCode(c.charCodeAt(0) - 65248);
});
}
// ------------------------------
// 半角記号から全角記号に変換
// ------------------------------
function StringConvertFromSignHalfToSignFull(s){
s = s.replace(/\"/g, "”");
s = s.replace(/\'/g, "’");
s = s.replace(/\\/g, "¥");
var r = new RegExp("[!-/:-@\[-`\{-~]","g");
return s.replace(r, function(c){
return String.fromCharCode(c.charCodeAt(0) + 65248);
});
}
// ------------------------------
// 全角スペースから半角スペースに変換
// ------------------------------
function StringConvertFromSpaceFullToSpaceHalf(s){
return s.replace(/ /g, " ");
}
// ------------------------------
// 半角スペースから全角スペースに変換
// ------------------------------
function StringConvertFromSpaceHalfToSpaceFull(s){
return s.replace(/ /g, " ");
}
// ------------------------------
// 半角カタカナから全角カタカナに変換
// ------------------------------
function StringConvertFromKatakanaFullToKatakanaHalf(s){
var r;
var code;
var data;
// 濁点
data = ["ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ヅ","デ","ド","バ","ビ","ブ","ベ","ボ"];
r = new RegExp("ガ|ギ|グ|ゲ|ゴ|ザ|ジ|ズ|ゼ|ゾ|ダ|ヂ|ヅ|デ|ド|バ|ビ|ブ|ベ|ボ","g");
s = s.replace(r, function(c){
code = c.charCodeAt(0);
if(code <= 65409) return data[code-65398];
if(code >= 65418) return data[code-65418 + 15];
return data[code-65410 + 12];
});
// 半濁点
data = ["パ","ピ","プ","ペ","ポ"];
r = new RegExp("パ|ピ|プ|ペ|ポ","g");
s = s.replace(r, function(c){
code = c.charCodeAt(0);
return data[code-65418];
});
// その他
data = ["。","「","」","、","・","ヲ","ァ","ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ","ー","ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ","タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ン","゛","゜"];
r = new RegExp("[。-゚]","g");
s = s.replace(r, function(c){
return data[c.charCodeAt(0)-65377];
});
return s;
}
// ------------------------------
// 全角カタカナから半角カタカナに変換
// ------------------------------
function StringConvertFromKatakanaHalfToKatakanaFull(s){
var data = new Object();
data["。"] = "。"; data["「"] = "「"; data["」"] = "」"; data["、"] = "、"; data["・"] = "・";
data["ヲ"] = "ヲ";
data["ァ"] = "ァ"; data["ィ"] = "ィ"; data["ゥ"] = "ゥ"; data["ェ"] = "ェ"; data["ォ"] = "ォ";
data["ャ"] = "ャ"; data["ュ"] = "ュ"; data["ョ"] = "ョ"; data["ッ"] = "ッ"; data["ー"] = "ー";
data["ア"] = "ア"; data["イ"] = "イ"; data["ウ"] = "ウ"; data["エ"] = "エ"; data["オ"] = "オ";
data["カ"] = "カ"; data["キ"] = "キ"; data["ク"] = "ク"; data["ケ"] = "ケ"; data["コ"] = "コ";
data["サ"] = "サ"; data["シ"] = "シ"; data["ス"] = "ス"; data["セ"] = "セ"; data["ソ"] = "ソ";
data["タ"] = "タ"; data["チ"] = "チ"; data["ツ"] = "ツ"; data["テ"] = "テ"; data["ト"] = "ト";
data["ナ"] = "ナ"; data["ニ"] = "ニ"; data["ヌ"] = "ヌ"; data["ネ"] = "ネ"; data["ノ"] = "ノ";
data["ハ"] = "ハ"; data["ヒ"] = "ヒ"; data["フ"] = "フ"; data["ヘ"] = "ヘ"; data["ホ"] = "ホ";
data["マ"] = "マ"; data["ミ"] = "ミ"; data["ム"] = "ム"; data["メ"] = "メ"; data["モ"] = "モ";
data["ヤ"] = "ヤ"; data["ユ"] = "ユ"; data["ヨ"] = "ヨ";
data["ラ"] = "ラ"; data["リ"] = "リ"; data["ル"] = "ル"; data["レ"] = "レ"; data["ロ"] = "ロ";
data["ワ"] = "ワ"; data["ン"] = "ン"; data["゛"] = "゙"; data["゜"] = "゚";
data["ガ"] = "ガ"; data["ギ"] = "ギ"; data["グ"] = "グ"; data["ゲ"] = "ゲ"; data["ゴ"] = "ゴ";
data["ザ"] = "ザ"; data["ジ"] = "ジ"; data["ズ"] = "ズ"; data["ゼ"] = "ゼ"; data["ゾ"] = "ゾ";
data["ダ"] = "ダ"; data["ヂ"] = "ヂ"; data["ヅ"] = "ヅ"; data["デ"] = "デ"; data["ド"] = "ド";
data["バ"] = "バ"; data["ビ"] = "ビ"; data["ブ"] = "ブ"; data["ベ"] = "ベ"; data["ボ"] = "ボ";
data["パ"] = "パ"; data["ピ"] = "ピ"; data["プ"] = "プ"; data["ペ"] = "ペ"; data["ポ"] = "ポ";
var r = new RegExp("[、。「」゛゜ァ-ロワヲン・ー]","g");
return s.replace(r, function(c){
return data[c];
});
}
// ------------------------------
// ひらがなからカタカナに変換
// ------------------------------
function StringConvertFromHiraganaToKatakana(s){
var r = new RegExp("[ぁ-ん]","g");
return s.replace(r, function(c){
return String.fromCharCode(c.charCodeAt(0) + 96);
});
}
// ------------------------------
// カタカナからひらがなに変換
// ------------------------------
function StringConvertFromKatakanaToHiragana(s){
var r = new RegExp("[ァ-ン]","g");
return s.replace(r, function(c){
return String.fromCharCode(c.charCodeAt(0) - 96);
});
}
// ------------------------------
// 文字列を評価して配列関数を作成
// ------------------------------
function StringEvalArrayFunction(src){
try{
var a = eval(src);
if(typeof(a) == "function") return [a];
var check = false;
if((a) && (typeof(a) == "object")){
if(a.constructor == Array){
var ary = new Array();
var i;
var num = a.length;
for(i=0;i<num;i++){
if(typeof(a[i]) == "function"){
ary.push(a[i]);
}
}
return ary;
}
}
}catch(e){}
return [];
}
// ------------------------------
// 文字列からクエリーを取得
// ------------------------------
function StringGetQuery(url){
var q = new Object();
var m = url.match(new RegExp("[?](.*?)(#|$)"));
if(!m) return q;
var a = m[1].split('&');
var i;
var num = a.length;
for(i=0;i<num;i++){
var b = a[i].split('=');
if(b.length == 2){
q[b[0]] = b[1];
}
}
return q;
}
// ------------------------------
// 文字列とアスタリスク付きワードとが一致するか調べる
// ------------------------------
function StringMatchAsteriskWord(src,w){
var i_num = src.length;
var j_num = w.length;
var i=0;
var j=0;
var n;
var l;
n = w.indexOf("*");
if(n < 0){
return (src == w);
}else if(n > 0){
var l = n - j;
n = src.indexOf(w.substring(j,n),i);
if(n != 0){
return false;
}
i = n + l;
j = j + l;
}
while(true){
while(true){
j ++;
n = w.indexOf("*",j);
if(n != j ){
break;
}
}
if(n < 0){
if(j >= j_num){
return true;
}else{
n = j_num;
}
}
l = n - j;
n = src.indexOf(w.substring(j,n),i);
if(n < 0){
return false;
}
i = n + l;
j = j + l ;
}
return false;
}
// ------------------------------
// URL 文字列とアスタリスク付きワードとが一致するか調べる
// ------------------------------
function StringUrlMatchAsteriskWord(src,w){
var ary = new Array();
var r = new RegExp(":|\/|[.]|[?]|#|[*]+","i");
while(true){
var m = w.match(r);
if(m){
if(RegExp.leftContext){
ary.push(RegExp.leftContext);
}
if(m[0].charAt(0) == '*') ary.push('*');
else ary.push(m[0]);
w = RegExp.rightContext;
continue;
}
if(w){
ary.push(w);
}
break;
}
var i;
var num = src.length;
var p = 0;
while(true){
w = ary.shift();
if(!w){
if(p >= num) return true;
return false;
}
if(w == '*'){
w = ary.shift();
if(!w) return true;
i = src.indexOf(w,p);
if(i < 0) return false;
p = i + w.length;
}else{
if(src.indexOf(w,p) != p) return false;
p += w.length;
}
}
}
// ------------------------------
// URLアスタリスク付きワードから正規表現配列を取得
// ------------------------------
function StringRegExpListFromAsteriskWord(w){
var str = "^";
var ary = new Array();
var r = new RegExp(":|\/|[.]|[?]|#|[*]+");
while(true){
var m = w.match(r);
if(m){
if(m[0].charAt(0) == '*'){
str += RegExp.leftContext + ".*?";
}else{
str += RegExp.leftContext + "[" + m[0] + "]";
ary.push(new RegExp(str));
str = "^";
}
w = RegExp.rightContext;
}else{
m = w.match(new RegExp("(.*)$"));
if(m[0] || (str.length > 1)){
str += m[0] + "$";
ary.push(new RegExp(str));
break;
}
break;
}
}
return ary;
}
// ------------------------------
// URL 文字列とアスタリスク付きワードとが一致するか調べる
// ------------------------------
function StringUrlMatchRegExpList(src,ary){
var i;
var num = ary.length;
var m;
for(i=0;i<num;i++){
m = src.match(ary[i]);
if(!m) return false;
src = RegExp.rightContext;
}
if(src == "") return true;
return false;
}
// ------------------------------
// URL アドレスを絶対 URL に変換
// ------------------------------
function StringUrl_To_Absolute(src,url,base){
if(!src) src = "";
if(!url) url = "";
if(!base) base = "";
var m = url.match(new RegExp("^.*/","i"));
if(!m) return "";
var path = m[0];
var m = url.match(new RegExp("^[^:]+://[^/]+/","i"));
if(!m) return "";
var root = m[0];
var m = url.match(new RegExp("^[^:]+:","i"));
if(!m) return "";
var protocol = m[0];
var m = base.match(new RegExp(".*/","i"));
if(m) base = m[0];
if(base.indexOf("//") == 0){
base = protocol + base;
}else if(base.indexOf("/") == 0){
base = root + base.substr(1);
}else{
base = path + base;
}
if(src.indexOf("//") == 0){
return protocol + src;
}else if(src.indexOf("/") == 0){
return root + src.substr(1);
}else if(src.match(new RegExp("^[a-z]+:[^/]","i"))){
return src;
}else if(src.match(new RegExp("://","i"))){
return src;
}
return base + src;
}
// ------------------------------
// 属性辞書 HTML5
// ------------------------------
var DICTIONARY_ATTRIBUTE_HTML5 = {
globals :{ "accesskey":true, "class":true, "contenteditable":true, "dir":true, "draggable":true, "dropzone":true, "hidden":true, "id":true, "lang":true, "spellcheck":true, "style":true, "tabindex":true, "title":true, "translate":true },
elements:{
"A":{
allow:true,
attributes:{ "href":true, "target":true, "download":true, "rel":true, "hreflang":true, "type":true }
},
"ABBR":{
allow:true,
attributes:{ }
},
"ADDRESS":{
allow:true,
attributes:{ }
},
"AREA":{
allow:true,
attributes:{ "alt":true, "coords":true, "shape":true, "href":true, "target":true, "download":true, "rel":true, "hreflang":true, "type":true }
},
"ARTICLE":{
allow:true,
attributes:{ }
},
"ASIDE":{
allow:true,
attributes:{ }
},
"AUDIO":{
allow:true,
attributes:{ "src":true, "crossorigin":true, "preload":true, "autoplay":true, "mediagroup":true, "loop":true, "muted":true, "controls":true }
},
"B":{
allow:true,
attributes:{ }
},
"BASE":{
allow:true,
attributes:{ "href":true, "target":true }
},
"BDI":{
allow:true,
attributes:{ }
},
"BDO":{
allow:true,
attributes:{ }
},
"BLOCKQUOTE":{
allow:true,
attributes:{ "cite":true }
},
"BODY":{
allow:false,
attributes:{ }
},
"BR":{
allow:true,
attributes:{ }
},
"BUTTON":{
allow:true,
attributes:{ "autofocus":true, "disabled":true, "form":true, "formaction":true, "formenctype":true, "formmethod":true, "formnovalidate":true, "formtarget":true, "name":true, "type":true, "value":true }
},
"CANVAS":{
allow:true,
attributes:{ "width":true, "height":true }
},
"CAPTION":{
allow:true,
attributes:{ }
},
"CITE":{
allow:true,
attributes:{ }
},
"CODE":{
allow:true,
attributes:{ }
},
"COL":{
allow:true,
attributes:{ "span":true }
},
"COLGROUP":{
allow:true,
attributes:{ "span":true }
},
"DATA":{
allow:true,
attributes:{ "value":true }
},
"DATALIST":{
allow:true,
attributes:{ }
},
"DD":{
allow:true,
attributes:{ }
},
"DEL":{
allow:true,
attributes:{ "cite":true, "datetime":true }
},
"DETAILS":{
allow:true,
attributes:{ "open":true }
},
"DFN":{
allow:true,
attributes:{ }
},
"DIALOG":{
allow:true,
attributes:{ "open":true }
},
"DIV":{
allow:true,
attributes:{ }
},
"DL":{
allow:true,
attributes:{ }
},
"DT":{
allow:true,
attributes:{ }
},
"EM":{
allow:true,
attributes:{ }
},
"EMBED":{
allow:false,
attributes:{ "src":true, "type":true, "width":true, "height":true, "any*":true }
},
"FIELDSET":{
allow:true,
attributes:{ "disabled":true, "form":true, "name":true }
},
"FIGCAPTION":{
allow:true,
attributes:{ }
},
"FIGURE":{
allow:true,
attributes:{ }
},
"FOOTER":{
allow:true,
attributes:{ }
},
"FORM":{
allow:true,
attributes:{ "accept-charset":true, "action":true, "autocomplete":true, "enctype":true, "method":true, "name":true, "novalidate":true, "target":true }
},
"H1":{
allow:true,
attributes:{ }
},
"H2":{
allow:true,
attributes:{ }
},
"H3":{
allow:true,
attributes:{ }
},
"H4":{
allow:true,
attributes:{ }
},
"H5":{
allow:true,
attributes:{ }
},
"H6":{
allow:true,
attributes:{ }
},
"HEAD":{
allow:false,
attributes:{ }
},
"HEADER":{
allow:true,
attributes:{ }
},
"HR":{
allow:true,
attributes:{ }
},
"HTML":{
allow:false,
attributes:{ "manifest":true }
},
"I":{
allow:true,
attributes:{ }
},
"IFRAME":{
allow:false,
attributes:{ "src":true, "srcdoc":true, "name":true, "sandbox":true, "seamless":true, "width":true, "height":true }
},
"IMG":{
allow:true,
attributes:{ "alt":true, "src":true, "crossorigin":true, "usemap":true, "ismap":true, "width":true, "height":true }
},
"INPUT":{
allow:true,
attributes:{ "accept":true, "alt":true, "autocomplete":true, "autofocus":true, "checked":true, "dirname":true, "disabled":true, "form":true, "formaction":true, "formenctype":true, "formmethod":true, "formnovalidate":true, "formtarget":true, "height":true, "list":true, "max":true, "maxlength":true, "min":true, "minlength":true, "multiple":true, "name":true, "pattern":true, "placeholder":true, "readonly":true, "required":true, "size":true, "src":true, "step":true, "type":true, "value":true, "width":true }
},
"INS":{
allow:true,
attributes:{ "cite":true, "datetime":true }
},
"KBD":{
allow:true,
attributes:{ }
},
"KEYGEN":{
allow:true,
attributes:{ "autofocus":true, "challenge":true, "disabled":true, "form":true, "keytype":true, "name":true }
},
"LABEL":{
allow:true,
attributes:{ "form":true, "for":true }
},
"LEGEND":{
allow:true,
attributes:{ }
},
"LI":{
allow:true,
attributes:{ "value*":true }
},
"LINK":{
allow:true,
attributes:{ "href":true, "crossorigin":true, "rel":true, "media":true, "hreflang":true, "type":true, "sizes":true }
},
"MAIN":{
allow:true,
attributes:{ "":true }
},
"MAP":{
allow:true,
attributes:{ "name":true }
},
"MARK":{
allow:true,
attributes:{ }
},
"META":{
allow:true,
attributes:{ "name":true, "http-equiv":true, "content":true, "charset":true }
},
"METER":{
allow:true,
attributes:{ "value":true, "min":true, "max":true, "low":true, "high":true, "optimum":true }
},
"NAV":{
allow:true,
attributes:{ }
},
"NOSCRIPT":{
allow:true,
attributes:{ }
},
"OBJECT":{
allow:true,
attributes:{ "data":true, "type":true, "typemustmatch":true, "name":true, "usemap":true, "form":true, "width":true, "height":true }
},
"OL":{
allow:true,
attributes:{ "reversed":true, "start":true, "type":true }
},
"OPTGROUP":{
allow:true,
attributes:{ "disabled":true, "label":true }
},
"OPTION":{
allow:true,
attributes:{ "disabled":true, "label":true, "selected":true, "value":true }
},
"OUTPUT":{
allow:true,
attributes:{ "for":true, "form":true, "name":true }
},
"P":{
allow:true,
attributes:{ }
},
"PARAM":{
allow:true,
attributes:{ "name":true, "value":true }
},
"PRE":{
allow:true,
attributes:{ }
},
"PROGRESS":{
allow:true,
attributes:{ "value":true, "max":true }
},
"Q":{
allow:true,
attributes:{ "cite":true }
},
"RB":{
allow:true,
attributes:{ }
},
"RP":{
allow:true,
attributes:{ }
},
"RT":{
allow:true,
attributes:{ }
},
"RTC":{
allow:true,
attributes:{ }
},
"RUBY":{
allow:true,
attributes:{ }
},
"S":{
allow:true,
attributes:{ }
},
"SAMP":{
allow:true,
attributes:{ }
},
"SCRIPT":{
allow:false,
attributes:{ "src":true, "type":true, "charset":true, "async":true, "defer":true, "crossorigin":true }
},
"SECTION":{
allow:true,
attributes:{ }
},
"SELECT":{
allow:true,
attributes:{ "autofocus":true, "disabled":true, "form":true, "multiple":true, "name":true, "required":true, "size":true }
},
"SMALL":{
allow:true,
attributes:{ }
},
"SOURCE":{
allow:true,
attributes:{ "src":true, "type":true, "media":true }
},
"SPAN":{
allow:true,
attributes:{ }
},
"STRONG":{
allow:true,
attributes:{ }
},
"STYLE":{
allow:false,
attributes:{ "media":true, "type":true, "scoped":true }
},
"SUB":{
allow:true,
attributes:{ }
},
"SUMMARY":{
allow:true,
attributes:{ }
},
"SUP":{
allow:true,
attributes:{ }
},
"TABLE":{
allow:true,
attributes:{ "border":true }
},
"TBODY":{
allow:true,
attributes:{ }
},
"TD":{
allow:true,
attributes:{ "colspan":true, "rowspan":true, "headers":true }
},
"TEMPLATE":{
allow:true,
attributes:{ }
},
"TEXTAREA":{
allow:true,
attributes:{ "autofocus":true, "cols":true, "dirname":true, "disabled":true, "form":true, "maxlength":true, "minlength":true, "name":true, "placeholder":true, "readonly":true, "required":true, "rows":true, "wrap":true }
},
"TFOOT":{
allow:true,
attributes:{ }
},
"TH":{
allow:true,
attributes:{ "colspan":true, "rowspan":true, "headers":true, "scope":true, "abbr":true }
},
"THEAD":{
allow:true,
attributes:{ }
},
"TIME":{
allow:true,
attributes:{ "datetime":true }
},
"TITLE":{
allow:true,
attributes:{ }
},
"TR":{
allow:true,
attributes:{ }
},
"TRACK":{
allow:true,
attributes:{ "default":true, "kind":true, "label":true, "src":true, "srclang":true }
},
"U":{
allow:true,
attributes:{ }
},
"UL":{
allow:true,
attributes:{ }
},
"VAR":{
allow:true,
attributes:{ }
},
"VIDEO":{
allow:true,
attributes:{ "src":true, "crossorigin":true, "poster":true, "preload":true, "autoplay":true, "mediagroup":true, "loop":true, "muted":true, "controls":true, "width":true, "height":true }
},
"WBR":{
allow:true,
attributes:{ }
}
}
};
// ------------------------------
// 属性辞書 HTML4.1
// ------------------------------
var DICTIONARY_ATTRIBUTE_HTML4 = {
globals :{ "class":true, "dir":true, "id":true, "lang":true, "style":true, "title":true },
elements:{
"A":{
allow:true,
attributes:{ "accesskey":true, "charset":true, "coords":true, "href":true, "hreflang":true, "name":true, "rel":true, "rev":true, "shape":true, "tabindex":true, "target":true, "type":true }
},
"ABBR":{
allow:true,
attributes:{ }
},
"ACRONYM":{
allow:true,
attributes:{ }
},
"ADDRESS":{
allow:true,
attributes:{ }
},
"APPLET":{
allow:false,
attributes:{ "align":true, "alt":true, "archive":true, "code":true, "codebase":true, "height":true, "hspace":true, "name":true, "object":true, "vspace":true, "width":true }
},
"AREA":{
allow:true,
attributes:{ "accesskey":true, "alt":true, "coords":true, "href":true, "nohref":true, "shape":true, "tabindex":true, "target":true }
},
"B":{
allow:true,
attributes:{ }
},
"BASE":{
allow:true,
attributes:{ "href":true, "target":true }
},
"BASEFONT":{
allow:true,
attributes:{ "color":true, "face":true, "size":true }
},
"BDO":{
allow:true,
attributes:{ "dir":true }
},
"BIG":{
allow:true,
attributes:{ }
},
"BLOCKQUOTE":{
allow:true,
attributes:{ "cite":true }
},
"BODY":{
allow:false,
attributes:{ "alink":true, "background":true, "bgcolor":true, "link":true, "text":true, "vlink":true }
},
"BR":{
allow:true,
attributes:{ "clear":true }
},
"BUTTON":{
allow:true,
attributes:{ "accesskey":true, "disabled":true, "name":true, "tabindex":true, "type":true, "value":true }
},
"CAPTION":{
allow:true,
attributes:{ "align":true }
},
"CENTER":{
allow:true,
attributes:{ }
},
"CITE":{
allow:true,
attributes:{ }
},
"CODE":{
allow:true,
attributes:{ }
},
"COL":{
allow:true,
attributes:{ "align":true, "char":true, "charoff":true, "span":true, "valign":true, "width":true }
},
"COLGROUP":{
allow:true,
attributes:{ "align":true, "char":true, "charoff":true, "span":true, "valign":true, "width":true }
},
"DD":{
allow:true,
attributes:{ }
},
"DEL":{
allow:true,
attributes:{ "cite":true, "datetime":true }
},
"DFN":{
allow:true,
attributes:{ }
},
"DIR":{
allow:true,
attributes:{ "compact":true }
},
"DIV":{
allow:true,
attributes:{ "align":true }
},
"DL":{
allow:true,
attributes:{ "compact":true }
},
"DT":{
allow:true,
attributes:{ }
},
"EM":{
allow:true,
attributes:{ }
},
"FIELDSET":{
allow:true,
attributes:{ }
},
"FONT":{
allow:true,
attributes:{ "color":true, "face":true, "size":true }
},
"FORM":{
allow:true,
attributes:{ "accept-charset":true, "accept":true, "action":true, "enctype":true, "method":true, "name":true, "target":true }
},
"FRAME":{
allow:false,
attributes:{ "frameborder":true, "longdesc":true, "marginheight":true, "marginwidth":true, "name":true, "noresize":true, "scrolling":true, "src":true }
},
"FRAMESET":{
allow:false,
attributes:{ "cols":true, "rows":true }
},
"H1":{
allow:true,
attributes:{ "align":true }
},
"H2":{
allow:true,
attributes:{ "align":true }
},
"H3":{
allow:true,
attributes:{ "align":true }
},
"H4":{
allow:true,
attributes:{ "align":true }
},
"H5":{
allow:true,
attributes:{ "align":true }
},
"H6":{
allow:true,
attributes:{ "align":true }
},
"HEAD":{
allow:false,
attributes:{ "profile":true }
},
"HR":{
allow:true,
attributes:{ "align":true, "noshade":true, "size":true, "width":true }
},
"HTML":{
allow:false,
attributes:{ "version":true }
},
"I":{
allow:true,
attributes:{ }
},
"IFRAME":{
allow:false,
attributes:{ "align":true, "frameborder":true, "height":true, "longdesc":true, "marginheight":true, "marginwidth":true, "name":true, "scrolling":true, "src":true, "width":true }
},
"IMG":{
allow:true,
attributes:{ "align":true, "alt":true, "border":true, "height":true, "hspace":true, "ismap":true, "longdesc":true, "name":true, "src":true, "usemap":true, "vspace":true, "width":true }
},
"INPUT":{
allow:true,
attributes:{ "accept":true, "accesskey":true, "align":true, "alt":true, "checked":true, "disabled":true, "ismap":true, "maxlength":true, "name":true, "readonly":true, "size":true, "src":true, "tabindex":true, "type":true, "usemap":true, "value":true }
},
"INS":{
allow:true,
attributes:{ "cite":true, "datetime":true }
},
"ISINDEX":{
allow:true,
attributes:{ "prompt":true }
},
"KBD":{
allow:true,
attributes:{ }
},
"LABEL":{
allow:true,
attributes:{ "accesskey":true, "for":true }
},
"LEGEND":{
allow:true,
attributes:{ "accesskey":true, "align":true }
},
"LI":{
allow:true,
attributes:{ "type":true, "value":true }
},
"LINK":{
allow:true,
attributes:{ "charset":true, "href":true, "hreflang":true, "media":true, "rel":true, "rev":true, "target":true, "type":true }
},
"MAP":{
allow:true,
attributes:{ "name":true }
},
"MENU":{
allow:true,
attributes:{ "compact":true }
},
"META":{
allow:true,
attributes:{ "content":true, "http-equiv":true, "name":true, "scheme":true }
},
"NOFRAMES":{
allow:true,
attributes:{ }
},
"NOSCRIPT":{
allow:true,
attributes:{ }
},
"OBJECT":{
allow:false,
attributes:{ "align":true, "archive":true, "border":true, "classid":true, "codebase":true, "codetype":true, "data":true, "declare":true, "height":true, "hspace":true, "name":true, "standby":true, "tabindex":true, "type":true, "usemap":true, "vspace":true, "width":true }
},
"OL":{
allow:true,
attributes:{ "compact":true, "start":true, "type":true }
},
"OPTGROUP":{
allow:true,
attributes:{ "disabled":true, "label":true }
},
"OPTION":{
allow:true,
attributes:{ "disabled":true, "label":true, "selected":true, "value":true }
},
"P":{
allow:true,
attributes:{ "align":true }
},
"PARAM":{
allow:true,
attributes:{ "name":true, "type":true, "value":true, "valuetype":true }
},
"PRE":{
allow:true,
attributes:{ "width":true }
},
"Q":{
allow:true,
attributes:{ "cite":true }
},
"S":{
allow:true,
attributes:{ }
},
"SAMP":{
allow:true,
attributes:{ }
},
"SCRIPT":{
allow:false,
attributes:{ "charset":true, "defer":true, "language":true, "src":true, "type":true }
},
"SELECT":{
allow:true,
attributes:{ "disabled":true, "multiple":true, "name":true, "size":true, "tabindex":true }
},
"SMALL":{
allow:true,
attributes:{ }
},
"SPAN":{
allow:true,
attributes:{ }
},
"STRIKE":{
allow:true,
attributes:{ }
},
"STRONG":{
allow:true,
attributes:{ }
},
"STYLE":{
allow:false,
attributes:{ "media":true, "type":true }
},
"SUB":{
allow:true,
attributes:{ }
},
"SUP":{
allow:true,
attributes:{ }
},
"TABLE":{
allow:true,
attributes:{ "align":true, "bgcolor":true, "border":true, "cellpadding":true, "cellspacing":true, "frame":true, "rules":true, "summary":true, "width":true }
},
"TBODY":{
allow:true,
attributes:{ "align":true, "char":true, "charoff":true, "valign":true }
},
"TD":{
allow:true,
attributes:{ "abbr":true, "align":true, "axis":true, "bgcolor":true, "char":true, "charoff":true, "colspan":true, "headers":true, "height":true, "nowrap":true, "rowspan":true, "scope":true, "valign":true, "width":true }
},
"TEXTAREA":{
allow:true,
attributes:{ "accesskey":true, "cols":true, "disabled":true, "name":true, "readonly":true, "rows":true, "tabindex":true }
},
"TFOOT":{
allow:true,
attributes:{ "align":true, "char":true, "charoff":true, "valign":true }
},
"TH":{
allow:true,
attributes:{ "abbr":true, "align":true, "axis":true, "bgcolor":true, "char":true, "charoff":true, "colspan":true, "headers":true, "height":true, "nowrap":true, "rowspan":true, "scope":true, "valign":true, "width":true }
},
"THEAD":{
allow:true,
attributes:{ "align":true, "char":true, "charoff":true, "valign":true }
},
"TITLE":{
allow:true,
attributes:{ }
},
"TR":{
allow:true,
attributes:{ "align":true, "bgcolor":true, "char":true, "charoff":true, "valign":true }
},
"TT":{
allow:true,
attributes:{ }
},
"U":{
allow:true,
attributes:{ }
},
"UL":{
allow:true,
attributes:{ "compact":true, "type":true }
},
"VAR":{
allow:true,
attributes:{ }
}
}
};
// ------------------------------
// HTML 文字列から DOM オブジェクトを生成(スクリプト要素 と イベントハンドラは除外)
// ------------------------------
function StringHtmlCreateDomNodesSafe(html){
// 属性名終端文字
var end_attr_name = new Object();
end_attr_name[' '] = end_attr_name[' '] = end_attr_name['\t'] = end_attr_name['\r'] = end_attr_name['\n'] = end_attr_name['>'] = end_attr_name['='] = true;
// 属性値端文字
var end_attr_value = new Object();
end_attr_value[' '] = end_attr_value[' '] = end_attr_value['\t'] = end_attr_value['\r'] = end_attr_value['\n'] = end_attr_value['>'] = true;
// 整形用文字
var dic_space = new Object();
dic_space[' '] = dic_space[' '] = dic_space['\t'] = dic_space['\r'] = dic_space['\n'] = true;
// 空要素
var dic_empty = new Object();
dic_empty["AREA"] = dic_empty["BASE"] = dic_empty["BASEFONT"] = dic_empty["BR"] = dic_empty["COL"] = dic_empty["FRAME"] = dic_empty["HR"] = dic_empty["IMG"] =
dic_empty["INPUT"] = dic_empty["ISINDEX"] = dic_empty["LINK"] = dic_empty["META"] = dic_empty["PARAM"] = dic_empty["WBR"] = true;
// 空要素(任意)
var dic_optional = new Object();
dic_optional["BODY"] = dic_optional["COLGROUP"] = dic_optional["DD"] = dic_optional["DT"] = dic_optional["HEAD"] = dic_optional["HTML"] = dic_optional["LI"] = dic_optional["OPTION"] =
dic_optional["P"] = dic_optional["TBODY"] = dic_optional["TD"] = dic_optional["TFOOT"] = dic_optional["TH"] = dic_optional["THEAD"] = dic_optional["TR"] = true;
var nodes = new Array();
var stack = new Array();
var c;
var b;
var e;
var p = 0;
var l = html.length;
var edit = {
element:null,
name:"",
depth:0
};
stack.push(edit);
try{
while(true){
// SCRIPT、STYLE
if(edit.name == "SCRIPT" || edit.name == "STYLE"){
while(true){
// '<'
while(l > p){
c = html.charAt(p);
p ++;
if(c == '<'){
break;
}
}
if(p >= l) throw("end");
// 整形無視
while(l > p){
c = html.charAt(p);
p ++;
if(dic_space[c]){
}else{
break;
}
}
if(p >= l) throw("end");
// '/'
if(c != '/') continue;
// 整形無視
while(l > p){
c = html.charAt(p);
if(dic_space[c]){
}else{
break;
}
p ++;
}
if(p >= l) throw("end");
// 要素名
var tag_name = edit.name;
if(html.substr(p,tag_name.length).toUpperCase() != tag_name) continue;
p += tag_name.length;
// 整形無視
while(l > p){
c = html.charAt(p);
p ++;
if(dic_space[c]){
}else{
break;
}
}
if(p >= l) throw("end");
// '>'
if(c != '>') continue;
if(html.charAt(p - 2) == '\\') continue;
// スタックポップ
if(edit.depth){
stack.pop();
edit = stack[stack.length - 1];
}
break;
}
}
// 要素の開始 '<'
b = p;
e = -1;
while(l > p){
c = html.charAt(p);
p ++;
if(c == '<'){
e = p - 1;
break;
}
}
// テキストノード
if(b < e){
// テキストノード生成
var s = html.substring(b,e);
s = s.replace(/>/g, ">");
s = s.replace(/</g, "<");
s = s.replace(/"/g, "\"");
s = s.replace(/ /g, function(str) { return String.fromCharCode(0x00a0); });
s = s.replace(/&#([0-9]+);/g, function(str) { return String.fromCharCode(RegExp.$1); });
s = s.replace(/&/g, "&");
var text_node = document.createTextNode(s);
if(text_node){
if(edit.depth){
if(edit.element){
edit.element.appendChild(text_node);
}
}else{
nodes.push(text_node);
}
}
}
if(p >= l) throw("end");
// コメント "<!--"
if(html.substr(p,3) == "!--"){
p += 3;
e = html.indexOf("-->",p);
if(e >= 0) p = e + 3;
continue;
}
// 名前の開始、要素の終了 '/'
while(l > p){
c = html.charCodeAt(p);
p ++;
if((0x41 <= c && c <= 0x5a) || (0x61 <= c && c <= 0x7a) || (c == 0x2f)){
b = p - 1;
break;
}
}
if(p >= l) throw("end");
// 要素の終了 '/'
if(c == 0x2f){
// 名前の開始
while(l > p){
c = html.charCodeAt(p);
p ++;
if((0x41 <= c && c <= 0x5a) || (0x61 <= c && c <= 0x7a)){
b = p - 1;
break;
}
}
if(p >= l) throw("end");
// 名前の終了
while(l > p){
c = html.charCodeAt(p);
if((0x41 <= c && c <= 0x5a) || (0x61 <= c && c <= 0x7a) || (0x30 <= c && c <= 0x39)){
}else{
e = p;
break;
}
p ++;
}
if(p >= l) throw("end");
// 要素名
var tag_name = html.substring(b,e).toUpperCase();
// 要素の終了 '>'
while(l > p){
c = html.charAt(p);
p ++;
if(c == '>'){
break;
}
}
// スタックポップ
var i;
b = e = stack.length;
for(i=e-1;i>=0;i--){
if(stack[i].name == tag_name){
b = i;
break;
}
}
for(;b<e;b++){
if(edit.depth){
stack.pop();
edit = stack[stack.length - 1];
}
}
// 名前の開始
}else{
// 名前の終了
while(l > p){
c = html.charCodeAt(p);
if((0x41 <= c && c <= 0x5a) || (0x61 <= c && c <= 0x7a) || (0x30 <= c && c <= 0x3a)){
}else{
e = p;
break;
}
p ++;
}
if(p >= l) throw("end");
// 要素名
var tag_name = html.substring(b,e).toUpperCase();
// 要素終了
var i;
if(dic_optional[tag_name]){
b = e = stack.length;
for(i=e-1;i>=0;i--){
if(dic_optional[stack[i].name]){
b = i;
break;
}
}
for(;b<e;b++){
if(edit.depth){
stack.pop();
edit = stack[stack.length - 1];
}
}
}
// 要素生成
var parent = edit.element;
var empty = false;
var attr_allow = new Array();
var element = null;
var dic_attr = DICTIONARY_ATTRIBUTE_HTML4;
var item = dic_attr.elements[tag_name];
if(item){
if(item.allow){
attr_allow.push(dic_attr.globals);
attr_allow.push(item.attributes);
}
}
var dic_attr = DICTIONARY_ATTRIBUTE_HTML5;
var item = dic_attr.elements[tag_name];
if(item){
if(item.allow){
attr_allow.push(dic_attr.globals);
attr_allow.push(item.attributes);
}
}
if(attr_allow.length){
element = document.createElement(tag_name);
}
if(element){
if(edit.depth){
if(parent && element){
parent.appendChild(element);
}
}else{
nodes.push(element);
}
}
// 空要素
if(dic_empty[tag_name]){
empty = true;
}
// スタックプッシュ
edit = {
element:element,
name:tag_name,
depth:edit.depth + 1
};
stack.push(edit);
// 属性
while(true){
// 整形無視
while(l > p){
c = html.charAt(p);
// 整形無視
if(dic_space[c]){
}else{
b = p;
break;
}
p ++;
}
if(p >= l) throw("end");
// 要素の終了 '>'
if(c == '>'){
// スタックポップ
if(empty){
if(edit.depth){
stack.pop();
edit = stack[stack.length - 1];
}
}
p += 1;
break;
// 空要素 '/'
}else if(c == '/'){
empty = true;
p += 1;
// 属性名の開始
}else{
// 属性名の終了
while(l > p){
c = html.charAt(p);
if(end_attr_name[c]){
e = p;
break;
}
p ++;
}
if(p >= l) throw("end");
var attr_name = html.substring(b,e);
var attr_value = undefined;
// 整形無視
while(l > p){
c = html.charAt(p);
if(dic_space[c]){
}else{
break;
}
p ++;
}
if(p >= l) throw("end");
// 属性値 '='
if(c == '='){
p ++;
// 整形無視
while(l > p){
c = html.charAt(p);
if(dic_space[c]){
}else{
break;
}
p ++;
}
if(p >= l) throw("end");
// 引用符
var li = "";
if(c == '"' || c == '\''){
li = c;
p ++;
}
b = p;
// 属性値の終了、引用符の終了
while(l > p){
c = html.charAt(p);
if(li){
// 引用符の終了
if(c == li){
if(html.charAt(p - 1) != '\\'){
e = p;
p ++;
break;
}
}
}else{
// 属性値の終了
if(end_attr_value[c]){
e = p;
break;
}
}
p ++;
}
if(p >= l) throw("end");
// 属性値
attr_value = html.substring(b,e);
}
if(edit.element){
attr_name = attr_name.toLowerCase();
for(var id in attr_allow){
if(attr_allow[id][attr_name]){
if(attr_value === undefined) attr_value = "";
// 属性生成
var attribute = document.createAttribute(attr_name);
attribute.value = attr_value;
edit.element.setAttributeNode(attribute);
break;
}
}
}
}
}
}
}
}catch(e){}
return nodes;
}
// ------------------------------
// オブジェクトをコピーする関数
// ------------------------------
function ObjectCopy(obj){
if(obj === null) return null;
if(typeof(obj) != "object") return obj;
var s;
var o;
var k;
var r = new (obj.constructor)();
var q = new Array();
q.push({o:r,s:obj});
while(true){
k = q.pop();
if(!k) break;
o = k.o;
s = k.s;
for(k in s){
if(typeof(s[k]) == "object"){
if(s[k]){
o[k] = new (s[k].constructor)();
q.push({o:o[k],s:s[k]});
continue;
}
}
o[k] = s[k];
}
}
return r;
}
// ------------------------------
// オブジェクトからプロパティを破棄
// ------------------------------
function ObjectDeleteProperty(obj,key){
try{
obj[key] = null;
delete obj[key];
}catch(e){
}
}
// ------------------------------
// 正規表現でバックスラッシュワードを置換
// ------------------------------
function RegExpReplacementBackslashWord(re,src,w){
if(!re) return src;
var ary = src.match(re);
if(!ary) return src;
var num = ary.length;
return w.replace(new RegExp("\\\\\\\\|\\\\[0-9]","g"),function(str, p1, p2) {
if(str == "\\\\") return "\\";
var p = parseInt(str[1]);
if(p > 0 && p <= num){
return ary[p];
}
if(p == 0) return ary[0];
return "";
});
}
// ------------------------------
// 正規表現でドルワードを置換
// ------------------------------
function RegExpReplacementDollarWord(re,src,w){
if(!re) return src;
var ary = src.match(re);
if(!ary) return src;
var num = ary.length;
return w.replace(new RegExp("[$][$]|[$][0-9]","g"),function(str, p1, p2) {
if(str == "$$") return "$";
var p = parseInt(str[1]);
if(p > 0 && p <= num){
return ary[p];
}
if(p == 0) return ary[0];
return "";
});
}
// ------------------------------
// クリップボードにテキストをコピー
// ------------------------------
function ClipboardSetText(str){
}
// ------------------------------
// ウィンドウ用クラス
// ------------------------------
function WindowManager(window_obj){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_window_root = null;
_window_self = null;
_window_list = null;
};
// ------------------------------
// ルートウィンドウを取得
// ------------------------------
_this.getWindowRoot = function(){
return _window_root;
};
// ------------------------------
// ルートウィンドウが存在するか調べる
// ------------------------------
_this.existWindowRoot = function(){
return (_window_root != _window_self);
};
// ------------------------------
// ルートからの座標
// ------------------------------
_this.getPositionFromRoot = function(){
var x = 0.0;
var y = 0.0;
try{
var element;
var style;
var size;
var rect;
var i;
var num = _window_list.length;
for(i=0;i<num;i++){
element = _window_list[i].frameElement;
if(!element) break;
style = ElementGetComputedStyle(element,"");
size = ComputedStyleGetSize(style);
rect = ElementGetBoundingClientRect(element);
x += rect.left + size.paddingLeft + size.borderLeft;
y += rect.top + size.paddingTop + size.borderTop;
}
}catch(e){
}
return {x:x,y:y};
};
// ------------------------------
// プライベート変数
// ------------------------------
var _window_root;
var _window_self;
var _window_list;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_window_self = window_obj;
_window_list = new Array();
try{
var top = window_obj.top;
while(window_obj != top){
var parent = window_obj.parent;
if(parent.location.href){}
if(parent.document.URL){}
_window_list.push(window_obj);
window_obj = parent;
}
}catch(e){
}
_window_root = window_obj;
})();
}
// ------------------------------
// ウィンドウのスクロール位置を取得する関数
// ------------------------------
function WindowGetScrollPosition(window_obj){
if(window_obj.pageXOffset === undefined){
}else if(window_obj.pageYOffset === undefined){
}else{
return {
x:window_obj.pageXOffset,
y:window_obj.pageYOffset
};
}
var d = window_obj.document;
return {
x:(d.documentElement.scrollLeft || d.body.scrollLeft),
y:(d.documentElement.scrollTop || d.body.scrollTop )
};
}
// ------------------------------
// ウィンドウのスクロール位置をセットする関数
// ------------------------------
function WindowSetScrollPosition(window_obj,pos){
WindowSetScrollPositionX(window_obj,pos.x);
WindowSetScrollPositionY(window_obj,pos.y);
}
// ------------------------------
// ウィンドウの水平方向スクロール座標を変更する関数
// ------------------------------
function WindowSetScrollPositionX (window_obj,x){
var document_obj = window_obj.document;
if(document_obj.body){
document_obj.body.scrollLeft = x;
}
if(document_obj.documentElement){
document_obj.documentElement.scrollLeft = x;
}
}
// ------------------------------
// ウィンドウの垂直方向スクロール座標を変更する関数
// ------------------------------
function WindowSetScrollPositionY (window_obj,y){
var document_obj = window_obj.document;
if(document_obj.body){
document_obj.body.scrollTop = y;
}
if(document_obj.documentElement){
document_obj.documentElement.scrollTop = y;
}
}
// ------------------------------
// ウィンドウから、アクセス可能なルートウィンドウを取得
// ------------------------------
function WindowGetRoot(window_obj){
try{
var top = window_obj.top;
while(window_obj != top){
var parent = window_obj.parent;
if(parent.location.href){}
if(parent.document.URL){}
window_obj = parent;
}
}catch(e){
}
return window_obj;
}
// ------------------------------
// ウィンドウが子であるか取得
// ------------------------------
function WindowIsChild(window_obj){
return (window_obj != window_obj.parent);
}
// ------------------------------
// 所有者となる Window の URL を取得
// ------------------------------
function WindowGetOwnerURL(window_obj){
var url = "";
var re = new RegExp("^(blob|data|about):","i");
try{
url = window_obj.document.URL;
var top = window_obj.top;
while(window_obj != top) {
if(!url.match(re)) break;
window_obj = window_obj.parent;
if(window_obj.location.href){}
url = window_obj.document.URL;
}
}catch(e){
}
return url;
}
// ------------------------------
// HEAD 要素を取得
// ------------------------------
function DocumentGetHeadElement(document_obj){
if(document_obj.head){
return document_obj.head;
}
var nodes = document_obj.documentElement.childNodes;
var i;
var num = nodes.length;
for(i=0;i<num;i++){
if(nodes[i].tagName == "HEAD"){
return nodes[i];
}
}
return null;
}
// ------------------------------
// クライアント領域のサイズを取得
// ------------------------------
function DocumentGetClientSize(document_obj){
var b = document_obj.body;
var r = document_obj.documentElement;
var w = b.clientWidth;
var h;
if(w < r.clientWidth) w = r.clientWidth;
if(document_obj.compatMode == "BackCompat"){
h = b.clientHeight;
}else{
if(r.clientHeight){
h = r.clientHeight;
}else{
h = b.clientHeight;
}
}
return {
width :w,
height:h
};
}
// ------------------------------
// スクロール座標を取得(削除予定)
// ------------------------------
function DocumentGetScrollPos(){
return{
x:document.body.scrollLeft || document.documentElement.scrollLeft,
y:document.body.scrollTop || document.documentElement.scrollTop
};
}
// ------------------------------
// ドキュメント(HTML 全体)のサイズを取得する関数
// ------------------------------
function DocumentGetDocumentSize(document_obj){
var e;
var w = 0;
var h = 0;
e = document_obj.body;
if(e){
if(w < e.clientWidth) w = e.clientWidth;
if(w < e.scrollWidth) w = e.scrollWidth;
if(h < e.clientHeight) h = e.clientHeight;
if(h < e.scrollHeight) h = e.scrollHeight;
}
e = document_obj.documentElement;
if(e){
if(w < e.clientWidth) w = e.clientWidth;
if(w < e.scrollWidth) w = e.scrollWidth;
if(h < e.clientHeight) h = e.clientHeight;
if(h < e.scrollHeight) h = e.scrollHeight;
}
return {
width :w,
height:h
};
}
// ------------------------------
// DOM オブジェクトの構築が完了したか調べる関数
// ------------------------------
function DocumentGetLoadedDomContent(document_obj,callback){
function DOMContentLoadedFunc(e){
document_obj.removeEventListener("DOMContentLoaded" , DOMContentLoadedFunc);
callback();
}
function ReadyStateChangeFunc(e){
switch(document_obj.readyState){
case "interactive":
case "complete":
document_obj.detachEvent("onreadystatechange" , ReadyStateChangeFunc);
callback();
}
}
switch(document_obj.readyState){
case "interactive":
case "complete":
callback();
return;
}
if(document_obj.addEventListener){
document_obj.addEventListener("DOMContentLoaded" , DOMContentLoadedFunc);
}else if(document_obj.attachEvent){
document_obj.attachEvent("onreadystatechange" , ReadyStateChangeFunc);
}
}
// ------------------------------
// ブラウザの拡大縮小率を取得
// ------------------------------
function WindowGetDevicePixelRatio(window_obj){
if(window_obj.devicePixelRatio === undefined) return 1.0;
return window_obj.devicePixelRatio;
}
// ------------------------------
// エレメント作成
// ------------------------------
function DocumentCreateElement(type){
var element = document.createElement(type);
// if(element.wrappedJSObject) return element.wrappedJSObject;
return element;
}
// ------------------------------
// テキスト作成
// ------------------------------
function DocumentCreateText(value){
var element = document.createTextNode(value);
// if(element.wrappedJSObject) return element.wrappedJSObject;
return element;
}
// ------------------------------
// クエリーを取得
// ------------------------------
function DocumentGetQuery(){
return StringGetQuery(document.URL);
}
// ------------------------------
// プロパティの更新監視
// ------------------------------
function DocumentObserverModifyProperty (){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
while(_list != _list.next){
_list.next.release();
}
};
// ------------------------------
// 要素生成
// ------------------------------
_this.createElement = function(){
var _element = new Object();
// ------------------------------
// コールバック関数をセット
// ------------------------------
_element.setFunction = function(f){
_element.callback = f;
};
// ------------------------------
// 基本値を設定
// ------------------------------
_element.setBaseValue = function(value){
_element.base = value;
};
// ------------------------------
// 要素をセット
// ------------------------------
_element.setElement = function(element,key){
_element.element = element;
_element.key = key;
_element.base = element[_element.key];
if(MutationObserverSupported()){
_mutation_observer = MutationObserverCreate(function(mutations) {
var i;
var num = mutations.length;
for(i=0;i<num;i++){
var target = mutations[i].target;
if(_element.base != target[_element.key]){
_element.base = target[_element.key];
_element.callback();
return;
}
}
});
_mutation_observer.observe(element,{attributes:true,attributeFilter:[key]});
}
};
// ------------------------------
// 開放
// ------------------------------
_element.release = function(){
if(_list == _element){
_list = _element.next;
}
var next = _element.next;
var prev = _element.prev;
prev.next = next;
next.prev = prev;
_element.prev = _element;
_element.next = _element;
_count --;
if(_mutation_observer){
_mutation_observer.disconnect();
_mutation_observer = null;
}
};
// ------------------------------
// プライベート変数
// ------------------------------
var _mutation_observer;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_element.callback = null;
_element.element = null;
_element.key = null;
_element.base = null;
var next = _list;
var prev = next.prev;
prev.next = _element;
next.prev = _element;
_element.prev = prev;
_element.next = next;
_count++;
})();
return _element;
};
// ------------------------------
// 実行
// ------------------------------
_this.execute = function(){
var i = 0;
var num = 5;
var start = _list;
do{
if(_list.element){
if(_list.base != _list.element[_list.key]){
_list.base = _list.element[_list.key];
_list.callback();
}
}
_list = _list.next;
i ++;
if(num <= i) break;
}while(start != _list);
};
// ------------------------------
// 要素数を取得
// ------------------------------
_this.getCount = function(){
return _count;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _list;
var _count;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_list = new Object();
_list.prev = _list;
_list.next = _list;
_count = 0;
})();
}
// ------------------------------
// DOMノードが外れたか監視
// ------------------------------
function DocumentObserverRemoveDomNode(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(_mutation_observer){
for(var id in _list){
var list = _list[id];
while(list != list._next){
list._next.release();
}
}
_mutation_observer.disconnect();
_mutation_observer = null;
_map_id = null;
}else{
while(_list != _list._next){
_list._next.release();
}
}
};
// ------------------------------
// 要素生成
// ------------------------------
_this.createElement = function(){
var _element = new Object();
// ------------------------------
// コールバック関数をセット
// ------------------------------
_element.setFunction = function(f){
_element.callback = f;
};
// ------------------------------
// 要素をセット
// ------------------------------
_element.setDomNode = function(node){
_element.node = node;
if(_mutation_observer){
if(_map_id){
_id = _map_id.get(node);
}else{
_id = node._pageexpand_remove;
}
if(!_id){
if(_map_id){
_id = _identity;
_map_id.set(node,_id);
}else{
_id = node._pageexpand_remove = _identity;
}
_identity++;
}
if(!_list[_id]){
var o = new Object();
o._prev = o;
o._next = o;
_list[_id] = o;
}
var _prev = _list[_id];
var _next = _prev._next;
_prev._next = _element;
_next._prev = _element;
_element._prev = _prev;
_element._next = _next;
}
};
// ------------------------------
// 開放
// ------------------------------
_element.release = function(){
if(_mutation_observer){
var _prev = _element._prev;
var _next = _element._next;
_prev._next = _next;
_next._prev = _prev;
_element._prev = _element;
_element._next = _element;
if(_list[_id] == _list[_id]._next){
ObjectDeleteProperty(_list,_id);
if(_map_id){
_map_id.delete(_element.node);
}
}
}else{
if(_list_end == _element){
_list_end = _element._prev;
}
if(_list_pos == _element){
_list_pos = _element._prev;
}
var _prev = _element._prev;
var _next = _element._next;
_prev._next = _next;
_next._prev = _prev;
_element._prev = _element;
_element._next = _element;
}
_count -= 1;
_element.node = null;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _id;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(_mutation_observer){
_element._prev = _element;
_element._next = _element;
}else{
var _next = _list_pos;
var _prev = _next._prev;
_element._prev = _prev;
_element._next = _next;
_next._prev = _element;
_prev._next = _element;
_list_end = _element;
}
_element.callback = null;
_element.node = null;
_count += 1;
})();
return _element;
};
// ------------------------------
// 要素数を取得
// ------------------------------
_this.getCount = function(){
return _count;
};
// ------------------------------
// 実行
// ------------------------------
_this.execute = function(){
_list_end = _list_pos;
var num = 5;
var i;
for(i=0;i<num;i++){
if(_list_pos.node){
if(!(DomNodeGetAttachedDocument(_list_pos.node))){
_list_pos.callback();
}
}
_list_pos = _list_pos._next;
if(_list_pos == _list_end){
return;
}
}
};
// ------------------------------
// 検出
// ------------------------------
function detect(node){
var w;
var o;
var p;
var n;
var i = 0;
var c = 0;
var m = 100;
var q = new Object();
var nodes = node.childNodes;
q.p = q;
q.n = q;
// 中断
function interrupt(){
c = 0;
execute_queue.attachFirstForRemoveDomNode(analyze,null);
}
// 子孫抽出
function analyze(){
while(node){
if(nodes){
while(nodes[i]){
o = {node:nodes[i]};
n = q;
p = n.p;
o.p = p;
o.n = n;
p.n = o;
n.p = o;
i++;
c++;
if(c > m){
interrupt();
return;
}
}
}
var id;
if(_map_id){
id = _map_id.get(node);
}else{
id = node._pageexpand_remove;
}
if(id){
if(!(DomNodeGetAttachedDocument(node))){
var ary = new Array();
var dict = _list[id];
var list = dict._next;
while(list != dict){
ary.push(list);
list = list._next;
}
var j;
var num = ary.length;
for(j=0;j<num;j++){
ary[j].callback();
}
}
}
o = q.n;
p = o.p;
n = o.n;
p.n = n;
n.p = p;
node = o.node;
if(node){
i = 0;
nodes = node.childNodes;
}
c++;
if(c > m){
interrupt();
return;
}
}
}
analyze();
}
// ------------------------------
// プライベート変数
// ------------------------------
var _mutation_observer;
var _task;
var _list;
var _list_pos;
var _list_end;
var _map_id;
var _count;
var _identity;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_count = 0;
if(MutationObserverSupported()){
_list = new Array();
if(window.WeakMap){
_map_id = new WeakMap();
}
_identity = 1;
_mutation_observer = MutationObserverCreate(function(mutations) {
var i;
var num = mutations.length;
for(i=0;i<num;i++){
var nodes = mutations[i].removedNodes;
var j;
var node_num = nodes.length;
for(j=0;j<node_num;j++){
execute_queue.attachLastForRemoveDomNode(detect,nodes[j]);
}
}
});
_mutation_observer.observe(document.documentElement,{childList:true,subtree:true});
}
if(!_mutation_observer){
_list = new Object();
_list._prev = _list;
_list._next = _list;
_list_pos = _list;
_list_end = _list;
}
})();
}
// ------------------------------
// スクロール監視
// ------------------------------
function DocumentObserverScroll(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
removeEvent();
while(_list != _list._next){
_list._next.release();
}
if(_timer){
_timer.release();
_timer = null;
}
if(_task){
_task.release();
}
};
// ------------------------------
// 要素生成
// ------------------------------
_this.createElement = function(){
var _element = new Object();
// ------------------------------
// コールバック関数をセット
// ------------------------------
_element.setFunction = function(f){
_element.callback = f;
};
// ------------------------------
// 開放
// ------------------------------
_element.release = function(){
if(_list_end == _element){
_list_end = _element._prev;
}
if(_list_pos == _element){
_list_pos = _element._prev;
}
var _prev = _element._prev;
var _next = _element._next;
_prev._next = _next;
_next._prev = _prev;
_element._prev = _element;
_element._next = _element;
_count -= 1;
if(!_count){
removeEvent();
}
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
var _next = _list_pos;
var _prev = _next._prev;
_element._prev = _prev;
_element._next = _next;
_next._prev = _element;
_prev._next = _element;
_list_end = _element;
_element.callback = null;
if(!_count){
addEvent();
if(_timer){
_timer.release();
_timer = null;
}
_timer = new Timer(1,1);
_timer.oncomplete = function(){
detect();
};
_timer.start();
}
_count += 1;
})();
return _element;
};
// ------------------------------
// 要素数を取得
// ------------------------------
_this.getCount = function(){
return _count;
};
// ------------------------------
// 検出
// ------------------------------
function detect(){
if(_task){
_list_end = _list_pos;
}else{
_task = task_container.createTask();
_task.setDestructorFunc(function(){
_task = null;
});
_task.setExecuteFunc(function(){
var num = 10;
var i;
for(i=0;i<num;i++){
if(_list_pos.callback){
_list_pos.callback();
}
_list_pos = _list_pos._next;
if(_list_pos == _list_end){
_task.release();
return;
}
}
});
_list_end = _list_pos = _list;
_task.execute(0xffffffff);
}
}
// ------------------------------
// イベントを追加(内部用)
// ------------------------------
function addEvent(){
if(window.addEventListener){
window.addEventListener("scroll",detect,true);
}else if(window.attachEvent){
window.attachEvent("onscroll",detect);
}
}
// ------------------------------
// イベントを外す(内部用)
// ------------------------------
function removeEvent(){
if(window.removeEventListener){
window.removeEventListener("scroll",detect,true);
}else if(window.attachEvent){
window.detachEvent("onscroll",detect);
}
}
// ------------------------------
// プライベート変数
// ------------------------------
var _task;
var _timer;
var _list;
var _list_pos;
var _list_end;
var _count;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_count = 0;
_list = new Object();
_list._prev = _list;
_list._next = _list;
_list_pos = _list;
_list_end = _list;
})();
}
// ------------------------------
// キュー辞書
// ------------------------------
function QueueDictionary(){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
_dic = null;
};
// ------------------------------
// 要素生成
// ------------------------------
_this.createElement = function(key){
var _element = new Object();
// ------------------------------
// データをセット
// ------------------------------
_element.setData = function(data){
_element.data = data;
};
// ------------------------------
// データを取得
// ------------------------------
_element.getData = function(){
return _element.data;
};
// ------------------------------
// 開放
// ------------------------------
_element.release = function(){
var owner = _element.owner;
if(!owner) return;
_element.owner = null;
var _prev = _element._prev;
var _next = _element._next;
_prev._next = _next;
_next._prev = _prev;
owner.count -= 1;
if(!owner.count){
delete _dic[owner.key];
}
_count -= 1;
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
var owner = _dic[key];
if(!owner){
owner = {
key:key,
count:0
};
owner._prev = owner;
owner._next = owner;
_dic[key] = owner;
}
var _next = owner;
var _prev = _next._prev
_prev._next = _element;
_next._prev = _element;
_element._prev = _prev;
_element._next = _next;
_element.owner = owner;
owner.count += 1;
_count += 1;
})();
return _element;
};
// ------------------------------
//
// ------------------------------
_this.get = function(key){
var obj = _dic[key];
if(!obj) return null;
return obj._next;
};
// ------------------------------
// 登録数を取得
// ------------------------------
_this.getCount = function(){
return _count;
};
// ------------------------------
// プライベート変数
// ------------------------------
var _dic;
var _count;
// ------------------------------
// 初期化
// ------------------------------
(function(){
_count = 0;
_dic = new Object();
})();
}
// ------------------------------
// エレメントからタグ名を指定してエレメントを取得
// ------------------------------
function ElementGetElementsByTagName(node,type){
if(node.getElementsByTagName){
return node.getElementsByTagName(type);
}else if(node.querySelectorAll){
return node.querySelectorAll(type);
}else{
type = type.toUpperCase();
var ary = new Array();
var p;
var n;
var q;
var queue = new Object();
q = {p:queue,n:queue,node:node};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
if(node.tagName == type || type == '*'){
ary.push(node);
}
break;
}
}
return ary;
}
}
// ------------------------------
// エレメントから名前を指定してエレメントを取得する
// ------------------------------
function ElementGetElementsByName(node,name){
var nodes = new Array();
var p;
var n;
var q;
var queue = new Object();
q = {p:queue,n:queue,node:node};
queue.p = q;
queue.n = q;
while(queue.n != queue){
q = queue.n;
p = q.p;
n = q.n;
p.n = n;
n.p = p;
var node = q.node;
switch(node.nodeType){
case 1:
var i;
var nodes = node.childNodes;
var num = nodes.length;
for(i=0;i<num;i++){
n = queue;
p = n.p;
q = {p:p,n:n,node:nodes[i]};
p.n = q;
n.p = q;
}
if(node.getAttribute("name") == name){
nodes.push(node);
}
break;
}
}
return nodes;
}
// ------------------------------
// エレメントからクラス名を指定してエレメントを取得する
// ------------------------------
function ElementGetElementsByClassName(node,class_name){
var node_list = new Array();
if(!class_name) return node_list;
var re = new RegExp("[ \t\r\n]*([^ \t\r\n]+)[ \t\r\n]*","g");
var class_list = new Object();
class_name.replace(re,function (m,k){ class_list[k] = true; });
var f = function (node){
if(node.nodeType != 1) return;
var a = new Object();
node.className.replace(re,function (m,k){ a[k] = true; });
var m;
for (var k in class_list){
m = a[k];
if(!m) break;
}
if(m) node_list.push(node);
var nodes = node.childNodes;
var i;
var num = nodes.length;
for(i=0;i<num;i++){
f(nodes[i]);
}
}
if(node.documentElement){
node = node.documentElement;
}
f(node);
return node_list;
}
// ------------------------------
// エレメントのスタイルシートを取得
// ------------------------------
function ElementGetStyle(element){
return element.style.cssText;
}
// ------------------------------
// エレメントにスタイルを追加
// ------------------------------
function ElementAddStyle(element,style){
element.style.cssText += style;
}
// ------------------------------
// エレメントにスタイルをセット
// ------------------------------
function ElementSetStyle(element,style){
element.style.cssText = style;
}
// ------------------------------
// エレメントの幅を取得
// ------------------------------
function ElementGetClientWidth(element){
var w;
while(element){
w = element.clientWidth;
if(w) break;
element = element.parentNode;
}
if(!element) return 0;
return w;
}
// ------------------------------
// エレメントのクライアント領域のバウンディング矩形を取得
// ------------------------------
function ElementGetBoundingClientRect(element){
if(!(element.getBoundingClientRect)) return null;
var r = element.getBoundingClientRect();
var o = {
left:r.left,
right:r.right,
top:r.top,
bottom:r.bottom
};
if(UserAgentGetInternetExplorer() || UserAgentGetSleipnir()){
var sx = 2;
var sy = 2;
o.left -= sx;
o.right -= sx;
o.top -= sy;
o.bottom -= sy;
}
return o;
}
// ------------------------------
// エレメントのクライアント領域のコンテンツ矩形を取得
// ------------------------------
function ElementGetContentClientRect(element){
var rect = ElementGetBoundingClientRect(element);
var style = ElementGetComputedStyle(element,null);
if(style){
var re = new RegExp("^([-0-9.]+)px$","i");
var list = [
{style:"paddingLeft" ,key:"left" ,sign: 1},
{style:"paddingRight" ,key:"right" ,sign:-1},
{style:"paddingTop" ,key:"top" ,sign: 1},
{style:"paddingBottom" ,key:"bottom" ,sign:-1},
{style:"borderLeftWidth" ,key:"left" ,sign: 1},
{style:"borderRightWidth" ,key:"right" ,sign:-1},
{style:"borderTopWidth" ,key:"top" ,sign: 1},
{style:"borderBottomWidth" ,key:"bottom" ,sign:-1}
];
var i;
var num = list.length;
for(i=0;i<num;i++){
var param = list[i];
if(style[param.style]){
var m = style[param.style].match(re);
if(m){
rect[param.key] += parseFloat(m[0]) * param.sign;
}
}
}
}
return rect;
}
// ------------------------------
// エレメントのクライアント領域の可視矩形を取得
// ------------------------------
function ElementGetViewClientRect(element){
var rect = ElementGetBoundingClientRect(element);
var overflow_hidden_x = {"hidden":1};
var overflow_hidden_y = {"hidden":1};
var display_inline = {"inline":1,"none":1,"table-column":1,"table-column-group":1};
while(element){
var r = ElementGetBoundingClientRect(element);
if(!r) break;
if(element.tagName == "BODY") break;
var style = ElementGetComputedStyle(element,null);
if(style){
if(!display_inline[style.display]){
if(overflow_hidden_x[style.overflowX]){
if(r.right < rect.right ) rect.right = r.right;
if(r.left > rect.left ) rect.left = r.left;
}
if(overflow_hidden_y[style.overflowY]){
if(r.bottom < rect.bottom) rect.bottom = r.bottom;
if(r.top > rect.top ) rect.top = r.top;
}
}
}
element = element.parentNode;
}
return rect;
}
// ------------------------------
// エレメントとクライアント座標との当たり判定を取得
// ------------------------------
function ElementClientRectsTree(element){
var _this = this;
// ------------------------------
// 座標との当たり判定
// ------------------------------
_this.hitTestPosition = function(pos,child_type){
var node = _this.parentNode;
while(node){
var r = node.boundingClientRect;
if(!r) break;
if(r.bottom + 1 < pos.y) return false;
if(r.top - 1 > pos.y) return false;
if(r.right + 1 < pos.x) return false;
if(r.left - 1 > pos.x) return false;
node = node.parentNode;
}
var queue = new Array();
queue.push(_this);
while(true){
var node = queue.pop();
if(!node) break;
// 子ノード
var child_nodes = node.childNodes;
var i;
var num = child_nodes.length;
for(i=0;i < num;i++){
queue.push(child_nodes[i]);
}
var ary = node.clientRects;
var i;
var num = ary.length;
for(i=0;i<num;i++){
var r = ary[i];
if(r.bottom + 2 < pos.y){
}else if(r.top - 2 > pos.y){
}else if(r.right + 2 < pos.x){
}else if(r.left - 2 > pos.x){
}else{
return true;
}
}
if(!child_type) return false;
}
return false;
};
// ------------------------------
// 初期化
// ------------------------------
(function(){
var overflow_hidden = {"scroll":1,"hidden":1,"auto":1};
var display_inline = {"inline":1,"none":1,"table-column":1,"table-column-group":1};
var node_obj = _this;
var node = element;
while(node){
var r = ElementGetBoundingClientRect(node);
if(!r) break;
if(node.tagName == "BODY") break;
var style = ElementGetComputedStyle(node,null);
if(style){
if(!display_inline[style.display]){
if(overflow_hidden[style.overflow]){
node_obj.parentNode = {
boundingClientRect:r
};
node_obj = node_obj.parentNode;
}
}
}
node = node.parentNode;
}
_this.childNodes = new Array();
_this.clientRects = new Array();
var queue = new Array();
queue.push({node:element,node_obj:_this});
while(true){
var param = queue.pop();
if(!param) break;
var node_obj = param.node_obj;
var node = param.node;
var check = true;
var style = null;
if(node.nodeType == 1){
style = ElementGetComputedStyle(node,null);
}
if(style){
if(!display_inline[style.display]){
if(overflow_hidden[style.overflow]){
check = false;
}
}
}
if(check){
// 子ノード
var child_nodes = node.childNodes;
var i;
var num = child_nodes.length;
for(i=0;i < num;i++){
var o = {
childNodes:new Array(),
clientRects:new Array()
};
queue.push({
node:child_nodes[i],
node_obj:o
});
node_obj.childNodes.push(o);
}
}
if(node.getClientRects){
var ary = node.getClientRects();
var i;
var num = ary.length;
for(i=0;i<num;i++){
node_obj.clientRects.push(ary[i]);
}
}
}
})();
}
// ------------------------------
// エレメントとクライアント座標との当たり判定を取得
// ------------------------------
function ElementHitTestPosition(element,pos,child_type){
if(!element) return false;
var overflow_hidden = {"scroll":1,"hidden":1,"auto":1};
var display_inline = {"inline":1,"none":1,"table-column":1,"table-column-group":1};
var node = element;
while(node){
var r = ElementGetBoundingClientRect(node);
if(!r) break;
if(node.tagName == "BODY") break;
var style = ElementGetComputedStyle(node,null);
if(style){
if(!display_inline[style.display]){
if(overflow_hidden[style.overflow]){
if(r.bottom + 1 < pos.y) return false;
if(r.top - 1 > pos.y) return false;
if(r.right + 1 < pos.x) return false;
if(r.left - 1 > pos.x) return false;
}
}
}
node = node.parentNode;
}
var queue = new Array();
queue.push(element);
while(true){
element = queue.pop();
if(!element) break;
var check = true;
var style = null;
if(element.nodeType == 1){
style = ElementGetComputedStyle(element,null);
}
if(style){
if(!display_inline[style.display]){
if(overflow_hidden[style.overflow]){
check = false;
}
}
}
if(check){
// 子ノード
var child_nodes = element.childNodes;
var i;
var num = child_nodes.length;
for(i=0;i < num;i++){
queue.push(child_nodes[i]);
}
}
if(element.getClientRects){
var ary = element.getClientRects();
var i;
var num = ary.length;
for(i=0;i<num;i++){
var r = ary[i];
if(r.bottom + 2 < pos.y){
}else if(r.top - 2 > pos.y){
}else if(r.right + 2 < pos.x){
}else if(r.left - 2 > pos.x){
}else{
return true;
}
}
}
if(!child_type) return false;
}
return false;
}
// ------------------------------
// エレメントとマウスクライアント座標との当たり判定を取得
// ------------------------------
function ElementHitTestMousePosition(element,pos,child_type){
var element_hit = document.elementFromPoint(pos.x,pos.y);
if(child_type){
while(element_hit){
if(element_hit == element){
return true;
}
element_hit = element_hit.parentNode;
}
return false;
}
return (element_hit == element);
}
// ------------------------------
// エレメントが見えているか調べる
// ------------------------------
function ElementGetVisibility(element){
var visibility_visible = {"visible":1};
var display_none = {"none":1};
while(element){
var style = ElementGetComputedStyle(element,null);
if(style){
if(!(visibility_visible[style.visibility])){
return false;
}
if(display_none[style.display]){
return false;
}
}
element = element.parentNode;
}
return true;
}
// ------------------------------
// 最終的に適用されているスタイルを取得
// ------------------------------
function ElementGetComputedStyle(element,pseudo_element){
var document_obj = element.ownerDocument;
if(document_obj){
var window_obj = document_obj.defaultView;
if(window_obj){
if(window_obj.getComputedStyle !== undefined){
return window_obj.getComputedStyle(element,pseudo_element);
}
}
}
if(element.currentStyle !== undefined){
return element.currentStyle;
}
return null;
}
// ------------------------------
// スタイルから各サイズ情報を取得する
// ------------------------------
function ComputedStyleGetSize(style){
var re = new RegExp("([-0-9.]+)px","i");
var list = [
{ i:"width" , o:"width" },
{ i:"height" , o:"height" },
{ i:"paddingLeft" , o:"paddingLeft" },
{ i:"paddingTop" , o:"paddingTop" },
{ i:"paddingRight" , o:"paddingRight" },
{ i:"paddingBottom" , o:"paddingBottom" },
{ i:"borderLeftWidth" , o:"borderLeft" },
{ i:"borderTopWidth" , o:"borderTop" },
{ i:"borderRightWidth" , o:"borderRight" },
{ i:"borderBottomWidth" , o:"borderBottom" },
{ i:"marginLeft" , o:"marginLeft" },
{ i:"marginTop" , o:"marginTop" },
{ i:"marginRight" , o:"marginRight" },
{ i:"marginBottom" , o:"marginBottom" }
];
var i;
var num = list.length;
var obj = new Object();
for(i=0;i < num;i++){
var p = list[i];
var m = style[p.i].match(re);
if(m){
obj[p.o] = parseFloat(m[1]);
}else{
obj[p.o] = 0;
}
}
obj.clientWidth = obj.width + obj.paddingLeft + obj.paddingRight;
obj.clientHeight = obj.height + obj.paddingTop + obj.paddingBottom;
obj.offsetWidth = obj.clientWidth + obj.borderLeft + obj.borderRight;
obj.offsetHeight = obj.clientHeight + obj.borderTop + obj.borderBottom;
return obj;
}
// ------------------------------
// スタイルからパディングサイズを取得
// ------------------------------
function ComputedStyleGetPaddingWidth(style){
var re = new RegExp("([-0-9.]+)px","i");
var list = [
{ i:"paddingLeft" , o:"left" },
{ i:"paddingTop" , o:"top" },
{ i:"paddingRight" , o:"right" },
{ i:"paddingBottom" , o:"bottom" }
];
var i;
var num = list.length;
var obj = new Object();
for(i=0;i < num;i++){
var p = list[i];
var m = style[p.i].match(re);
if(m){
obj[p.o] = parseFloat(m[1]);
}else{
obj[p.o] = 0;
}
}
return obj;
}
// ------------------------------
// スタイルからボーダーサイズを取得
// ------------------------------
function ComputedStyleGetBoaderWidth(style){
var re = new RegExp("([-0-9.]+)px","i");
var list = [
{ i:"borderLeftWidth" , o:"left" },
{ i:"borderRightWidth" , o:"top" },
{ i:"borderTopWidth" , o:"right" },
{ i:"borderBottomWidth" , o:"bottom" }
];
var i;
var num = list.length;
var obj = new Object();
for(i=0;i < num;i++){
var p = list[i];
var m = style[p.i].match(re);
if(m){
obj[p.o] = parseFloat(m[1]);
}else{
obj[p.o] = 0;
}
}
return obj;
}
// ------------------------------
// スタイルの transform を設定
// ------------------------------
function StyleDeclarationSetTransform(style,value){
var list = [
"transform",
"webkitTransform",
"MozTransform",
"msTransform",
"OTransform"
];
var i;
var num = list.length;
for(i=0;i<num;i++){
if(style[list[i]] !== undefined){
style[list[i]] = value;
return true;
}
}
return false;
}
// ------------------------------
// スタイルの transform-origin を設定
// ------------------------------
function StyleDeclarationSetTransformOrigin(style,value){
var list = [
"transformOrigin",
"webkitTransformOrigin",
"MozTransformOrigin",
"msTransformOrigin",
"OTransformOrigin"
];
var i;
var num = list.length;
for(i=0;i<num;i++){
if(style[list[i]] !== undefined){
style[list[i]] = value;
return true;
}
}
return false;
}
// ------------------------------
// 2D用の行列を計算するクラス
// ------------------------------
function Matrix32 (a,b,c,d,tx,ty) {
this.a = ((a === undefined) ? 1.0 : a );
this.b = ((b === undefined) ? 0.0 : b );
this.c = ((c === undefined) ? 0.0 : c );
this.d = ((d === undefined) ? 1.0 : d );
this.tx = ((tx === undefined) ? 0.0 : tx);
this.ty = ((ty === undefined) ? 0.0 : ty);
}
Matrix32.prototype = {
// ------------------------------
// 単位行列化
// ------------------------------
identity:function(){
this.a = 1.0; this.b = 0.0;
this.c = 0.0; this.d = 1.0;
this.tx = 0.0; this.ty = 0.0;
},
// ------------------------------
// 移動成分を乗算
// ------------------------------
translate:function(tx,ty){
this.tx += tx;
this.ty += ty;
},
// ------------------------------
// 回転成分を乗算(ラジアン)
// ------------------------------
rotate:function(angle){
var cos = Math.cos(angle);
var sin = Math.sin(angle);
var a = this.a;
var c = this.c;
var tx = this.tx;
this.a = a * cos + this.b * -sin;
this.b = a * sin + this.b * cos;
this.c = c * cos + this.d * -sin;
this.d = c * sin + this.d * cos;
this.tx = tx * cos + this.ty * -sin;
this.ty = tx * sin + this.ty * cos;
},
// ------------------------------
// 拡大縮小成分を乗算
// ------------------------------
scale:function(sx,sy){
this.a = this.a * sx;
this.b = this.b * sy;
this.c = this.c * sx;
this.d = this.d * sy;
this.tx = this.tx * sx;
this.ty = this.ty * sy;
},
// ------------------------------
// 行列を乗算 (this * m)
// ------------------------------
multiply:function(m){
var a = this.a;
var c = this.c;
var tx = this.tx;
this.a = a * m.a + this.b * m.c;
this.b = a * m.b + this.b * m.d;
this.c = c * m.a + this.d * m.c;
this.d = c * m.b + this.d * m.d;
this.tx = tx * m.a + this.ty * m.c + m.tx;
this.ty = tx * m.b + this.ty * m.d + m.ty;
},
// ------------------------------
// 座標を変換
// ------------------------------
transformPosition:function(pos){
return {
x:pos.x * this.a + pos.y * this.c + this.tx,
y:pos.x * this.b + pos.y * this.d + this.ty
};
},
// ------------------------------
// ベクトルを変換
// ------------------------------
transformVector:function(vec){
return {
x:vec.x * this.a + vec.y * this.c,
y:vec.x * this.b + vec.y * this.d
};
},
// ------------------------------
// 逆行列化
// ------------------------------
invert: function(){
var a = this.a;
var b = this.b;
var c = this.c;
var d = this.d;
var tx = this.tx;
var ty = this.ty;
this.a = 1.0; this.b = 0.0;
this.c = 0.0; this.d = 1.0;
this.tx = 0.0; this.ty = 0.0;
var b_ = b;
var d_ = d;
var ty_ = ty;
if(a){
this.a /= a;
b_ /= a;
}
d_ -= c * b_;
this.c -= c * this.a;
ty_ -= tx * b_;
this.tx -= tx * this.a;
if(d_){
this.c /= d_;
}
this.tx -= ty_ * this.c;
this.a -= b_ * this.c;
if(a){
this.b /= a;
b /= a;
}
d -= c * b;
this.d -= c * this.b;
ty -= tx * b;
this.ty -= tx * this.b;
if(d){
this.d /= d;
}
this.ty -= ty * this.d;
this.b -= b * this.d;
},
// ------------------------------
// 複製
// ------------------------------
clone:function(){
return new Matrix32(
this.a, this.b,
this.c, this.d,
this.tx, this.ty
);
},
// ------------------------------
// 文字列を取得
// ------------------------------
toString:function(){
return "matrix(" +
this.a.toFixed(20) + "," +
this.b.toFixed(20) + "," +
this.c.toFixed(20) + "," +
this.d.toFixed(20) + "," +
this.tx.toFixed(20) + "," +
this.ty.toFixed(20) +
")";
}
};
// ------------------------------
// 自身から直前方向へと順番に調べ、最初に見つかる要素を取得する
// ------------------------------
function DomNodeGetPreviousElementSibling(node){
node = node.previousSibling;
while(node){
if(node.nodeType == 1) break;
node = node.previousSibling;
}
return node;
}
// ------------------------------
// 自身から直後方向へと順番に調べ、最初に見つかる要素を取得する
// ------------------------------
function DomNodeGetNextElementSibling(node){
node = node.nextSibling;
while(node){
if(node.nodeType == 1) break;
node = node.nextSibling;
}
return node;
}
// ------------------------------
// ノードリストの最先頭から順番に調べ、最初に見つかる要素を取得する
// ------------------------------
function DomNodeGetFirstElementChild(node){
var nodes = node.childNodes;
var i;
var num = nodes.length;
for(i=0;i<num;i++){
if(nodes[i].nodeType == 1) return nodes[i];
}
return null;
}
// ------------------------------
// ノードリストの最後尾から順番に調べ、最初に見つかる要素を取得する
// ------------------------------
function DomNodeGetLastElementChild(node){
var nodes = node.childNodes;
var i;
var num = nodes.length;
for(i=num-1;i>=0;i--){
if(nodes[i].nodeType == 1) return nodes[i];
}
return null;
}
// ------------------------------
// DOM ノードの直前に DOM ノードを登録(削除予定)
// ------------------------------
function DomNodeInsertBefore(node_new,node_ref){
var parent = node_ref.parentNode;
if(!parent) return false;
var node = parent.insertBefore(node_new,node_ref);
return (node == node_new);
}
// ------------------------------
// DOM ノードの直後に DOM ノードを登録(削除予定)
// ------------------------------
function DomNodeInsertAfter(node_new,node_ref){
var parent = node_ref.parentNode;
if(!parent) return false;
var node = parent.insertBefore(node_new,node_ref.nextSibling);
return (node == node_new);
}
// ------------------------------
// 子の最先頭に登録(削除予定)
// ------------------------------
function DomNodeInsertFirstChild(node_new,node_ref){
try{
var child = node_ref.firstChild;
var node = node_ref.insertBefore(node_new,child);
return (node == node_new);
}catch(e){
return false;
}
}
// ------------------------------
// 子の最後尾に登録(削除予定)
// ------------------------------
function DomNodeInsertLastChild(node_new,node_ref){
try{
var node = node_ref.appendChild(node_new);
return (node == node_new);
}catch(e){
return false;
}
}
// ------------------------------
// DOM ノードの直前に DOM ノードを登録
// ------------------------------
function DomNode_InsertBefore(node_ref,node_new){
var parent = node_ref.parentNode;
if(!parent) return false;
var node = parent.insertBefore(node_new,node_ref);
return (node == node_new);
}
// ------------------------------
// DOM ノードの直後に DOM ノードを登録
// ------------------------------
function DomNode_InsertAfter(node_ref,node_new){
var parent = node_ref.parentNode;
if(!parent) return false;
var node = parent.insertBefore(node_new,node_ref.nextSibling);
return (node == node_new);
}
// ------------------------------
// 子の最先頭に登録
// ------------------------------
function DomNode_InsertFirstChild(node_ref,node_new){
try{
var child = node_ref.firstChild;
var node = node_ref.insertBefore(node_new,child);
return (node == node_new);
}catch(e){
return false;
}
}
// ------------------------------
// 子の最後尾に登録
// ------------------------------
function DomNode_InsertLastChild(node_ref,node_new){
try{
var node = node_ref.appendChild(node_new);
return (node == node_new);
}catch(e){
return false;
}
}
// ------------------------------
// DOM ノードの登録を外す
// ------------------------------
function DomNodeRemove(node_ref){
var parent = node_ref.parentNode;
if(!parent) return false;
var node = parent.removeChild(node_ref);
return (node == node_ref);
}
// ------------------------------
// DOM ノードが document に登録されているか調べる
// ------------------------------
function DomNodeGetAttachedDocument(node){
if(node.offsetParent) return true;
var selector_result = ElementMatchesSelector(node,"html *");
if(selector_result === undefined){
try{
while(node){
if(node == document) return true;
node = node.parentNode;
}
}catch(e){
}
}else if(selector_result){
return true;
}
return false;
}
// ------------------------------
// DOM ノードからノード値を取得
// ------------------------------
function DomNodeGetNodeValue(node){
try{
return node.nodeValue;
}catch(e){
}
return "";
}
// ------------------------------
// DOM ノードにノード値をセット
// ------------------------------
function DomNodeSetNodeValue(node,value){
try{
node.nodeValue = value;
}catch(e){
}
}
// ------------------------------
// DOM ノードが外れるか調べる
// ------------------------------
function DomNodeObserverRemoveFromDocument(node){
var _this = this;
// ------------------------------
// 開放
// ------------------------------
_this.release = function(){
if(_observer_remove_node){
_observer_remove_node.release();
_observer_remove_node = null;
}else if(node.removeEventListener){
node.removeEventListener('DOMNodeRemovedFromDocument',detectForMutationEvent);
}
};
// ------------------------------
// コールバック関数をセット
// ------------------------------
_this.setFunction = function(f){
_func = f;
};
// ------------------------------
// 検出(内部用)
// ------------------------------
function detect(e){
if(_func) _func(e);
}
// ------------------------------
// 検出(内部用)
// ------------------------------
function detectForMutationEvent(e){
execute_queue.attachLastForRemoveDomNode(detect,e);
}
// ------------------------------
// プライベート変数
// ------------------------------
var _func;
var _observer_remove_node;
// ------------------------------
// 初期化
// ------------------------------
(function(){
if(MutationObserverSupported()){
_observer_remove_node = document_observer_remove_node.createElement();
_observer_remove_node.setDomNode(node);
_observer_remove_node.setFunction(detect);
}else if(node.addEventListener){
node.addEventListener('DOMNodeRemovedFromDocument',detectForMutationEvent);
}
})();
}
// ------------------------------
// DOM ツリーのクライアント領域のバウンディング矩形を取得
// ------------------------------
function DomTreeGetBoundingClientRect(element){
var min_x;
var min_y;
var max_x;
var max_y;
var display_inline = {"inline":1};
function f(node){
if(node.getBoundingClientRect){
var r = node.getBoundingClientRect();
if(min_x > r.left ) min_x = r.left;
if(min_y > r.top ) min_y = r.top;
if(max_x < r.right ) max_x = r.right;
if(max_y < r.bottom) max_y = r.bottom;
}
var style = ElementGetComputedStyle(node,null);
if(style){
if(display_inline[style.display]){
var nodes = node.childNodes;
var i;
var num = nodes.length;
for(i=0;i<num;i++){
f(nodes[i]);
}
}
}
}
if(!(element.getBoundingClientRect)){
return null;
}
var r = element.getBoundingClientRect();
min_x = r.left;
min_y = r.top;
max_x = r.right;
max_y = r.bottom;
f(element);
return {
left:min_x,
top :min_y,
right :max_x,
bottom:max_y
};
}
// ------------------------------
// DOM ツリーのクライアント領域のコンテンツ矩形を取得
// ------------------------------
function DomTreeGetContentClientRect(element){
var rect = DomTreeGetBoundingClientRect(element);
var style = ElementGetComputedStyle(element,null);
if(style){
var re = new RegExp("^([-0-9.]+)px$","i");
var list = [
{style:"paddingLeft" ,key:"left" ,sign: 1},
{style:"paddingRight" ,key:"right" ,sign:-1},
{style:"paddingTop" ,key:"top" ,sign: 1},
{style:"paddingBottom" ,key:"bottom" ,sign:-1},
{style:"borderLeftWidth" ,key:"left" ,sign: 1},
{style:"borderRightWidth" ,key:"right" ,sign:-1},
{style:"borderTopWidth" ,key:"top" ,sign: 1},
{style:"borderBottomWidth" ,key:"bottom" ,sign:-1}
];
var i;
var num = list.length;
for(i=0;i<num;i++){
var param = list[i];
if(style[param.style]){
var m = style[param.style].match(re);
if(m){
rect[param.key] += parseFloat(m[0]) * param.sign;
}
}
}
}
return rect;
}
// ------------------------------
// エレメント複製
// ------------------------------
function ElementCloneNode(element,child_clone){
return element.cloneNode(child_clone);
}
// ------------------------------
// エレメントのテキストを取得
// ------------------------------
function ElementGetTextContent(element){
if(element.textContent !== undefined){
return element.textContent;
}
if(element.innerText !== undefined){
return element.innerText;
}
return "";
}
// ------------------------------
// エレメントにテキストをセット
// ------------------------------
function ElementSetTextContent(element,str){
if(element.textContent !== undefined){
element.textContent = str;
}
if(element.innerText !== undefined){
element.innerText = str;
}
}
// ------------------------------
// エレメントがセレクタとマッチするか調べる
// ------------------------------
function ElementMatchesSelector(element,selector){
if(element.matches){
return element.matches(selector);
}
if(element.webkitMatchesSelector){
return element.webkitMatchesSelector(selector);
}
if(element.mozMatchesSelector){
return element.mozMatchesSelector(selector);
}
if(element.oMatchesSelector){
return element.oMatchesSelector(selector);
}
if(element.msMatchesSelector){
return element.msMatchesSelector(selector);
}
return undefined;
}
// ------------------------------
// エレメントをフルスクリーン表示する関数
// ------------------------------
function ElementRequestFullscreen(element){
var list = [
"requestFullscreen",
"webkitRequestFullScreen",
"mozRequestFullScreen",
"msRequestFullscreen"
];
var i;
var num = list.length;
for(i=0;i < num;i++){
if(element[list[i]]){
element[list[i]]();
return true;
}
}
return false;
}
// ------------------------------
// エレメントから StyleSheet オブジェクトを取得する関数
// ------------------------------
function ElementGetStyleSheet(style_sheet){
if(style_sheet.sheet !== undefined){
return style_sheet.sheet;
}else if(style_sheet.styleSheet !== undefined){
return style_sheet.styleSheet;
}
return null;
}
// ------------------------------
// スタイルシートにルールを追加する関数
// ------------------------------
function CSSStyleSheetInsertRule(style_sheet,selector,style,index){
if(style_sheet.insertRule !== undefined){
style_sheet.insertRule(selector + "{" + style + "}",index);
}else if(style_sheet.addRule !== undefined){
style_sheet.addRule(selector,style,index);
}
return index;
}
// ------------------------------
// スタイルにプロパティをセット
// ------------------------------
function StyleDeclarationSetProperty(style,name,value){
if(style.setProperty){
style.setProperty(name,value);
}else{
try{
name = name.replace(/[-]([a-z])/g, function(s,p1){ return p1.toUpperCase(); });
style[name] = value;
}catch(e){
}
}
}
// ------------------------------
// スタイルの値を取得する関数
// ------------------------------
function StyleDeclarationGetPropertyValue(style,property_name){
if(style.getPropertyValue !== undefined){
return style.getPropertyValue(property_name);
}
try{
return style[property_name.replace(/([a-z]+)-([a-z])/g , function (str,p1,p2){ return p1 + p2.toUpperCase(); })];
}catch(e){
}
return null;
}
// ------------------------------
// スタイルからプロパティを削除
// ------------------------------
function StyleDeclarationRemoveProperty(style,name){
if(style.removeProperty){
style.removeProperty(name);
}else{
try{
name = name.replace(/[-]([a-z])/g, function(s,p1){ return p1.toUpperCase(); });
style[name] = "none";
delete style[name];
}catch(e){
}
}
}
// ------------------------------
// DivElement 用初期スタイル文字列を取得
// ------------------------------
function CSSTextGetInitialDivElement(){
return "" +
"background-attachment: scroll;" +
"background-blend-mode: normal;" +
"background-clip: border-box;" +
"background-color: rgba(0, 0, 0, 0);" +
"background-image: none;" +
"background-origin: padding-box;" +
"background-position: 0% 0%;" +
"background-repeat: repeat;" +
"background-size: auto;" +
"border-bottom-color: rgb(0, 0, 0);" +
"border-bottom-left-radius: 0px;" +
"border-bottom-right-radius: 0px;" +
"border-bottom-style: none;" +
"border-bottom-width: 0px;" +
"border-collapse: separate;" +
"border-image-outset: 0px;" +
"border-image-repeat: stretch;" +
"border-image-slice: 100%;" +
"border-image-source: none;" +
"border-image-width: 1;" +
"border-left-color: rgb(0, 0, 0);" +
"border-left-style: none;" +
"border-left-width: 0px;" +
"border-right-color: rgb(0, 0, 0);" +
"border-right-style: none;" +
"border-right-width: 0px;" +
"border-top-color: rgb(0, 0, 0);" +
"border-top-left-radius: 0px;" +
"border-top-right-radius: 0px;" +
"border-top-style: none;" +
"border-top-width: 0px;" +
"bottom: auto;" +
"box-shadow: none;" +
"box-sizing: content-box;" +
"caption-side: top;" +
"clear: none;" +
"clip: auto;" +
"color: rgb(0, 0, 0);" +
"cursor: auto;" +
"direction: ltr;" +
"display: block;" +
"empty-cells: show;" +
"float: none;" +
"font-family: 'MS PGothic';" +
"font-kerning: auto;" +
"font-size: 16px;" +
"font-style: normal;" +
"font-variant: normal;" +
"font-variant-ligatures: normal;" +
"font-weight: normal;" +
"height: auto;" +
"image-rendering: auto;" +
"left: auto;" +
"letter-spacing: normal;" +
"line-height: normal;" +
"list-style-image: none;" +
"list-style-position: outside;" +
"list-style-type: disc;" +
"margin-bottom: 0px;" +
"margin-left: 0px;" +
"margin-right: 0px;" +
"margin-top: 0px;" +
"max-height: none;" +
"max-width: none;" +
"min-height: 0px;" +
"min-width: 0px;" +
"object-fit: fill;" +
"object-position: 50% 50%;" +
"opacity: 1;" +
"orphans: auto;" +
"outline-color: rgb(0, 0, 0);" +
"outline-offset: 0px;" +
"outline-style: none;" +
"outline-width: 0px;" +
"overflow-wrap: normal;" +
"overflow-x: visible;" +
"overflow-y: visible;" +
"padding-bottom: 0px;" +
"padding-left: 0px;" +
"padding-right: 0px;" +
"padding-top: 0px;" +
"page-break-after: auto;" +
"page-break-before: auto;" +
"page-break-inside: auto;" +
"pointer-events: auto;" +
"position: static;" +
"resize: none;" +
"right: auto;" +
"speak: normal;" +
"table-layout: auto;" +
"tab-size: 8;" +
"text-align: start;" +
"text-decoration: none solid rgb(0, 0, 0);" +
"text-indent: 0px;" +
"text-rendering: auto;" +
"text-shadow: none;" +
"text-overflow: clip;" +
"text-transform: none;" +
"top: auto;" +
"transition-delay: 0s;" +
"transition-duration: 0s;" +
"transition-property: all;" +
"transition-timing-function: ease;" +
"unicode-bidi: normal;" +
"vertical-align: baseline;" +
"visibility: visible;" +
"white-space: normal;" +
"widows: auto;" +
"width: auto;" +
"word-break: normal;" +
"word-spacing: 0px;" +
"word-wrap: normal;" +
"z-index: auto;" +
"zoom: 1;" +
"align-content: stretch;" +
"align-items: stretch;" +
"align-self: stretch;" +
"flex-basis: auto;" +
"flex-grow: 0;" +
"flex-shrink: 1;" +
"flex-direction: row;" +
"flex-wrap: nowrap;" +
"justify-content: flex-start;" +
"order: 0;" +
"buffered-rendering: auto;" +
"clip-path: none;" +
"clip-rule: nonzero;" +
"mask: none;" +
"filter: none;" +
"flood-color: rgb(0, 0, 0);" +
"flood-opacity: 1;" +
"lighting-color: rgb(255, 255, 255);" +
"stop-color: rgb(0, 0, 0);" +
"stop-opacity: 1;" +
"color-interpolation: srgb;" +
"color-interpolation-filters: linearrgb;" +
"color-rendering: auto;" +
"fill: rgb(0, 0, 0);" +
"fill-opacity: 1;" +
"fill-rule: nonzero;" +
"marker-end: none;" +
"marker-mid: none;" +
"marker-start: none;" +
"mask-type: luminance;" +
"shape-rendering: auto;" +
"stroke: none;" +
"stroke-dasharray: none;" +
"stroke-dashoffset: 0;" +
"stroke-linecap: butt;" +
"stroke-linejoin: miter;" +
"stroke-miterlimit: 4;" +
"stroke-opacity: 1;" +
"stroke-width: 1;" +
"alignment-baseline: auto;" +
"baseline-shift: baseline;" +
"dominant-baseline: auto;" +
"kerning: 0;" +
"text-anchor: start;" +
"writing-mode: lr-tb;" +
"glyph-orientation-horizontal: 0deg;" +
"glyph-orientation-vertical: auto;" +
"vector-effect: none;" +
"paint-order: fill stroke markers;";
}
// ------------------------------
// ImageElement 用初期スタイル文字列を取得
// ------------------------------
function CSSTextGetInitialImageElement(){
return "" +
"background-attachment: scroll;" +
"background-blend-mode: normal;" +
"background-clip: border-box;" +
"background-color: rgba(0, 0, 0, 0);" +
"background-image: none;" +
"background-origin: padding-box;" +
"background-position: 0% 0%;" +
"background-repeat: repeat;" +
"background-size: auto;" +
"border-bottom-color: rgb(0, 0, 0);" +
"border-bottom-left-radius: 0px;" +
"border-bottom-right-radius: 0px;" +
"border-bottom-style: none;" +
"border-bottom-width: 0px;" +
"border-collapse: separate;" +
"border-image-outset: 0px;" +
"border-image-repeat: stretch;" +
"border-image-slice: 100%;" +
"border-image-source: none;" +
"border-image-width: 1;" +
"border-left-color: rgb(0, 0, 0);" +
"border-left-style: none;" +
"border-left-width: 0px;" +
"border-right-color: rgb(0, 0, 0);" +
"border-right-style: none;" +
"border-right-width: 0px;" +
"border-top-color: rgb(0, 0, 0);" +
"border-top-left-radius: 0px;" +
"border-top-right-radius: 0px;" +
"border-top-style: none;" +
"border-top-width: 0px;" +
"bottom: auto;" +
"box-shadow: none;" +
"box-sizing: content-box;" +
"caption-side: top;" +
"clear: none;" +
"clip: auto;" +
"color: rgb(0, 0, 0);" +
"cursor: auto;" +
"direction: ltr;" +
"display: inline;" +
"empty-cells: show;" +
"float: none;" +
"font-family: 'MS PGothic';" +
"font-kerning: auto;" +
"font-size: 16px;" +
"font-style: normal;" +
"font-variant: normal;" +
"font-variant-ligatures: normal;" +
"font-weight: normal;" +
"height: auto;" +
"image-rendering: auto;" +
"left: auto;" +
"letter-spacing: normal;" +
"line-height: normal;" +
"list-style-image: none;" +
"list-style-position: outside;" +
"list-style-type: disc;" +
"margin-bottom: 0px;" +
"margin-left: 0px;" +
"margin-right: 0px;" +
"margin-top: 0px;" +
"max-height: none;" +
"max-width: none;" +
"min-height: 0px;" +
"min-width: 0px;" +
"object-fit: fill;" +
"object-position: 50% 50%;" +
"opacity: 1;" +
"orphans: auto;" +
"outline-color: rgb(0, 0, 0);" +
"outline-offset: 0px;" +
"outline-style: none;" +
"outline-width: 0px;" +
"overflow-wrap: normal;" +
"overflow-x: visible;" +
"overflow-y: visible;" +
"padding-bottom: 0px;" +
"padding-left: 0px;" +
"padding-right: 0px;" +
"padding-top: 0px;" +
"page-break-after: auto;" +
"page-break-before: auto;" +
"page-break-inside: auto;" +
"pointer-events: auto;" +
"position: static;" +
"resize: none;" +
"right: auto;" +
"speak: normal;" +
"table-layout: auto;" +
"tab-size: 8;" +
"text-align: start;" +
"text-decoration: none solid rgb(0, 0, 0);" +
"text-indent: 0px;" +
"text-rendering: auto;" +
"text-shadow: none;" +
"text-overflow: clip;" +
"text-transform: none;" +
"top: auto;" +
"transition-delay: 0s;" +
"transition-duration: 0s;" +
"transition-property: all;" +
"transition-timing-function: ease;" +
"unicode-bidi: normal;" +
"vertical-align: baseline;" +
"visibility: visible;" +
"white-space: normal;" +
"widows: auto;" +
"width: auto;" +
"word-break: normal;" +
"word-spacing: 0px;" +
"word-wrap: normal;" +
"z-index: auto;" +
"zoom: 1;" +
"align-content: stretch;" +
"align-items: stretch;" +
"align-self: stretch;" +
"flex-basis: auto;" +
"flex-grow: 0;" +
"flex-shrink: 1;" +
"flex-direction: row;" +
"flex-wrap: nowrap;" +
"justify-content: flex-start;" +
"order: 0;" +
"buffered-rendering: auto;" +
"clip-path: none;" +
"clip-rule: nonzero;" +
"mask: none;" +
"filter: none;" +
"flood-color: rgb(0, 0, 0);" +
"flood-opacity: 1;" +
"lighting-color: rgb(255, 255, 255);" +
"stop-color: rgb(0, 0, 0);" +
"stop-opacity: 1;" +
"color-interpolation: srgb;" +
"color-interpolation-filters: linearrgb;" +
"color-rendering: auto;" +
"fill: rgb(0, 0, 0);" +
"fill-opacity: 1;" +
"fill-rule: nonzero;" +
"marker-end: none;" +
"marker-mid: none;" +
"marker-start: none;" +
"mask-type: luminance;" +
"shape-rendering: auto;" +
"stroke: none;" +
"stroke-dasharray: none;" +
"stroke-dashoffset: 0;" +
"stroke-linecap: butt;" +
"stroke-linejoin: miter;" +
"stroke-miterlimit: 4;" +
"stroke-opacity: 1;" +
"stroke-width: 1;" +
"alignment-baseline: auto;" +
"baseline-shift: baseline;" +
"dominant-baseline: auto;" +
"kerning: 0;" +
"text-anchor: start;" +
"writing-mode: lr-tb;" +
"glyph-orientation-horizontal: 0deg;" +
"glyph-orientation-vertical: auto;" +
"vector-effect: none;" +
"paint-order: fill stroke markers;";
}
// ------------------------------
// ButtonElement 用初期スタイル文字列を取得
// ------------------------------
function CSSTextGetInitialButtonElement(){
return "" +
"bottom: auto;" +
"box-shadow: none;" +
"box-sizing: border-box;" +
"caption-side: top;" +
"clear: none;" +
"clip: auto;" +
"color: rgb(0, 0, 0);" +
"cursor: default;" +
"direction: ltr;" +
"display: inline-block;" +
"empty-cells: show;" +
"float: none;" +
"height: auto;" +
"font-family: Arial;" +
"font-kerning: auto;" +
"font-size: 13.142857551574707px;" +
"font-style: normal;" +
"font-variant: normal;" +
"font-variant-ligatures: normal;" +
"font-weight: normal;" +
"image-rendering: auto;" +
"left: auto;" +
"letter-spacing: normal;" +
"line-height: normal;" +
"list-style-image: none;" +
"list-style-position: outside;" +
"list-style-type: disc;" +
"margin-bottom: 1.7142857313156128px;" +
"margin-left: 1.7142857313156128px;" +
"margin-right: 1.7142857313156128px;" +
"margin-top: 1.7142857313156128px;" +
"max-height: none;" +
"max-width: none;" +
"min-height: 0px;" +
"min-width: 0px;" +
"object-fit: fill;" +
"object-position: 50% 50%;" +
"opacity: 1;" +
"orphans: auto;" +
"outline-color: rgb(0, 0, 0);" +
"outline-offset: 0px;" +
"outline-style: none;" +
"outline-width: 0px;" +
"overflow-wrap: normal;" +
"overflow-x: visible;" +
"overflow-y: visible;" +
"padding-bottom: 1px;" +
"padding-left: 6px;" +
"padding-right: 6px;" +
"padding-top: 1px;" +
"page-break-after: auto;" +
"page-break-before: auto;" +
"page-break-inside: auto;" +
"pointer-events: auto;" +
"position: static;" +
"resize: none;" +
"right: auto;" +
"speak: normal;" +
"table-layout: auto;" +
"tab-size: 8;" +
"text-align: center;" +
"text-decoration: none solid rgb(0, 0, 0);" +
"text-indent: 0px;" +
"text-rendering: auto;" +
"text-shadow: none;" +
"text-overflow: clip;" +
"text-transform: none;" +
"top: auto;" +
"transition-delay: 0s;" +
"transition-duration: 0s;" +
"transition-property: all;" +
"transition-timing-function: ease;" +
"unicode-bidi: normal;" +
"vertical-align: baseline;" +
"visibility: visible;" +
"white-space: normal;" +
"widows: auto;" +
"width: auto;" +
"word-break: normal;" +
"word-spacing: 0px;" +
"word-wrap: normal;" +
"z-index: auto;" +
"zoom: 1;" +
"align-content: stretch;" +
"align-items: flex-start;" +
"align-self: stretch;" +
"flex-basis: auto;" +
"flex-grow: 0;" +
"flex-shrink: 1;" +
"flex-direction: row;" +
"flex-wrap: nowrap;" +
"justify-content: flex-start;" +
"order: 0;" +
"buffered-rendering: auto;" +
"clip-path: none;" +
"clip-rule: nonzero;" +
"mask: none;" +
"filter: none;" +
"flood-color: rgb(0, 0, 0);" +
"flood-opacity: 1;" +
"lighting-color: rgb(255, 255, 255);" +
"stop-color: rgb(0, 0, 0);" +
"stop-opacity: 1;" +
"color-interpolation: srgb;" +
"color-interpolation-filters: linearrgb;" +
"color-rendering: auto;" +
"fill: rgb(0, 0, 0);" +
"fill-opacity: 1;" +
"fill-rule: nonzero;" +
"marker-end: none;" +
"marker-mid: none;" +
"marker-start: none;" +
"mask-type: luminance;" +
"shape-rendering: auto;" +
"stroke: none;" +
"stroke-dasharray: none;" +
"stroke-dashoffset: 0;" +
"stroke-linecap: butt;" +
"stroke-linejoin: miter;" +
"stroke-miterlimit: 4;" +
"stroke-opacity: 1;" +
"stroke-width: 1;" +
"alignment-baseline: auto;" +
"baseline-shift: baseline;" +
"dominant-baseline: auto;" +
"kerning: 0;" +
"text-anchor: start;" +
"writing-mode: lr-tb;" +
"glyph-orientation-horizontal: 0deg;" +
"glyph-orientation-vertical: auto;" +
"vector-effect: none;" +
"paint-order: fill stroke markers;";
}
// ------------------------------
// イメージを複製
// ------------------------------
function ImageClone(image){
var c = document.createElement("img");
c.src = image.src;
return c;
}
// ------------------------------
// イメージの読み込みが完了したか取得する
// ------------------------------
function ImageGetLoaded (image,func) {
function addEvent(){
var event_handler_release = page_expand_event_dispatcher.createEventHandler("release");
event_handler_release.setFunction(function(){
removeEvent();
});
var removeEvent = function(){
if(event_handler_release){
event_handler_release.release();
event_handler_release = null;
}
if(image.removeEventListener){
image.removeEventListener("load" ,complete);
image.removeEventListener("error",complete);
}else if(image.detachEvent){
image.detachEvent("onload" ,complete);
image.detachEvent("onerror",complete);
}
func();
};
var complete = function(){
removeEvent();
func();
};
if(image.addEventListener){
image.addEventListener("load" ,complete);
image.addEventListener("error",complete);
}else if(image.attachEvent){
image.attachEvent("onload" ,complete);
image.attachEvent("onerror",complete);
}
}
if(image.complete){
if(image.naturalHeight === 0){
var timer = new Timer(1000,1);
timer.oncomplete = function(){
if(image.complete){
func();
}else{
addEvent();
}
};
timer.start();
}else{
func();
}
}else{
addEvent();
}
}
// ------------------------------
// イメージのデフォルトのサイズを取得
// ------------------------------
function ImageGetNaturalSize(image) {
if(image.naturalWidth === undefined){
}else if(image.naturalHeight === undefined){
}else{
return {
width :image.naturalWidth,
height:image.naturalHeight
};
}
// Opera 用
if(UserAgentGetOpera()){
var w = image.width;
var h = image.height;
image.removeAttribute("width");
image.removeAttribute("height");
var size = {
width :image.width,
height:image.height
};
image.width = w;
image.height = h;
return size;
}
image = ElementCloneNode(image,false);
return {
width :image.width,
height:image.height
};
}
// ------------------------------
// 擬似スクロール
// ------------------------------
function WheelScrollFromElement(vector,target,current){
var p = {
result:false,
vector:{x:0,y:0},
target:null
};
var overflow_hidden_x = {"hidden":1};
var overflow_hidden_y = {"hidden":1};
while(target){
if(target == current){
break;
}
if(current.compareDocumentPosition){
var dom_pos = current.compareDocumentPosition(target);
if(dom_pos & document.DOCUMENT_POSITION_CONTAINS){
break;
}
}
var computed_style = ElementGetComputedStyle(target,null);
if(!computed_style) computed_style = {};
var min_x = 0;
var max_x = target.scrollWidth - target.clientWidth;
var old_x = target.scrollLeft;
var new_x = old_x + vector.x;
if(!(vector.x)){
}else if(overflow_hidden_x[computed_style.overflowX]){
}else if((vector.x < 0) && (min_x >= old_x)){
}else if((vector.x > 0) && (max_x <= old_x)){
}else{
if(new_x < min_x) new_x = min_x;
if(new_x > max_x) new_x = max_x;
target.scrollLeft = new_x;
if(target.scrollLeft != old_x){
p.result = true;
p.target = target;
p.vector.x = new_x - old_x;
}
}
var min_y = 0;
var max_y = target.scrollHeight - target.clientHeight;
var old_y = target.scrollTop;
var new_y = old_y + vector.y;
if(!(vector.y)){
}else if(overflow_hidden_y[computed_style.overflowY]){
}else if((vector.y < 0) && (min_y >= old_y)){
}else if((vector.y > 0) && (max_y <= old_y)){
}else{
if(new_y < min_y) new_y = min_y;
if(new_y > max_y) new_y = max_y;
target.scrollTop = new_y;
if(target.scrollTop != old_y){
p.result = true;
p.target = target;
p.vector.y = new_y - old_y;
}
}
if(p.result) break;
target = target.parentElement;
}
return p;
}
// ------------------------------
// 初期化
// ------------------------------
switch(page_expand_arguments.execute_type){
// ------------------------------
// ユーザースクリプトとして動作
// ------------------------------
case "UserScript":
// 実行除外
if(page_expand_arguments.page_expand_parent){
}else{
if(WindowIsExecutedByPageExpand(window)) return;
}
// PageExpand 初期化
PageExpandInitialize();
// プロジェクトをロード
page_expand_project = new PageExpandProject();
page_expand_project.loadLocalStorage(function(result){
project = new Project();
project.importObject(ObjectCopy(page_expand_project.getProject(WindowGetOwnerURL(window))));
// ロケール
var _i18n = new InternationalMessage(page_expand_project.getLanguage());
// ------------------------------
// ロードブロック
// ------------------------------
if(document.addEventListener){
document.addEventListener("beforeload", function(e){
if(project.checkAccessBlock(e.url)){
e.preventDefault();
if(project.getEnableOutputLog()){
ConsoleLog({type:"AccessBlock",current_url:document.URL,url:e.url,call:"document.beforeload"});
}
}
}, true);
}
// ------------------------------
// メニューコマンドの追加(設定)
// ------------------------------
if(page_expand_arguments.admin != page_expand_arguments.window){
}else if(GM_registerMenuCommandSupported()){
GM_registerMenuCommand(_i18n.getMessage("context_menu_batch_download_image"), function(){
if (WindowIsChild(window)){
}else{
download_list_image.createArchive();
}
},"i");
GM_registerMenuCommand(_i18n.getMessage("context_menu_batch_download_user"), function(){
if (WindowIsChild(window)){
}else{
download_list_user.createArchive();
}
},"u");
(function(){
// PageExpand 設定の動作を許すアドレス
var config_allow_filter = "https://raw.githubusercontent.com/hakuhin/PageExpand/master/GreaseMonkey/options";
function start(){
// PageExpand コンストラクタ
PageExpandConstructor();
// 実行開始
PageExpandStart();
var config = new PageExpandConfig();
config.initialize(function(result){
config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_STANDARD);
});
}
if(StringUrlMatchAsteriskWord(document.URL,config_allow_filter + "*")){
if(confirm(_i18n.getMessage("context_menu_pageexpand_config_auto_run_confirm"))){
start();
}
}
GM_registerMenuCommand(_i18n.getMessage("context_menu_pageexpand_config"), function(){
if(StringUrlMatchAsteriskWord(document.URL,config_allow_filter + "*")){
start();
}else{
if(confirm(_i18n.getMessage("context_menu_pageexpand_config_current_page_confirm") + config_allow_filter)){
window.open(config_allow_filter,"_blank");
}
}
},"c");
})();
}
// 実行可能
if(project.getEnable()){
// PageExpand コンストラクタ
PageExpandConstructor();
// ------------------------------
// メニューコマンドの追加
// ------------------------------
if(GM_registerMenuCommandSupported()){
// フレーム内では動作させない
if (WindowIsChild(window)){
}else if(page_expand_arguments.admin != page_expand_arguments.window){
}else{
if(!(project.getEnableStartup())){
GM_registerMenuCommand(_i18n.getMessage("context_menu_pageexpand_execute"), function(){
PageExpandStart();
},"e");
}
GM_registerMenuCommand(_i18n.getMessage("context_menu_pageexpand_abort"), function(){
PageExpandRelease();
},"a");
GM_registerMenuCommand(_i18n.getMessage("context_menu_pageexpand_debug"), function(){
// デバッグモード
page_expand_debug.setVisible(true);
},"d");
}
}
if((page_expand_arguments.page_expand_parent) || project.getEnableStartup()){
// 実行開始
PageExpandStart();
}
}
});
break;
};
})({execute_type:"UserScript",admin:window,window:window});