// -------------------------------------------------------------------------------- // PageExpand // // Hakuhin 2010-2023 https://hakuhin.jp // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // ユーザースクリプトメタデータ // -------------------------------------------------------------------------------- // ==UserScript== // @name PageExpand // @name:ja PageExpand // @name:zh PageExpand // @version 1.6.2 // @namespace http://hakuhin.jp/page_expand // @description Popup image. Batch download. Extend BBS. etc... // @description:ja 画像のポップアップ、一括ダウンロードツール、匿名掲示板の専ブラ機能など // @description:zh 图片缩放、批量下载、扩展BBS,等等... // @match http://*/* // @match https://*/* // @match ftp://*/* // @connect * // @icon https://hakuhin.github.io/PageExpand/GreaseMonkey/icon32.png // @icon64 https://hakuhin.github.io/PageExpand/GreaseMonkey/icon64.png // @updateURL https://hakuhin.github.io/PageExpand/GreaseMonkey/PageExpand.meta.js // @downloadURL https://hakuhin.github.io/PageExpand/GreaseMonkey/PageExpand.user.js // @author hakuhin // @grant GM.xmlHttpRequest // @grant GM_xmlhttpRequest // @grant GM.getValue // @grant GM_getValue // @grant GM.setValue // @grant GM_setValue // @grant GM.deleteValue // @grant GM_deleteValue // @grant GM.openInTab // @grant GM_openInTab // @grant GM.registerMenuCommand // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_download // ==/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 url_info_dictionary; // NodeInfo辞書 var node_info_dictionary; // タスク関連 var task_container; var task_execute_level; // 最速実行 var page_expand_execute_faster; // デバッグ関連 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 analyze_work_dictionary; // 掲示板辞書 var bbs_dictionary; // 掲示板拡張 var expand_bbs; // プリセットスクリプト辞書 var preset_script_dictionary; // 拡張機能通信 var extension_message; // ウィンドウ管理 var window_manager; // ダウンロードボード var download_board; // 開始済み 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 LoaderQueue(); } // アドレス関連 if(!url_info_dictionary){ url_info_dictionary = new UrlInfoDictionary(); } // NodeInfo辞書 if(!node_info_dictionary){ node_info_dictionary = new NodeInfoDictionary(); } // タスクコンテナを生成 if(!task_container){ task_container = new TaskContainer(); task_execute_level = 0xffffffff; // -------------------------------------------------------------------------------- // 実行ループ // -------------------------------------------------------------------------------- (function(){ var time_handle = null; // 開始関数をセット task_container.setStartFunc(function(){ if(time_handle !== null) return; time_handle = setInterval(function (){ task_container.execute(task_execute_level); }, 1000 / 60); }); // 終了関数をセット task_container.setEndFunc(function(){ if(time_handle === null) return; clearInterval(time_handle); time_handle = null; }); })(); } // 最速実行 if(!page_expand_execute_faster){ page_expand_execute_faster = new PageExpandExecuteFaster(); } // デバッグ 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(!analyze_work_dictionary){ analyze_work_dictionary = new AnalyzeWorkDictionary(); } // 掲示板辞書 if(!bbs_dictionary){ bbs_dictionary = new BbsDictionary(); } // ウィンドウ管理 if(!window_manager){ window_manager = new WindowManager(window); } // ダウンロードボード if(!download_board){ download_board = new PageExpandDownloadBoard(); } // 掲示板拡張 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("^(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(download_board){ download_board.release(); download_board = null; } // ウィンドウ管理 if(window_manager){ window_manager.release(); window_manager = null; } // 拡張機能通信 if(extension_message){ extension_message.release(); extension_message = null; } // 最速実行 if(page_expand_execute_faster){ page_expand_execute_faster.release(); page_expand_execute_faster = null; } // デバッグ関連 if(page_expand_debug){ page_expand_debug.release(); page_expand_debug = null; } // 掲示板辞書 if(bbs_dictionary){ bbs_dictionary.release(); bbs_dictionary = null; } // プリセットスクリプト辞書 if(preset_script_dictionary){ preset_script_dictionary.release(); preset_script_dictionary = null; } // 解析辞書 if(analyze_work_dictionary){ analyze_work_dictionary.release(); analyze_work_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(url_info_dictionary){ url_info_dictionary.release(); url_info_dictionary = null; } // NodeInfo辞書 if(node_info_dictionary){ node_info_dictionary.release(); node_info_dictionary = 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()){ // フレーム内では動作させない if (!WindowIsChild(window)){ 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 element_pos) num = element_pos; for(i=0;i 0) element_pos -= 1; frame = 60; } }else if(execute_queue.getCountQueue() <= 0){ frame -= 1; } }); })(); } // 解析開始 execute_queue.attachLastForInsertDomNode(DomNodeAnalyzeRoot,document.documentElement); page_expand_execute_faster.startedAnalyze(); } // DOM 構築完了 DocumentGetLoadedDomContent(document,function(){ DocumentLoaded(); }); } // -------------------------------------------------------------------------------- // PageExpand 最速実行 // -------------------------------------------------------------------------------- function PageExpandExecuteFaster(){ var _this = this; // -------------------------------------------------------------------------------- // 解放 // -------------------------------------------------------------------------------- _this.release = function (){ if(_task){ _task.release(); _task = null; } }; // -------------------------------------------------------------------------------- // 開始 // -------------------------------------------------------------------------------- _this.start = function (){ if(!_started_analyze){ _request = true; return; } start(); }; // -------------------------------------------------------------------------------- // 解析を開始 // -------------------------------------------------------------------------------- _this.startedAnalyze = function (){ _started_analyze = true; if(_request){ _request = false; start(); } }; // -------------------------------------------------------------------------------- // 開始 // -------------------------------------------------------------------------------- function start(){ if(_executing) return; _executing = true; var scroll_pos = WindowGetScrollPosition(window); var html = document.documentElement; var style_display = html.style.display; html.style.display = "none"; setTimeout(function(){ execute_queue.setOccupancyTime(1000); execute_queue.setSleepTime(0); _task = task_container.createTask(); _task.setExecuteFunc(function(task){ if(execute_queue.getCountQueue() <= 0){ task.release(); } }); _task.setDestructorFunc(function(task){ if(style_display === undefined){ StyleDeclarationRemoveProperty(html.style,"display"); }else{ StyleDeclarationSetProperty(html.style,"display",style_display); } WindowSetScrollPosition(window,scroll_pos); execute_queue.setOccupancyTime(project.getExecuteQueueOccupancyTime()); execute_queue.setSleepTime(project.getExecuteQueueSleepTime()); _executing = false; _task = null; }); },0); }; var _started_analyze = false; var _request = false; var _executing = false; var _task = null; } function PageExpandExecuteFastest(){ if(page_expand_execute_faster){ page_expand_execute_faster.start(); } } // -------------------------------------------------------------------------------- // 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; // 言語設定 proj_obj.language = _proj_src.language; // 簡易フィルタ 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 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.checkMixedContent = function(url){ if(_proj_ins.current_secure){ if(url.indexOf("http://") == 0){ return true; } } return false; }; // -------------------------------------------------------------------------------- // パッシブコンテンツのアドレスを修正 // -------------------------------------------------------------------------------- _this.fixURL_PassiveContent = function(url){ if(_proj_ins.mixed_passive_content == "unsafe") return url; if(_this.checkMixedContent(url)){ return "https://" + url.slice(7); } return url; }; // -------------------------------------------------------------------------------- // アクティブコンテンツのアドレスを修正 // -------------------------------------------------------------------------------- _this.fixURL_ActiveContent = function(url){ if(_proj_ins.mixed_active_content == "unsafe") return url; if(_this.checkMixedContent(url)){ return "https://" + url.slice(7); } return url; }; // -------------------------------------------------------------------------------- // IFRAME 要素の展開が可能か // -------------------------------------------------------------------------------- _this.checkAllowExpandIframeElement = 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=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=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"; case "filename": return ""; case "domain": return "-"; case "date": return "/"; } return ""; } // -------------------------------------------------------------------------------- // ダウンロード保存先 ファイル名を取得 // -------------------------------------------------------------------------------- function ProjectDownloadSaveFile_GetFileNameFromDetail(detail,url){ function ntos(n,d){ var s = String(n); var l = s.length; while(l < d){ s = "0" + s; l ++; } return s; } var parser = URL_Parser(url); var kebab_url = url.replace(/\//g,"-"); var date = new Date(); var year = ntos(date.getFullYear(),4); var month = ntos(date.getMonth()+1,2); var day = ntos(date.getDate(),2); var hour = ntos(date.getHours(),2); var minute = ntos(date.getMinutes(),2); var second = ntos(date.getSeconds(),2); var millisecond = ntos(date.getMilliseconds(),3); var unixtime = Math.floor(date.getTime() / 1000); var str = detail; str = str.replace(//gi,url); str = str.replace(//gi,kebab_url); str = str.replace(//gi,parser.origin); str = str.replace(//gi,parser.hostname); str = str.replace(//gi,parser.filename); str = str.replace(//gi,parser.name); str = str.replace(//gi,parser.ext); str = str.replace(//gi,parser.search); str = str.replace(//gi,parser.hash); str = str.replace(//gi,year); str = str.replace(//gi,month); str = str.replace(//gi,day); str = str.replace(//gi,hour); str = str.replace(//gi,minute); str = str.replace(//gi,second); str = str.replace(//gi,millisecond); str = str.replace(//gi,unixtime); return str; } // -------------------------------------------------------------------------------- // ダウンロード保存先 消毒化 // -------------------------------------------------------------------------------- function ProjectDownloadSaveFile_Sanitize(url){ var e = new Array(); var a = url.split(new RegExp("[/\\\\]+","i")); var i; var num = a.length; for(i=0;i|~/]/g,"-"); e.push(f); } return e.join("/"); } // -------------------------------------------------------------------------------- // 保存先の決定 // -------------------------------------------------------------------------------- function ProjectDownloadSaveFile_Determining(request,optional){ optional = optional || {}; var response = { filename:"", error:"" }; var filename; var hasExt = false; var url_parser; if(request.filename){ hasExt = true; }else if(request.saveURL){ url_parser = URL_Parser(request.saveURL); hasExt = Boolean(url_parser.ext); }else if(request.url){ url_parser = URL_Parser(request.url); hasExt = Boolean(url_parser.ext); } if(optional.type == "download"){ filename = ProjectDownloadSaveFile_Sanitize(request.filename || project.getSaveFileDownload(request.saveURL || request.url)); }else{ filename = ProjectDownloadSaveFile_Sanitize(project.getSaveFileBatchDownload(request.saveURL || request.url)); } // ファイル名が長すぎるとフリーズするので回避 if(filename.length > 65535){ response.error = "File name too long."; return response; } // 拡張子付与 var ext_old = ""; var ext_new = optional.ext || ""; if(ext_new){ if(hasExt){ var m = filename.match(new RegExp("[.]([a-zA-Z0-9]*)$","i")); if(m){ ext_old = m[1]; if(!MIMEType_is_Same(ext_old,ext_new)){ filename = filename.slice(0,m.index) + "." + ext_new; } }else{ filename += "." + ext_new; } }else{ filename += "." + ext_new; } } response.filename = filename; return response; } // -------------------------------------------------------------------------------- // 短いアドレスを生成 // -------------------------------------------------------------------------------- var ShortURLCreater = (function(){ function dispatch_success(){ var f = this.onsuccess; if(f) f(this); } function dispatch_error(reason){ var f = this.onerror; if(f) f(reason); } var ShortURLCreater = function(){ this.exec_methods = new ExecuteMethods(this); }; ShortURLCreater.prototype = { release : function(){ if(this.released) return; this.released = true; if(this.exec_methods){ this.exec_methods.release(); this.exec_methods = null; } if(this.file_reader){ this.file_reader.abort(); this.file_reader = null; } delete this.url_info; delete this.blob; }, setUrlInfo : function(url_info){ this.url_info = url_info; }, setBlob : function(blob){ this.blob = blob; }, start : function(){ var _this = this; var url_info = this.url_info; // CRC32 を計算 this.exec_methods.push(function (callback){ var crc32 = new CRC32(); var pos = 0; var read_size = 1024 * 1024 * 1; var total = _this.blob.size; var f = function (){ var file_reader = _this.file_reader = new FileReader(); file_reader.onloadend = function(){ if(_this.released) return; if(file_reader.error){ dispatch_error.call(_this,file_reader.error); return; } _this.hash = crc32.getFromArrayBuffer(file_reader.result); pos += read_size; if(pos < total){ f(); return; } callback(); }; file_reader.readAsArrayBuffer(_this.blob.slice(pos,pos+read_size)); }; f(); }); // シグネチャーから拡張子を取得 this.exec_methods.push(function(callback){ var ext = url_info.getValue("ext"); if(ext){ callback(); return; } var file_reader = _this.file_reader = new FileReader(); file_reader.onloadend = function(){ if(_this.released) return; if(file_reader.error){ response.errorText = file_reader.error; reply({state:"complete"}); return; } var ext = FileSignature_To_Ext_From_ArrayBuffer(file_reader.result); var mimetype = MIMEType_From_Ext(ext); if(ext && mimetype){ url_info.setValue("mimetype",mimetype); url_info.setValue("ext",ext); } callback(); }; file_reader.readAsArrayBuffer(_this.blob.slice(0,16)); }); // 短いアドレスを生成 this.exec_methods.push(function(callback){ var mimetype = url_info.getValue("type"); var ext = url_info.getValue("ext"); var filepath = "data:" + mimetype.replace(/[/]/g,"-"); var filename = ("00000000" + _this.hash.toString(16).toUpperCase()).slice(-8); if(ext) filename += "." + ext; _this.shortURL = filepath + "/" + filename; url_info.setValue("name",filename); dispatch_success.call(_this); }); }, onsuccess : function(){}, onerror : function(){}, released : false, shortURL : "" }; return ShortURLCreater; })(); // -------------------------------------------------------------------------------- // プロジェクトのアップデート // -------------------------------------------------------------------------------- function PageExpandProjectObjectUpdate(proj,param){ // -------------------------------------------------------------------------------- // プリセットを追加 // -------------------------------------------------------------------------------- function addPreset(ary,id,insert){ var i; var obj; var num = ary.length; for(i=0;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=0;j--){ if(a[j] === id){ a.splice(j,1); if(a.length == 0){ o.enable = false; } } } }else if(o.id === id){ o.id = ""; o.enable = false; } } for(i=0;i=0;j--){ if(a[j] === id){ a[j] = def_bak.id; o.enable = true; is_used = true; } } }else if(o.id === id){ o.id = def_bak.id; o.enable = true; is_used = true; } } })(); var result = false; if(!(is_define) && (is_user)) result = true; if(is_used) result = true; if(result){ def_list.push(def_bak); } return def_old; } // -------------------------------------------------------------------------------- // プリセット更新 // -------------------------------------------------------------------------------- function updatePreset(ary,id,func){ var p; var i; var num = ary.length; if(id == "*"){ for(i=0;i= 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:"" }; // -------------------------------------------------------------------------------- // テキスト置換定義 // -------------------------------------------------------------------------------- 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:"" }; // -------------------------------------------------------------------------------- // ハイパーリンク置換定義 // -------------------------------------------------------------------------------- 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:"" }; // ソーシャルサービスのカウント数を表示 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:"", 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 = ""; }); // 削除 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:"" }; // -------------------------------------------------------------------------------- // アンカー置換定義 // -------------------------------------------------------------------------------- // イメージ検索用ポップアップ無効化 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 = ""; // -------------------------------------------------------------------------------- // イメージ展開定義 // -------------------------------------------------------------------------------- // サムネイル表示 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 = ""; // -------------------------------------------------------------------------------- // インラインフレーム展開定義 // -------------------------------------------------------------------------------- // Flash のインライン表示 var obj = addPreset(proj.expand_iframe,"expand_flash_inline",null); obj.preset.inline.script_allow = ""; // PDF のインライン表示 var obj = addPreset(proj.expand_iframe,"expand_pdf_inline",null); obj.preset.inline.script_allow = ""; // -------------------------------------------------------------------------------- // スタイルシート定義 // -------------------------------------------------------------------------------- // 追加 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:"" }; // -------------------------------------------------------------------------------- // ハイパーリンク置換定義 // -------------------------------------------------------------------------------- // 直リンク(汎用) 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.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 = ""; 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 = ""; 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= 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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「フォントの種類をメイリオに変更」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_MeiryoFont" , [ 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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「展開アシスト(アンカー内画像用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_AssistImageInAnchor" , [ 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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「展開アシスト(画像検索用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_AssistImageSearch" , [ function(info,response){ var element = info.element; if(element.tagName == "DIV"){ // Google Image Search (2024/03/23以降) try{ if("docid" in element.dataset){ var image = element.getElementsByTagName("IMG")[0]; if(image){ var mouse_event = document.createEvent("MouseEvent"); mouse_event.initMouseEvent("mouseover",true,false,document.defaultView,0,0,0,0,0,false,false,false,false,0,null); image.dispatchEvent(mouse_event); return true; } } }catch(e){} // Google Image Search (2024/03/23以前) try{ var data_ri = element.getAttribute("data-ri"); if(data_ri){ var image = element.getElementsByTagName("IMG")[0]; if(image){ var mouse_event = document.createEvent("MouseEvent"); mouse_event.initMouseEvent("mousedown",true,false,document.defaultView,0,0,0,0,0,false,false,false,false,0,null); image.dispatchEvent(mouse_event); return true; } } }catch(e){} } return false; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「展開アシスト(ツイッター用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_AssistTwitter" , [ function(info,response){ var element = info.element; // 画像検索上のサムネイル if(element.tagName == "IMG"){ var m = element.src.match(/(http|https)(:[/][/]pbs[.]twimg[.]com[/](media|card_img)[/][^?]+)[?].*format=/); if(m){ if((function (){ var allow_list = {"card.layoutLarge.media":1,"tweetPhoto":1,"swipe-to-dismiss":1}; var node = element; while(node){ if(node.nodeType == 1){ if(allow_list[node.getAttribute("data-testid")]){ return true; } } node = node.parentNode; } return false; })()){ response({url:element.src}); return true; } } } return false; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「展開アシスト(reddit 用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_AssistReddit" , [ function(info,response){ var element = info.element; var result = (function(){ // アンカー if(element.tagName == "A"){ return true; } return false; })(); if(result){ var node = element; while(node){ if(node.nodeType == 1){ if(node.className.match(new RegExp("(^| )usertext( |$)"))){ response({url:element.href}); return true; } } node = node.parentNode; } } return false; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「展開アシスト(deviantART 用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_AssistDeviantArt" , [ function(info,response){ var element = info.element; var result = (function(){ // イメージ要素 if(element.tagName == "IMG"){ return true; } // 縦長サムネイル if(element.className == "tt-bookendh"){ return true; } // 小サムネイル if(ElementGetClassName(element).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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「展開アシスト(ピクシブ用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_AssistPixiv" , [ 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; }, function(info,response){ var element = info.element; var result = (function(){ // DIV 要素 if(element.tagName != "DIV"){ return false; } if(!ElementGetClassName(element).match(new RegExp("(^| )_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; }, function(info,response){ var element = info.element; var result = (function(){ if(ElementGetClassName(element).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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「展開アシスト(ニコニコ静画用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_AssistNicoSeiga" , [ 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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // エレメント置換定義「デフォルト」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToElement_Default" , [ function(info,response){ // -------------------------------------------------------------------------------- // 第01引数 Object 型 // element:HTMLElement オブジェクト // -------------------------------------------------------------------------------- var element = info.element; // -------------------------------------------------------------------------------- // 第02引数 function // 引数:Object 型 // url:String 型(省略可、展開先のアドレスを指定) // 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。 // -------------------------------------------------------------------------------- response({}); // -------------------------------------------------------------------------------- // 戻り値 Boolean 型 // true :関数の実行を完了 // false:次の関数を実行 // -------------------------------------------------------------------------------- return true; } ]); // -------------------------------------------------------------------------------- // テキスト置換定義「英数字記号を半角、カタカナを全角に変更」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToText_AlphanumericHalf" , [ 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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // テキスト置換定義「空白とタブを可視化」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToText_VisualizeSpaceAndTab" , [ 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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // テキスト置換定義「デフォルト」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToText_Default" , [ function(info,response){ // -------------------------------------------------------------------------------- // 第01引数 Object 型 // text_node:Text オブジェクト (DOM) // -------------------------------------------------------------------------------- var text_node = info.text_node; // -------------------------------------------------------------------------------- // 第02引数 function // 引数:なし // 処理が完了したタイミングで必ず1度実行する必要がある。非同期実行可能。 // -------------------------------------------------------------------------------- response(); // -------------------------------------------------------------------------------- // 戻り値 Boolean 型 // true :関数の実行を完了 // false:次の関数を実行 // -------------------------------------------------------------------------------- return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「自動ダウンロード(すべて)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_AutoDownloadAll" , [ function(info,response){ var anchor_element = info.anchor_element; var url = anchor_element.href; var result = (function(){ // 通常のURL var url_parser = URL_Parser(url); if(url_parser.protocol.match(/^(http|https|ftp):/i)){ return true; } // DataURL var data_parser = DataURL_Parser(url); if(data_parser){ return true; } return false; })(); if(result){ // Downloader オブジェクトを作成 var downloader = new Downloader(); // ダウンロード設定 downloader.setURL(url); //downloader.setFileName(url); downloader.setSaveAs(false); downloader.setSilent(true); downloader.setAllowSameRequest(false); // ダウンロード開始 downloader.start(); } return false; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「自動ダウンロード(画像のみ)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_AutoDownloadImage" , [ function(info,response){ var anchor_element = info.anchor_element; var url = anchor_element.href; var result = (function(){ // 画像の拡張子 var url_parser = URL_Parser(url); if(url_parser.ext.match(/^(bmp|gif|jpg|jpe|jpeg|png|webp|avif)$/i)){ return true; } // 画像の DataURL var data_parser = DataURL_Parser(url); if(data_parser){ if(data_parser.mimetype.match(/^image[/]/i)){ return true; } } return false; })(); if(result){ // Downloader オブジェクトを作成 var downloader = new Downloader(); // ダウンロード設定 downloader.setURL(url); //downloader.setFileName(url); downloader.setSaveAs(false); downloader.setSilent(true); downloader.setAllowSameRequest(false); // ダウンロード開始 downloader.start(); } return false; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「ポップアップを無効化(イメージ検索用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_DisablePopupImageSearch" , [ function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「イベントを無効化(フェイスブック用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_DisableEventFacebook" , [ function(info,response){ var anchor_element = info.anchor_element; var parent = anchor_element.parentNode; if(parent){ var m = ElementGetClassName(parent).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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「直リンクに変更(ツイッター用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_DirectLinkTwitter" , [ 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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「直リンクに変更(フェイスブック用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_DirectLinkFacebook" , [ 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; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「直リンクに変更(リアルタイム検索用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_DirectLinkRealtimeSearch" , [ function(info,response){ var anchor_element = info.anchor_element; // Yahoo! JAPAN リアルタイム検索 var url = decodeURIComponent(anchor_element.href); var m = url.match(new RegExp("^(http|https)://ord\\.yahoo\\.co\\.jp/o/realtime/.*RU=([0-9a-zA-Z._]+)")); if(m){ var base64 = m[2]; base64 = base64.replace(/[.]/g,"+"); base64 = base64.replace(/[_]/g,"/"); base64 = base64.replace(/[-]/g,"="); var ary = Base64_To_ArrayBuffer(base64); if(ary){ anchor_element.href = String_From_ArrayBuffer_As_UTF8(ary); } } return false; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「直リンクに変更(検索用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_DirectLinkSearch" , [ function(info,response){ var anchor_element = info.anchor_element; if((function(){ var code = anchor_element.getAttribute("onmousedown") || (function(){ if(!anchor_element.onmousedown) return ""; return anchor_element.onmousedown.toString(); })() || ""; // Google 検索 if(code.match(/return rwt\(this,/)) return true; // Yahoo! JAPAN if(code.match(/return lswap\(this/)) return true; return false; })()){ anchor_element.onmousedown = null; var parent = anchor_element.parentNode; if(parent.addEventListener){ parent.addEventListener("mousedown",function(e){ e.stopPropagation(); },true); } } return false; }, 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 = decodeURIComponent(query.url); } } return false; }, function(info,response){ var anchor_element = info.anchor_element; // Yahoo! JAPAN 検索 var url = anchor_element.href; var r = new RegExp("^(http|https)://search[.]yahoo[.]co[.]jp/r/.*_ylt=.*[/][*][*](.*)$","i"); if(url.match(r)){ anchor_element.href = decodeURIComponent(RegExp.$2); } return false; }, function(info,response){ response({}); return true; } ]); // -------------------------------------------------------------------------------- // アンカー置換定義「直リンクに変更(スレッド掲示板用)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToAnchor_DirectLinkBbs" , [ function(info,response){ var anchor_element = info.anchor_element; var r; // リンク先を取得 var url = anchor_element.href; var list = [ // 2ちゃんねる {search:"^(http|https)://ime\\.nu/",replace:""}, {search:"^(http|https)://jump\\.(2ch|5ch)\\.net/[?]",replace:""}, {search:"^(http|https)://2ch\\.io/",replace:""}, // まちBBS {search:"^(http|https)://machi\\.to/bbs/link\\.cgi[?]URL=",replace:""}, // PINKちゃんねる {search:"^(http|https)://(www\\.|)pinktower\\.com/([?]|)",replace:""}, // したらば掲示板 {search:"^(http|https)://jbbs\\.shitaraba\\.net/bbs/link\\.cgi[?]url=",replace:"",decode_uri:true}, // ログ速 {search:"^(http|https)://l\\.moapi\\.net/",replace:""} ]; var i; var num = list.length; var re_protocol = new RegExp("^(http|https|ftp)://"); for(i=0;i]+?(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; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「直リンク(汎用)」「OGP "twitter:*"」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkGeneric_OgpTwitter" , [ function(info,response){ var anchor_element = info.anchor_element; // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ // twitter:card if(str.match(new RegExp("]+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("]+?(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; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「直リンク(汎用)」「Imgur」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkGeneric_Imgur" , [ function(info,response){ var anchor_element = info.anchor_element; // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ var content_url = ""; var content_type = new Array(); if(!content_url){ var m = str.match(new RegExp("]+?(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; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「直リンク(汎用)」「ニコニコ静画 イラスト」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkGeneric_NicoSeigaIllust" , [ 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("]+?(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|https)://lohas\\.nicoseiga\\.jp/)o(/[a-z0-9]+/[0-9]+/[0-9]+)","i")); if(m){ // 高解像度画像 var image_url = m[1] + "priv" + m[3]; } 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; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「直リンク(汎用)」「ニコニコ静画 イラスト (直リンク)」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkGeneric_NicoSeigaIllustDirectLink" , [ 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|https)://lohas\\.nicoseiga\\.jp/)o(/[a-z0-9]+/[0-9]+/[0-9]+)","i")); if(m){ // 高解像度画像 image_url = m[1] + "priv" + m[3]; } 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; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「直リンク(汎用)」「ニコニコ静画 漫画」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkGeneric_NicoSeigaManga" , [ 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|https)://lohas.nicoseiga.jp/thumb/[^"]*)"',"i")); if(m) image_url = m[1]; } // 未ログイン if(!image_url){ var m = str.match(new RegExp("]+?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; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「直リンク(汎用)」「pixiv.net」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkGeneric_PixivNet" , [ 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("]+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; // 2014/11/27 以降 if(!image_url){ var m = str.match(new RegExp("]+class=\"original-image\"[^>]*>","i")); if(m){ m = m[0].match(new RegExp('src="([^"]+)"',"i")); if(m){ image_url = m[1]; } } } // 高解像度画像 if(!image_url){ var m = str.match(new RegExp("
.*","i")); if(m){ m = m[0].match(new RegExp(']+href="([^"]+)".*',"i")); if(m){ var link_url = m[1]; m = m[0].match(new RegExp(']+?(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; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「イメージ検索用」「Google 画像検索」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkImageSearch_Google" , [ function(info,response){ var anchor_element = info.anchor_element; var query = StringGetQuery(anchor_element.href); if(query.imgurl){ try{ var image_url = decodeURIComponent(decodeURIComponent(query.imgurl)); response({result:true,url:image_url,content_type:["image"]}); return true; }catch(e){} } return false; }, function(info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「イメージ検索用」「Yahoo Image Search」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkImageSearch_YahooImageSearch" , [ 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; }, function(info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「イメージ検索用」「Bing 画像検索」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkImageSearch_Bing" , [ 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 image_url = (function(){ try{ // m 属性を取得 var m = anchor_element.getAttribute("m") || ""; var obj = JsonParse(m); if(obj["murl"]) return obj["murl"]; }catch(e){} return null; })(); if(image_url){ response({result:true,url:image_url,content_type:["image"]}); return true; } } return false; }, 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("]+?property="og:image"[^>]+?content="([^">]+)"[^>]*>[^">]/i); if(m){ var url = m[1]; m = url.match(/([/][/]upload[.]wikimedia[.]org[/]wikipedia[/][^/]+[/])thumb[/]([^/]+[/][^/]+[/].*?)[/]/i); if(m) url = "https:" + m[1] + m[2]; response({result:true,url:url,content_type:["image"]}); } response({result:false}); }; loader.onerror = function(){ response({result:false}); }; loader.setMethod("GET"); loader.setURL(anchor_element.href); loader.loadText(); } return true; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「HTML 内の画像を検索」「最大バイトの画像」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_DirectLinkFindImageInHTML_ImageOfTheLargestByte" , [ 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("]+href[ \n\r\t]*=[ \n\r\t]*\"([^\"]+?)\"","i")); if(m) base = m[0]; // 画像要素 str.replace(new RegExp("]+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("]+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 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; }, function(info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク置換定義「デフォルト」 // -------------------------------------------------------------------------------- attachItem( "ReplacementToLink_Default" , [ 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; } ]); // -------------------------------------------------------------------------------- // ハイパーリンク化定義「簡易」 // -------------------------------------------------------------------------------- attachItem( "MakeLinkToText_Simple" , [ 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 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){ 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 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){ 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 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 = width_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 = width_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; } ]); // -------------------------------------------------------------------------------- // イメージ展開定義「ポップアップ表示(すべてのリンク)」 // -------------------------------------------------------------------------------- attachItem( "ExpandImage_ThumbnailScriptAllow_PopupAll" , [ function(info,response){ // サムネイル表示しない response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // イメージ展開定義「ポップアップ表示(すべてのリンク)」 // -------------------------------------------------------------------------------- attachItem( "ExpandImage_PopupScriptAllow_PopupAll" , [ function(info,response){ var current_element = info.current_element; var url = info.url; var result = (function(){ // 画像の拡張子 var url_parser = URL_Parser(url); if(url_parser.ext.match(/^(bmp|gif|jpg|jpe|jpeg|png|webp|avif)$/i)){ return true; } // 画像の DataURL var data_parser = DataURL_Parser(url); if(data_parser){ if(data_parser.mimetype.match(/^image[/]/i)){ return true; } } return false; })(); if(result){ response({result:true}); return true; } return false; }, 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; }, function(info,response){ // ポップアップ表示しない response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // イメージ展開定義「ポップアップ表示(画像を含むリンク)」 // -------------------------------------------------------------------------------- attachItem( "ExpandImage_ThumbnailScriptAllow_PopupIncludeImage" , [ function(info,response){ // サムネイル表示しない response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // イメージ展開定義「ポップアップ表示(画像を含むリンク)」 // -------------------------------------------------------------------------------- attachItem( "ExpandImage_PopupScriptAllow_PopupIncludeImage" , [ 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 0){ response({result:false}); return true; } // 子が無い var nodes = anchor_element.childNodes; if(nodes.length == 0){ response({result:false}); return true; } return false; }, function(info,response){ var anchor_element = info.anchor_element; var url = info.url; var result = (function(){ // 画像の拡張子 var url_parser = URL_Parser(url); if(url_parser.ext.match(/^(bmp|gif|jpg|jpe|jpeg|png|webp|avif)$/i)){ return true; } // 画像の DataURL var data_parser = DataURL_Parser(url); if(data_parser){ if(data_parser.mimetype.match(/^image[/]/i)){ return true; } } return false; })(); if(result){ response({result:true}); return true; } return false; }, 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; }, function(info,response){ // サムネイル表示しない response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // イメージ展開定義「画像掲示板用」 // -------------------------------------------------------------------------------- attachItem( "ExpandImage_PopupScriptAllow_ImageBbs" , [ 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; }, function(info,response){ var anchor_element = info.anchor_element; var url = info.url; var result = (function(){ // 画像の拡張子 var url_parser = URL_Parser(url); if(url_parser.ext.match(/^(bmp|gif|jpg|jpe|jpeg|png|webp|avif)$/i)){ return true; } // 画像の DataURL var data_parser = DataURL_Parser(url); if(data_parser){ if(data_parser.mimetype.match(/^image[/]/i)){ return true; } } return false; })(); if(result){ response({result:true}); return true; } return false; }, 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; }, function(info,response){ // ポップアップ表示しない response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // イメージ展開定義「ツイッター用」 // -------------------------------------------------------------------------------- attachItem( "ExpandImage_ThumbnailScriptAllow_Twitter" , [ 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 = ElementGetClassName(node).match(new RegExp("(^| )tweet-text( |$)","i")); if(!m) return false; if(current_element.getAttribute("data-pre-embedded") === "true"){ return false; } var anchor_count = 0; var nodes = ElementGetElementsByTagName(node,"a"); var i; var num = nodes.length; for(i=0;i 1) return true; } } node = node.nextSibling; while(node){ if(node.nodeType == 1){ var m = ElementGetClassName(node).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; }, 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; }, 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 parent_width) width_max = parent_width; // エレメントのサイズ width -= style_w; height -= style_h; // サイズ情報があれば使用 if(video.videoWidth) width = video.videoWidth; if(video.videoHeight) height = video.videoHeight; // 最大幅補正 var w = width_max - style_w; if(w < width){ height *= w / width; width = w; } // 最大高補正 var h = height_max - style_h; if(h < height){ width *= h / height; height = h; } // サイズをセット 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; } ]); // -------------------------------------------------------------------------------- // ビデオ展開定義「インライン表示」 // -------------------------------------------------------------------------------- attachItem( "ExpandVideo_VideoElementScriptAllow_Inline" , [ function(info,response){ var anchor_element = info.anchor_element; var url = info.url; var result = (function(){ // ビデオの拡張子 var url_parser = URL_Parser(url); if(url_parser.ext.match(/^(mp4|webm|avi|m4v|ogv|mpg|mpeg)$/i)){ return true; } // ビデオの DataURL var data_parser = DataURL_Parser(url); if(data_parser){ if(data_parser.mimetype.match(/^video[/]/i)){ return true; } } return false; })(); if(result){ response({result:true}); return true; } return false; }, function(info,response){ // インライン表示しない response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // ビデオ展開定義「インライン表示(アシスト要素のみ)」 // -------------------------------------------------------------------------------- attachItem( "ExpandVideo_InlineScriptAllow_InlineFromAssist" , [ function(info,response){ var current_element = info.current_element; if(!info.is_overridden_url){ response({result:false}); return true; } return false; }, 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; }, function(info,response){ // インライン表示する response({result:true}); return true; } ]); // -------------------------------------------------------------------------------- // ビデオ展開定義「デフォルト」 // -------------------------------------------------------------------------------- attachItem( "ExpandVideo_InlineScriptAllow_Default" , [ function(info,response){ // -------------------------------------------------------------------------------- // 第01引数 Object 型 // current_element:HTMLElement オブジェクト // url:String 型(展開先のアドレス) // content_type:Array 型(コンテンツタイプ) // is_overridden_url:Boolean 型(URL がオーバーライドされているか) // -------------------------------------------------------------------------------- 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; } ]); // -------------------------------------------------------------------------------- // ビデオ展開定義「デフォルト」 // -------------------------------------------------------------------------------- attachItem( "ExpandVideo_InlineScriptInsert_Default" , [ 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; } ]); // -------------------------------------------------------------------------------- // ビデオ展開定義「デフォルト」 // -------------------------------------------------------------------------------- attachItem( "ExpandVideo_VideoElementScriptAllow_Default" , [ 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; } ]); // -------------------------------------------------------------------------------- // インラインフレーム展開定義「PDF のインライン表示」 // -------------------------------------------------------------------------------- attachItem( "ExpandIframe_InlineScriptAllow_ExpandPdfInline" , [ 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; }, function(info,response){ var anchor_element = info.anchor_element; var url = info.url; var result = (function(){ // PDFの拡張子 var url_parser = URL_Parser(url); if(url_parser.ext.match(/^(pdf)$/i)){ return true; } // PDFの DataURL var data_parser = DataURL_Parser(url); if(data_parser){ if(data_parser.mimetype.match(/^application[/]pdf/i)){ return true; } } return false; })(); if(result){ response({result:true}); return true; } return false; }, function(info,response){ // インライン表示しない response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // インラインフレーム展開定義「PDF のインライン表示」 // -------------------------------------------------------------------------------- attachItem( "ExpandIframe_InlineScriptInsert_ExpandPdfInline" , [ 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; } ]); // -------------------------------------------------------------------------------- // インラインフレーム展開定義「デフォルト」 // -------------------------------------------------------------------------------- attachItem( "ExpandIframe_InlineScriptAllow_Default" , [ 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; } ]); // -------------------------------------------------------------------------------- // インラインフレーム展開定義「デフォルト」 // -------------------------------------------------------------------------------- attachItem( "ExpandIframe_InlineScriptInsert_Default" , [ 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; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「初期化」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptInitialize" , [ function(info,response){ var work = info.work; response({result:true}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「ニコニコ大百科」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptInitialize_NicovideoDictionary" , [ function(info,response){ var work = info.work; // -------------------------------------------------------------------------------- // 基本URL抽出 // -------------------------------------------------------------------------------- var url = document.URL; var bbs_list = [ {url:"(https://dic\\.nicovideo\\.jp/b/(a|c|i|l|u|v)/[^/#?]+)",replace:"$1/",name:"nicopedia"}, {url:"(https://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>|<<|>>|<<|>|>|》|≫|>>)([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 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(callback){ var add_count = 0; var load = function (){ // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ var re_number = new RegExp("([0-9]+)","i"); var p = 0; var n = str.length; function f(){ try{ if(p >= n) throw 0; p = str.indexOf("
",p); if(p < 0) throw 0; var e = str.indexOf("",p); if(e >= 0) e += 5; var p2 = str.indexOf("
",e); if(p2 >= 0){ var e2 = str.indexOf("
",p2); if(e2 >= 0) e = e2 + 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= 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){ load(); }else{ callback({result:true,add_count:add_count}); } } load_more_id = last_id; execute_queue.attachFirst(f,null); }; // 失敗 loader.onerror = function(){ callback({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(resource_url_more); loader.loadText(); }; load(); } // -------------------------------------------------------------------------------- // レスポンス親要素 // -------------------------------------------------------------------------------- (function(){ var element_bbs = ElementGetElementsByClassName(document.body,"st-bbs-contents")[0]; if(element_bbs){ var i; var nodes = ElementGetElementsByTagName(element_bbs,"dl"); if(nodes.length){ element_parent = nodes[nodes.length - 1]; } } })(); if(!element_parent) return false; // -------------------------------------------------------------------------------- // 最後尾 ID // -------------------------------------------------------------------------------- var nodes = ElementGetElementsByTagName(element_parent,"dt"); var i; var node_num = nodes.length; var re = new RegExp("([0-9]+)","i"); for(i=0;i=0;i--){ var node = nodes[i]; var m = ElementGetTextContent(node).match(re); 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("([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("
",p); if(p < 0) throw 0; var e = str.indexOf("",p); if(e >= 0) e += 5; var p2 = str.indexOf("
",e); if(p2 >= 0){ var e2 = str.indexOf("
",p2); if(e2 >= 0) e = e2 + 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]; var dd_reaction = nodes[5]; 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= 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; }, function (info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「ニコニコ大百科」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptCallback_NicovideoDictionary" , [ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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= 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 0px 0px 8px"); }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 1){ DomNodeSetNodeValue(textnode_name,"(" + count + ")"); }else{ DomNodeSetNodeValue(textnode_name,""); } var style = element_name.style; if(count >= 5){ StyleDeclarationSetProperty(style,"color","#e80000"); }else if(count >= 2){ StyleDeclarationRemoveProperty(style,"color"); }else{ StyleDeclarationSetProperty(style,"color","#707070"); } }; control_name.update(); element_name.appendChild(textnode_name); // -------------------------------------------------------------------------------- // ポップアップ化 // -------------------------------------------------------------------------------- if(type == "name"){ if(myself) 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(myself){ if(num < 2) return false; }else{ 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("div"); container.className = "entry noncollapsed comment"; container.style.marginBottom = "20px"; _window.appendChild(container); var param = new Object(); param.parent = node.parent; for(j=0;j= 3){ StyleDeclarationSetProperty(style,"color","#e80000"); }else{ StyleDeclarationRemoveProperty(style,"color"); } }; control_follower.update(); insert.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 container = DocumentCreateElement("div"); container.className = "entry noncollapsed comment"; container.style.marginBottom = "20px"; _window.appendChild(container); var param = new Object(); param.parent = node.parent; for(j=0;j=1;i--){ var node = original[i].element; var revise_scroll = new DocumentReviseScroll(); revise_scroll.executeRemoveElementBefore(node); node.style.display = "none"; revise_scroll.executeRemoveElementAfter(node); } }; response.setAnalyzed(); } // レスポンスダイアログを登録(ルート) attachBbsResponseDialog( response, { post_info:post_info, post_body:post_body, post_buttons:post_buttons, parent:ElementGetElementsByClassName(document,"commentarea")[0] }, null, null ); return true; })(); response({useful:useful}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「8chan.co」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptCallback_8chan" , [ 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 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-left","2px"); StyleDeclarationSetProperty(style,"margin-right","5px"); }else{ StyleDeclarationRemoveProperty(style,"margin-left"); StyleDeclarationRemoveProperty(style,"margin-right"); } }; control_id.update(); // -------------------------------------------------------------------------------- // ポップアップ化 // -------------------------------------------------------------------------------- if(type == "id"){ if(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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= 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>|<<|>>|<<|>|>)([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>|<<|>>|<<|>|>|》|≫|>>)([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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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= 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>|<<|>>|<<|>|>)([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>]*)([  ]*)(.+?)([  ]*)$")); 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 ary; if(!m[4]) return ary; 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.analyzeNodeList = function(node_list){ var re_number = new RegExp("No\\.([0-9]+)","i"); var re_image = new RegExp(".*/([0-9]+)(|s)\\.(bmp|gif|jpeg|jpe|jpg|png|webp|webm|mp4)","i"); var node_num = node_list.length; var info_text = ""; var i; for(i=0;i=0;i--){ var node = node_list[i]; if(node.tagName == "BLOCKQUOTE"){ blockquote = node; break; } } // 画像 ID var node = DomNodeGetPreviousElementSibling(blockquote); while(node){ var img = ElementGetElementsByTagName(node,"IMG")[0]; if(img){ if(img.src.match(re_image)){ response.setImageId(RegExp.$1); break; } } node = DomNodeGetPreviousElementSibling(node); } // 本文 var nodes; switch(work.bbs_name){ default: nodes = blockquote.childNodes; break; } var node_num = nodes.length; var i; var s = ""; for(i=0;i=0;i--){ var node = ElementGetElementsByClassName(nodes[i],"rtd")[0]; if(node){ if(ElementGetTextContent(node).match(re_number)){ return parseInt(RegExp.$1); } } } }catch(e){} return -1; } // -------------------------------------------------------------------------------- // 継ぎ足し読み込み // -------------------------------------------------------------------------------- function readMore(callback){ var element_result = document.getElementById("contdisp"); // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ var re_number = new RegExp("No\\.([0-9]+)","i"); var re_result = new RegExp("(.*?)<\\\\/span>","i"); var element_last = null; var p = 0; var n = str.length; var add_count = 0; function f(){ try{ if(p >= n) throw 0; p = str.indexOf("",p); if(p < 0) throw 0; var e = str.indexOf("",p); if(e >= 0){ e = str.indexOf("",e + 5); if(e >= 0){ e = str.indexOf("
",e + 5); if(e >= 0) e += 8; } } var s = str.substring(p,e); var m = s.match(re_number); if(m){ var lastest_id = getLastestNumber(); if(last_id < lastest_id){ last_id = lastest_id; } 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=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; // -------------------------------------------------------------------------------- // BbsControlDockingForm 作成 // -------------------------------------------------------------------------------- (function(){ var node = document.getElementById("ftbl"); if(node){ var nodes = node.getElementsByTagName("tbody"); var num = nodes.length; if(num){ var docking_form = new BbsControlDockingForm(nodes[0],false); docking_form.setStyle("background:#e8e8ec; background-image:linear-gradient(to bottom, #f8f8fc, #e8e8ec); padding:20px; border:1px solid #888; border-radius:4px; box-shadow:2px 2px 5px #aaa; margin:0px; display:block; visibility:visible"); work.docking_form = docking_form; } } })(); // -------------------------------------------------------------------------------- // BbsControlReadMoreButton 作成 // -------------------------------------------------------------------------------- read_more_button = new BbsControlReadMoreButton(); read_more_button.setWaitTime(2 * 1000); read_more_button.onclick = readMore; var node = document.getElementById("contres"); if(node){ DomNode_InsertAfter(node,read_more_button.getElement()); } // -------------------------------------------------------------------------------- // 書き込みをポップアップ化 // -------------------------------------------------------------------------------- (function(){ var element_form; var input_submit; var element_textarea; var event_handler_release; (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=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(); var style = element_quote.style; style.fontSize = "small"; style.textDecoration = "underline"; style.marginLeft = "10px"; //var textnode_quote = DocumentCreateText(" >>" + numbers_new.join(",")); var textnode_quote = DocumentCreateText(" >>" + numbers_new.length); 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"); _window.appendChild(table); var tr = table.insertRow(-1); var td = tr.insertCell(-1); table.style.margin = "0px 0px 10px"; var param = new Object(); param.parent = node.parent; for(j=0;j 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(myself) 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(myself){ if(num < 2) return false; }else{ 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"); _window.appendChild(table); var tr = table.insertRow(-1); var td = tr.insertCell(-1); table.style.margin = "0px 0px 10px"; var param = new Object(); param.parent = node.parent; for(j=0;j 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(myself) 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(myself){ if(num < 2) return false; }else{ 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"); _window.appendChild(table); var tr = table.insertRow(-1); var td = tr.insertCell(-1); table.style.margin = "0px 0px 10px"; var param = new Object(); param.parent = node.parent; for(j=0;j 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(myself) 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(myself){ if(num < 2) return false; }else{ 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"); _window.appendChild(table); var tr = table.insertRow(-1); var td = tr.insertCell(-1); table.style.margin = "0px 0px 10px"; var param = new Object(); param.parent = node.parent; for(j=0;j 1){ DomNodeSetNodeValue(textnode_host,"(" + count + ")"); StyleDeclarationSetProperty(style,"margin-left","4px"); StyleDeclarationSetProperty(style,"margin-right","4px"); }else{ DomNodeSetNodeValue(textnode_host,""); StyleDeclarationRemoveProperty(style,"margin-left"); StyleDeclarationRemoveProperty(style,"margin-right"); } 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(myself) 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(myself){ if(num < 2) return false; }else{ 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"); _window.appendChild(table); var tr = table.insertRow(-1); var td = tr.insertCell(-1); table.style.margin = "0px 0px 10px"; var param = new Object(); param.parent = node.parent; for(j=0;j= 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(); DomNode_InsertAfter(target,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"); _window.appendChild(table); var tr = table.insertRow(-1); var td = tr.insertCell(-1); table.style.margin = "0px 0px 10px"; var param = new Object(); param.parent = node.parent; for(j=0;j"]; var f = function (node){ switch(node.nodeType){ case 1: if(BbsControlQuoteEqual(node)) return; if(node.tagName === "BR"){ ary.push("\n"); ary.push(">"); }else{ var i; var nodes = node.childNodes; var num = nodes.length; for(i=0;i") ary.pop(); ary.push("\n"); return ary.join(""); })(); }else if(selection_end >= num){ insert_str = ">No." + (response.getNumber()) + "\n"; }else{ insert_str = ">No." + (response.getNumber()); } textarea.value = text.slice(0,selection_end) + insert_str + text.slice(selection_end); textarea.selectionEnd = selection_end + insert_str.length; textarea.focus(); }; })(); } (function(){ var i; var num; var list; list = node.post_info; num = list.length; for(i=0;i>|<<|>>|<<|>|>|》|≫|>>)([0-90-9]+)","i"); var re_image = new RegExp("([0-90-9]+)\\.(bmp|gif|jpeg|jpe|jpg|png|webp|webm|mp4)","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>|<<|>)[-,0-90-9]+$","i"); var re_image = new RegExp("([0-90-9]+)\\.(bmp|gif|jpeg|jpe|jpg|png|webp|webm|mp4)","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 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; }); } function cleanupNodes(list){ var i; var num = list.length; for(i=0;i([-.:*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=0;i--){ var node = original[i].element; DomNodeRemove(node); } } }; response.setAnalyzed(); } // レスポンスダイアログを登録(ルート) attachBbsResponseDialog( response, { post_info:post_info_list, post_file_info:post_file_info_list, post_file:post_file_list, post_message:post_message_list, parent:document.body }, null, null ); return true; })(); response({useful:useful}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「おーぷん2ちゃんねる」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptInitialize_Open2ch" , [ 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>|<<|>>|<<|>|>|》|≫|>>)([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 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 checkValidityFromHTML(str){ return true; } // -------------------------------------------------------------------------------- // 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("",p); var s = str.substring(p,e) + "\n" + "
"; 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 last_id){ dictionary_id[i] = true; i --; } last_id = last_number; var p = 0; var n = str.length; var add_count = 0; function f(){ try{ if(p >= n) throw 0; p = str.indexOf("",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 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_pos = 0; load_more_pos = 0; load_shadow_list = [ { url:base_url, parse:loadShadowFromHTML, validity:checkValidityFromHTML } ]; load_more_list = [ { url:base_url + last_id + "-", parse:loadMoreFromHTML, validity:checkValidityFromHTML } ]; // -------------------------------------------------------------------------------- // BbsControlDockingForm 作成 // -------------------------------------------------------------------------------- (function(){ var node; // フォーム var nodes = ElementGetElementsByTagName(document.body,"form"); var i; for(i=0;i= 0){ node = nodes[i]; break; } } if(node){ var docking_form = new BbsControlDockingForm(node,false); docking_form.setStyle("background:#e8e8e8; background-image:linear-gradient(to bottom, #f8f8f8, #e8e8e8); padding:20px; border:1px solid #888; border-radius:4px; box-shadow:2px 2px 5px #aaa; margin:0px;"); } })(); // -------------------------------------------------------------------------------- // 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 num = load_shadow_list.length; var pos = load_shadow_pos; var i = 0; var success = function(){ }; var failure = function(){ i += 1; if(num <= i) return; pos += 1; if(num <= pos) pos = 0; load_shadow_pos = pos; load(); }; var load = function (){ var param = load_shadow_list[pos]; // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ if(!param.validity(str)){ failure(); return; } param.parse(str); success(); }; // 失敗 loader.onerror = function(){ failure(); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(param.url); loader.loadText(); }; load(); })(); response({result:true}); return true; }, function (info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「おーぷん2ちゃんねる」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptCallback_Open2ch" , [ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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= 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>|<<|>>|<<|>|>|》|≫|>>)([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 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(callback){ // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ var re_number = new RegExp("","i"); var p = 0; var n = str.length; var add_count = 0; function f(){ try{ if(p >= n) throw 0; p = str.indexOf("
",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=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("","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("
",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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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= 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>|<<|>>|<<|>|>|》|≫|>>)([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 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(callback){ // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ var re_number = new RegExp("
","i"); var p = 0; var n = str.length; var add_count = 0; function f(){ try{ if(p >= n) throw 0; p = str.indexOf("
",p); if(e >= 0){ e = str.indexOf("
",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",p); if(p >= 0){ p += 19; execute_queue.attachFirst(f,null); } }; // 失敗 loader.onerror = function(){ callback({result:false}); }; // テキストの読み込み 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=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("
","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("
",p); if(e >= 0){ e = str.indexOf("
",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",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; }, function (info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「ログ速」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptCallback_Logsoku" , [ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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= 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= 7){ return "2ch_v6"; } return "2ch_v5"; })(); } // -------------------------------------------------------------------------------- // 文字列からレスポンス番号を取得 // -------------------------------------------------------------------------------- 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 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 checkValidityFromHTML(str){ var re; switch(work.bbs_name){ case "2ch_v5": var m = str.match(new RegExp("
.*?
[ ].*?[ ]

","i")); if(m){ m = m[0].match(new RegExp("[\r\n]")); if(!m) return true; } break; case "2ch_v6": re = new RegExp(']+class="(| )thread( |)"[^>]*>.*?]+class="(| )post( |)"[^>]*>.*?]+class="(| )message( |)"[^>]*>',"i"); return Boolean(str.match(re)); case "pink": re = new RegExp(']+class="(| )post( |)"[^>]*>.*?]+class="(| )thread_in( |)"[^>]*>',"i"); return Boolean(str.match(re)); } return false; } // -------------------------------------------------------------------------------- // HTML 文書をシャドウ読み込み // -------------------------------------------------------------------------------- function loadShadowFromHTML(str){ var re_number = new RegExp('id="([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 search_post_start; var search_post_end; var class_name_message; switch(work.bbs_name){ case "2ch_v5": re_number = new RegExp('([0-9]+)',"i"); search_post_start = '
'; search_post_end = "

"; break; case "2ch_v6": search_post_start = '
= n) return; p = str.indexOf(search_post_start,p); if(p < 0) return; var e = str.indexOf(search_post_end,p); if(e >= 0) e += search_post_end.length; 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 clone_nodes = StringHtmlCreateDomNodesSafe(s); var info_post; var info_number; var info_name; var info_date; var info_uid; var info_message; try{ switch(work.bbs_name){ case "2ch_v5": info_number = info_name = info_date = info_uid = clone_nodes[0]; if(info_number.tagName != "DT") return; info_message = clone_nodes[1]; if(info_message.tagName != "DD") return; break; case "2ch_v6": case "pink": info_post = clone_nodes[0]; if(info_post.className != "post") return; info_number = ElementGetElementsByClassName(info_post,"number")[0]; info_name = ElementGetElementsByClassName(info_post,"name")[0]; info_date = ElementGetElementsByClassName(info_post,"date")[0]; info_uid = ElementGetElementsByClassName(info_post,"uid")[0] || info_date; info_message = ElementGetElementsByClassName(info_post,class_name_message)[0]; break; } }catch(e){ return; } // ナンバーからレスポンスオブジェクトを取得 var response = bbs_dictionary.getResponse(id); if(!(response.getAnalyzed())){ // レスアンカー拡張 work.extendResponseAnchor(info_message); // IDの取得 if(ElementGetTextContent(info_uid).match(re_id)){ response.setId(RegExp.$1); } // 名前の取得 if(ElementGetTextContent(info_name).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:info_date}; 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= n) throw 0; p = str.indexOf(search_post_start,p); if(p < 0) throw 0; var e = str.indexOf(search_post_end,p); if(e >= 0) e += search_post_end.length; 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(); // 暫定 (2ch_v7) if(str.substr(e,4) == "
"){ s += "
"; } var nodes = StringHtmlCreateDomNodesSafe(s); var j; var node_num = nodes.length; for(j=0;j=0;i--){ var nodes = get_elements(element_parents[i]); var node_num = nodes.length; if(node_num){ var re_id = new RegExp("^[ \t\r\n]*([0-9]+)","i"); if(ElementGetTextContent(nodes[node_num-1]).match(re_id)){ callback(parseInt(RegExp.$1)); return; } } } } (function(){ var get_elements; switch(work.bbs_name){ case "2ch_v5": get_elements = function(target){ return ElementGetElementsByTagName(target,"dt"); }; break; case "2ch_v6": case "pink": get_elements = function(target){ return ElementGetElementsByClassName(target,"post"); }; break; } var count = 0; var re_id = new RegExp("^[ \t\r\n]*([0-9]+)","i"); var num = element_parents.length; var i,j; for(i=0;i 1) return; }else if(count == 1){ first_id = parseInt(m[1]); dictionary_id[first_id] = true; if(first_id <= 2) first_id = 1; return; } count += 1; } } })(); getLastId(function(id){ last_id = id; dictionary_id[last_id] = true; }); // -------------------------------------------------------------------------------- // 読み込みリスト // -------------------------------------------------------------------------------- load_shadow_list = [ { url:base_url, parse:loadShadowFromHTML, validity:checkValidityFromHTML } ]; load_more_list = [ { url:base_url + last_id + "-", parse:loadMoreFromHTML, validity:checkValidityFromHTML } ]; // -------------------------------------------------------------------------------- // 読み込み方式 // -------------------------------------------------------------------------------- load_shadow_pos = 0; load_more_pos = 0; // -------------------------------------------------------------------------------- // 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 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_v5": case "2ch_v6": case "pink": for(i=0;i= 0){ element_form = nodes[i]; break; } } break; } // サブミットボタン if(element_form){ var nodes = ElementGetElementsByTagName(element_form,"input"); for(i=0;i 1000 * 2){ closed = true; } } }catch(e){ closed = true; } if(closed){ if(task){ task.release(); } popup_iframe.close(); setEnable(true); if(timer){ readMore(function(){}); clear(); } } }); })(); } (function(){ if(!element_form) return; if(!input_submit) return; if(!element_textarea) return; if(window.localStorage.getItem("autoPost") == "true") return; if(work.docking_form){ work.docking_form.onreset = clear; } if((function(){ try{ var re = new RegExp("^[^:]+"); var m0 = element_form.action.match(re); var m1 = document.URL.match(re); if(!m0) return true; if(!m1) return true; if(m0[0] === m1[0]) return false; }catch(e){} return true; })()) return; if(load_more_pos == 0){ addEvent(); event_handler_release = page_expand_event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ release(); }); } })(); })(); // -------------------------------------------------------------------------------- // シャドウロード // -------------------------------------------------------------------------------- (function(){ var num = load_shadow_list.length; var pos = load_shadow_pos; var i = 0; var failure = function(){ i += 1; if(num <= i) return; pos += 1; if(num <= pos) pos = 0; load_shadow_pos = pos; load(); }; var load = function (){ var param = load_shadow_list[pos]; // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ if(!param.validity(str)){ failure(); return; } param.parse(str); }; // 失敗 loader.onerror = function(){ failure(); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(param.url); switch(work.bbs_name){ case "2ch_v5": case "2ch_v6": case "pink": loader.overrideMimeType("text/plain; charset=Shift_JIS"); break; } loader.loadText(); }; load(); })(); response({result:true}); return true; }, function (info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「2ちゃんねる掲示板(v.06)」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptCallback_2ch_v6" , [ 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,"span"); var num = nodes.length; for(i=0;i 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(myself) 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(myself){ if(num < 2) return false; }else{ if(num < 1) return false; } function f(){ var dl = DocumentCreateElement("div"); dl.style.margin = "0px"; _window.appendChild(dl); var response_id = responses[i]; var clone = response_id.getCloneElements(); var j; var clone_num = clone.length; if(clone_num){ var clone_nodes = []; for(j=0;j 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(myself) 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(myself){ if(num < 2) return false; }else{ if(num < 1) return false; } function f(){ var dl = DocumentCreateElement("div"); dl.style.margin = "0px"; _window.appendChild(dl); var response_name = responses[i]; var clone = response_name.getCloneElements(); var j; var clone_num = clone.length; if(clone_num){ var clone_nodes = []; for(j=0;j 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(myself) 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(myself){ if(num < 2) return false; }else{ if(num < 1) return false; } function f(){ var dl = DocumentCreateElement("div"); dl.style.margin = "0px"; _window.appendChild(dl); var response_host = responses[i]; var clone = response_host.getCloneElements(); var j; var clone_num = clone.length; if(clone_num){ var clone_nodes = []; for(j=0;j= 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 prev = target.lastChild; while(prev){ if(prev.tagName != "BR") break; prev = prev.previousSibling; } if(prev){ DomNode_InsertAfter(prev,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 dl = DocumentCreateElement("div"); dl.style.margin = "0px"; _window.appendChild(dl); var follower = bbs_dictionary.getResponse(ary[i].getNumber()); var clone = follower.getCloneElements(); var j; var clone_num = clone.length; if(clone_num){ var clone_nodes = []; for(j=0;j= num){ insert_str = ">>" + (response.getNumber()) + "\n"; }else{ insert_str = ">>" + (response.getNumber()); } textarea.value = text.slice(0,selection_end) + insert_str + text.slice(selection_end); textarea.selectionEnd = selection_end + insert_str.length; textarea.focus(); if(e.stopImmediatePropagation){ e.stopImmediatePropagation(); } }; return null; }); } var info_number; var info_name; var info_date; var info_uid; var info_message; switch(work.bbs_name){ case "2ch_v5": info_number = info_name = info_date = info_uid = node.clone_nodes[0]; info_message = node.clone_nodes[1]; break; case "2ch_v6": case "pink": var info_post = node.clone_nodes[0]; info_number = ElementGetElementsByClassName(info_post,"number")[0]; info_name = ElementGetElementsByClassName(info_post,"name")[0]; info_date = ElementGetElementsByClassName(info_post,"date")[0]; info_uid = ElementGetElementsByClassName(info_post,"uid")[0] || info_date; info_message = ElementGetElementsByClassName(info_post,"message")[0] || ElementGetElementsByClassName(info_post,"thread_in")[0]; break; } if(info_number){ forReply(info_number); } if(info_name){ forName(info_name); } if(info_date){ forHost(info_date); } if(info_uid){ forId(info_uid); forFollower(info_uid); } if(info_message){ forResponseAnchor(info_message); forId(info_message); forName(info_message); } } // -------------------------------------------------------------------------------- // エレメントを解析 // -------------------------------------------------------------------------------- var useful = (function(){ var info_post; var info_number; var info_name; var info_date; var info_uid; var info_message; var clone_nodes = []; switch(work.bbs_name){ case "2ch_v5": try{ var dt = element; if(dt.tagName != "DT") return false; var dd = DomNodeGetNextElementSibling(dt); var dl = dt.parentNode; if(dd.tagName != "DD") return false; if(dl.tagName != "DL") return false; info_post = dl; info_number = info_name = info_date = info_uid = dt; info_message = dd; clone_nodes.push(dt); clone_nodes.push(dd); }catch(e){ return false; } break; case "2ch_v6": case "pink": try{ info_post = element; if(info_post.className != "post") return false; info_number = ElementGetElementsByClassName(info_post,"number")[0]; info_name = ElementGetElementsByClassName(info_post,"name")[0]; info_date = ElementGetElementsByClassName(info_post,"date")[0]; info_uid = ElementGetElementsByClassName(info_post,"uid")[0] || info_date; info_message = ElementGetElementsByClassName(info_post,"message")[0] || ElementGetElementsByClassName(info_post,"thread_in")[0]; clone_nodes.push(info_post); }catch(e){ return false; } break; } // document に未登録 if(!DomNodeGetAttachedDocument(info_post)) return false; // -------------------------------------------------------------------------------- // レスアンカー拡張 // -------------------------------------------------------------------------------- work.extendResponseAnchor(info_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,})","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(info_number){ cleanup(info_number); } if(info_name){ cleanup(info_name); } if(info_date){ cleanup(info_date); } if(info_uid){ cleanup(info_uid); } if(info_message){ cleanup(info_message); } })(); (function(){ switch(work.bbs_name){ case "2ch_v5": case "2ch_v6": case "pink": var node_list = ElementGetElementsByClassName(info_post,"back-links"); var i; var num = node_list.length; for(i=num-1;i>=0;i--){ DomNodeRemove(node_list[i]); } break; } })(); // ナンバーを取得 if(!(ElementGetTextContent(info_number).match(new RegExp("^([0-9]+)","i")))) return false; // ナンバーからレスポンスオブジェクトを取得 var response = bbs_dictionary.getResponse(parseInt(RegExp.$1)); // レスポンス解析 if(!response.getAnalyzed()){ // IDの取得 if(ElementGetTextContent(info_uid).match(new RegExp("ID:([-a-zA-Z0-9+/.●!=]{8,})","i"))){ response.setId(RegExp.$1); } // 名前の取得 if(ElementGetTextContent(info_name).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:info_date}; 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= 7){ return "5ch_v8"; } return ""; })(); if(!(work.bbs_name)){ return false; } } // -------------------------------------------------------------------------------- // 文字列からレスポンス番号を取得 // -------------------------------------------------------------------------------- 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 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 checkValidityFromHTML(str){ var re; switch(work.bbs_name){ case "5ch_v8": re = new RegExp(']+class="(|[^"]* )post(|[^"]* )"[^>]*>.*?]+class="(|[^"]* )post-content(|[^"]* )"[^>]*>',"i"); return Boolean(str.match(re)); } return false; } // -------------------------------------------------------------------------------- // HTML 文書をシャドウ読み込み // -------------------------------------------------------------------------------- function loadShadowFromHTML(str){ var re_number = new RegExp('id="([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 search_post_start; var search_post_end; var class_name_message; switch(work.bbs_name){ case "5ch_v8": search_post_start = '
"; class_name_message = "post-content"; break; } var p = 0; var n = str.length; function f(){ if(p >= n) return; p = str.indexOf(search_post_start,p); if(p < 0) return; var e = str.indexOf(search_post_end,p); if(e >= 0) e += search_post_end.length; 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 clone_nodes = StringHtmlCreateDomNodesSafe(s); var info_post; var info_number; var info_name; var info_date; var info_uid; var info_message; try{ switch(work.bbs_name){ case "5ch_v8": info_post = clone_nodes[0]; if(!(info_post.classList.contains("post"))) return; info_number = ElementGetElementsByClassName(info_post,"postid")[0]; info_name = ElementGetElementsByClassName(info_post,"postusername")[0]; info_date = ElementGetElementsByClassName(info_post,"date")[0]; info_uid = ElementGetElementsByClassName(info_post,"uid")[0] || info_date; info_message = ElementGetElementsByClassName(info_post,class_name_message)[0]; break; } }catch(e){ return; } // ナンバーからレスポンスオブジェクトを取得 var response = bbs_dictionary.getResponse(id); if(!(response.getAnalyzed())){ // レスアンカー拡張 work.extendResponseAnchor(info_message); // IDの取得 if(ElementGetTextContent(info_uid).match(re_id)){ response.setId(RegExp.$1); } // 名前の取得 if(ElementGetTextContent(info_name).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:info_date}; 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= n) throw 0; p = str.indexOf(search_post_start,p); if(p < 0) throw 0; var e = str.indexOf(search_post_end,p); if(e >= 0) e += search_post_end.length; 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=0;i--){ var nodes = get_elements(element_parents[i]); var node_num = nodes.length; if(node_num){ var re_id = new RegExp("^[ \t\r\n]*([0-9]+)","i"); if(ElementGetTextContent(nodes[node_num-1]).match(re_id)){ callback(parseInt(RegExp.$1)); return; } } } } (function(){ var get_elements; switch(work.bbs_name){ case "5ch_v8": get_elements = function(target){ return ElementGetElementsByClassName(target,"post"); }; break; } var count = 0; var re_id = new RegExp("^[ \t\r\n]*([0-9]+)","i"); var num = element_parents.length; var i,j; for(i=0;i 1) return; }else if(count == 1){ first_id = parseInt(m[1]); dictionary_id[first_id] = true; if(first_id <= 2) first_id = 1; return; } count += 1; } } })(); getLastId(function(id){ last_id = id; dictionary_id[last_id] = true; }); // -------------------------------------------------------------------------------- // 読み込みリスト // -------------------------------------------------------------------------------- load_shadow_list = [ { url:base_url, parse:loadShadowFromHTML, validity:checkValidityFromHTML } ]; load_more_list = [ { url:base_url + last_id + "-", parse:loadMoreFromHTML, validity:checkValidityFromHTML } ]; // -------------------------------------------------------------------------------- // 読み込み方式 // -------------------------------------------------------------------------------- load_shadow_pos = 0; load_more_pos = 0; // -------------------------------------------------------------------------------- // BbsControlReadMoreButton 作成 // -------------------------------------------------------------------------------- read_more_button = new BbsControlReadMoreButton(); read_more_button.setWaitTime(2 * 1000); read_more_button.onclick = readMore; (function(){ var node = ElementGetElementsByClassName(document.body,"newposts")[0]; if(!node) return; DomNode_InsertBefore(node,read_more_button.getElement()); })(); // -------------------------------------------------------------------------------- // 書き込みをポップアップ化 // -------------------------------------------------------------------------------- (function(){ var element_form; var element_textarea; var input_submit; var event_handler_release; var event_handler_submit; var task; function release(){ if(event_handler_submit){ element_form.removeEventListener("submit",event_handler_submit); event_handler_submit = null; } if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } release_task(); } function release_task(){ if(task){ task.release(); task = null; } } function form_reset(){ element_textarea.value = ""; } function form_set_enable(v){ input_submit.disabled = !(v); } event_handler_release = page_expand_event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(release); (function(){ element_form = (function(){ var nodes = ElementGetElementsByTagName(document.body,"form"); var i; switch(work.bbs_name){ case "5ch_v8": for(i=0;i= 0){ return nodes[i]; } } break; } return null; })(); if(!element_form) return; input_submit = (function(){ var nodes = ElementGetElementsByTagName(element_form,"input"); for(i=0;i 1000 * 2){ closed = true; } } }catch(e){ closed = true; } if(closed){ form_set_enable(true); release_task(); popup_iframe.close(); if(timer){ readMore(function(){}); form_reset(); } } }); })(); }; element_form.addEventListener("submit",event_handler_submit); } })(); // -------------------------------------------------------------------------------- // シャドウロード // -------------------------------------------------------------------------------- (function(){ var num = load_shadow_list.length; var pos = load_shadow_pos; var i = 0; var failure = function(){ i += 1; if(num <= i) return; pos += 1; if(num <= pos) pos = 0; load_shadow_pos = pos; load(); }; var load = function (){ var param = load_shadow_list[pos]; // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ if(!param.validity(str)){ failure(); return; } param.parse(str); }; // 失敗 loader.onerror = function(){ failure(); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(param.url); switch(work.bbs_name){ case "5ch_v8": loader.overrideMimeType("text/plain; charset=Shift_JIS"); break; } loader.loadText(); }; load(); })(); response({result:true}); return true; }, function (info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「5ちゃんねる掲示板(v.08)」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptCallback_5ch_v8" , [ 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,"span"); var num = nodes.length; for(i=0;i 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(myself) 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(myself){ if(num < 2) return false; }else{ if(num < 1) return false; } function f(){ var dl = DocumentCreateElement("div"); dl.style.margin = "0px"; _window.appendChild(dl); var response_id = responses[i]; var clone = response_id.getCloneElements(); var j; var clone_num = clone.length; if(clone_num){ var clone_nodes = []; for(j=0;j 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(myself) 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(myself){ if(num < 2) return false; }else{ if(num < 1) return false; } function f(){ var dl = DocumentCreateElement("div"); dl.style.margin = "0px"; _window.appendChild(dl); var response_name = responses[i]; var clone = response_name.getCloneElements(); var j; var clone_num = clone.length; if(clone_num){ var clone_nodes = []; for(j=0;j 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(myself) 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(myself){ if(num < 2) return false; }else{ if(num < 1) return false; } function f(){ var dl = DocumentCreateElement("div"); dl.style.margin = "0px"; _window.appendChild(dl); var response_host = responses[i]; var clone = response_host.getCloneElements(); var j; var clone_num = clone.length; if(clone_num){ var clone_nodes = []; for(j=0;j= 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 prev = target.lastChild; while(prev){ if(prev.tagName != "BR") break; prev = prev.previousSibling; } if(prev){ DomNode_InsertAfter(prev,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 dl = DocumentCreateElement("div"); dl.style.margin = "0px"; _window.appendChild(dl); var follower = bbs_dictionary.getResponse(ary[i].getNumber()); var clone = follower.getCloneElements(); var j; var clone_num = clone.length; if(clone_num){ var clone_nodes = []; for(j=0;j= num){ insert_str = ">>" + (response.getNumber()) + "\n"; }else{ insert_str = ">>" + (response.getNumber()); } textarea.value = text.slice(0,selection_end) + insert_str + text.slice(selection_end); textarea.selectionEnd = selection_end + insert_str.length; textarea.focus(); if(e.stopImmediatePropagation){ e.stopImmediatePropagation(); } }; return null; }); } var info_number; var info_name; var info_date; var info_uid; var info_message; switch(work.bbs_name){ case "5ch_v8": var info_post = node.clone_nodes[0]; info_number = ElementGetElementsByClassName(info_post,"postid")[0]; info_name = ElementGetElementsByClassName(info_post,"postusername")[0]; info_date = ElementGetElementsByClassName(info_post,"date")[0]; info_uid = ElementGetElementsByClassName(info_post,"uid")[0] || info_date; info_message = ElementGetElementsByClassName(info_post,"post-content")[0]; break; } if(info_number){ forReply(info_number); } if(info_name){ forName(info_name); } if(info_date){ forHost(info_date); } if(info_uid){ forId(info_uid); forFollower(info_uid); } if(info_message){ forResponseAnchor(info_message); forId(info_message); forName(info_message); } } // -------------------------------------------------------------------------------- // エレメントを解析 // -------------------------------------------------------------------------------- var useful = (function(){ var info_post; var info_number; var info_name; var info_date; var info_uid; var info_message; var clone_nodes = []; switch(work.bbs_name){ case "5ch_v8": try{ info_post = element; if(!(info_post.classList.contains("post"))) return false; info_number = ElementGetElementsByClassName(info_post,"postid")[0]; info_name = ElementGetElementsByClassName(info_post,"postusername")[0]; info_date = ElementGetElementsByClassName(info_post,"date")[0]; info_uid = ElementGetElementsByClassName(info_post,"uid")[0] || info_date; info_message = ElementGetElementsByClassName(info_post,"post-content")[0]; clone_nodes.push(info_post); }catch(e){ return false; } break; } // document に未登録 if(!DomNodeGetAttachedDocument(info_post)) return false; // -------------------------------------------------------------------------------- // レスアンカー拡張 // -------------------------------------------------------------------------------- work.extendResponseAnchor(info_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,})","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(info_number){ cleanup(info_number); } if(info_name){ cleanup(info_name); } if(info_date){ cleanup(info_date); } if(info_uid){ cleanup(info_uid); } if(info_message){ cleanup(info_message); } })(); (function(){ switch(work.bbs_name){ case "5ch_v8": var node_list = ElementGetElementsByClassName(info_post,"back-links"); var i; var num = node_list.length; for(i=num-1;i>=0;i--){ DomNodeRemove(node_list[i]); } break; } })(); // ナンバーを取得 if(!(ElementGetTextContent(info_number).match(new RegExp("^([0-9]+)","i")))) return false; // ナンバーからレスポンスオブジェクトを取得 var response = bbs_dictionary.getResponse(parseInt(RegExp.$1)); // レスポンス解析 if(!response.getAnalyzed()){ // IDの取得 if(ElementGetTextContent(info_uid).match(new RegExp("ID:([-a-zA-Z0-9+/.●!=]{8,})","i"))){ response.setId(RegExp.$1); } // 名前の取得 if(ElementGetTextContent(info_name).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:info_date}; 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>|<<|>>|<<|>|>|》|≫|>>)([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 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 checkValidityFromHTML(str){ switch(work.bbs_name){ case "shitaraba": var m = str.match(new RegExp("
","i")); if(!m) return false; var m = str.match(new RegExp("
","i")); if(!m) return false; return true; default: var m = str.match(new RegExp("
.*?
[ ].*?[ ]

","i")); if(m){ m = m[0].match(new RegExp("[\r\n]")); if(!m) return true; } return false; } } // -------------------------------------------------------------------------------- // 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"); var dd_end; switch(work.bbs_name){ case "2ch": case "2ch.sc": case "pink": case "machi": case "machibbs": re_number = new RegExp("([0-9]+)","i"); dd_end = "\n"; break; case "shitaraba": re_number = new RegExp("]*>([0-9]+)
","i"); dd_end = "
"; break; } var p = 0; var n = str.length; function f(){ if(p >= n) return; p = str.indexOf("
",p); if(p < 0) return; var e = str.indexOf(dd_end,p); if(e < 0) return; 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 = (function(){ var i=1; while(true){ var node = nodes[i]; if(!node) break; if(node.tagName == "DD") return node; i++; } return null; })(); 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]*>([0-9]+)","i"); dd_end = ""; break; } var p = 0; var n = str.length; var add_count = 0; function f(){ try{ if(p >= n) throw 0; p = str.indexOf("
",p); if(p < 0) throw 0; var e = str.indexOf(dd_end,p); if(e < 0) throw 0; 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.*.*?<>.*?<>.*?<>.*?<>","i")); if(m){ m = m[0].match(new RegExp("[\r\n]")); if(!m) return true; } return false; } // -------------------------------------------------------------------------------- // 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/(.*?)(
.*)$","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 = "
" + id + " :"; if(m[2]){ html += "" + m[1] + ""; }else{ html += "" + m[1] + ""; } html += ":" + m[3] + "
"; var msg = m[4]; if(msg.match(re_icon)){ msg = "" + RegExp.$2; } html += msg + "

"; 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(.*?)<>(.*?)<>(.*?)<>","i"); var re_icon = new RegExp("^ sssp://img.2ch.net/ico/(.*?)(
.*)$","i"); // レスポンス抽出 var p = 0; var n = str.length; var id = 1; var add_count = 0; 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 = "
" + id + " :"; if(m[2]){ html += "" + m[1] + ""; }else{ html += "" + m[1] + ""; } html += ":" + m[3] + "
"; var msg = m[4]; if(msg.match(re_icon)){ msg = "" + RegExp.$2; } html += msg + "

"; var nodes = StringHtmlCreateDomNodesSafe(html); var j; var node_num = nodes.length; for(j=0;j 1)){ m = ElementGetTextContent(nodes[1]).match(re_id); if(m){ first_id = parseInt(m[1]); dictionary_id[first_id] = true; if(first_id <= 2) first_id = 1; } } m = ElementGetTextContent(nodes[node_num-1]).match(re_id); if(m){ last_id = parseInt(m[1]); dictionary_id[last_id] = true; } } // -------------------------------------------------------------------------------- // 読み込みリスト // -------------------------------------------------------------------------------- load_shadow_list = [ { url:base_url, parse:loadShadowFromHTML, validity:checkValidityFromHTML },{ url:(function(){ var m = base_url.match(new RegExp("http://([^/]+)/test/read\\.cgi/([^/]+)/([0-9]+)/","i")); if(!m) return ""; return "http://" + m[1] + "/" + m[2] + "/dat/" + m[3] + ".dat"; })(), parse:loadShadowFromDAT, validity:checkValidityFromDAT } ]; load_more_list = [ { url:base_url + last_id + "-", parse:loadMoreFromHTML, validity:checkValidityFromHTML },{ url:(function(){ var m = base_url.match(new RegExp("http://([^/]+)/test/read\\.cgi/([^/]+)/([0-9]+)/","i")); if(!m) return ""; return "http://" + m[1] + "/" + m[2] + "/dat/" + m[3] + ".dat"; })(), parse:loadMoreFromDAT, validity:checkValidityFromDAT } ]; // -------------------------------------------------------------------------------- // 読み込み方式 // -------------------------------------------------------------------------------- load_shadow_pos = 0; load_more_pos = 0; // JavaScript モード検出 switch(work.bbs_name){ case "2ch": case "2ch.sc": load_shadow_pos = 1; var nodes = ElementGetElementsByTagName(DocumentGetHeadElement(document),"meta"); var i; var num = nodes.length; for(i=0;i= 0){ element_form = nodes[i]; break; } } break; case "shitaraba": for(i=0;i= 0){ element_form = nodes[i]; break; } } break; case "machi": case "machibbs": for(i=0;i= 0){ element_form = nodes[i]; break; } } break; } // JavaScript モード if(!element_form){ switch(work.bbs_name){ case "2ch.sc": element_form = document.getElementById("postForm"); break; } } if(element_form){ // サブミットボタン var nodes = ElementGetElementsByTagName(element_form,"input"); for(i=0;i 1000 * 2){ closed = true; } } }catch(e){ closed = true; } if(closed){ if(task){ task.release(); } popup_iframe.close(); setEnable(true); if(timer){ readMore(function(){}); clear(); } } }); })(); } (function(){ if(!element_form) return; if(!input_submit) return; if(!element_textarea) return; if(work.docking_form){ work.docking_form.onreset = clear; } if((function(){ try{ var re = new RegExp("^[^:]+"); var m0 = element_form.action.match(re); var m1 = document.URL.match(re); if(!m0) return true; if(!m1) return true; if(m0[0] === m1[0]) return false; }catch(e){} return true; })()) return; if(load_more_pos == 0){ addEvent(); event_handler_release = page_expand_event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ release(); }); } })(); })(); // -------------------------------------------------------------------------------- // シャドウロード // -------------------------------------------------------------------------------- (function(){ var num = load_shadow_list.length; var pos = load_shadow_pos; var i = 0; var failure = function(){ i += 1; if(num <= i) return; pos += 1; if(num <= pos) pos = 0; load_shadow_pos = pos; load(); }; var load = function (){ var param = load_shadow_list[pos]; // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ if(!param.validity(str)){ failure(); return; } param.parse(str); }; // 失敗 loader.onerror = function(){ failure(); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(param.url); 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(); }; load(); })(); response({result:true}); return true; }, function (info,response){ response({result:false}); return true; } ]); // -------------------------------------------------------------------------------- // 掲示板設定「2ちゃんねる掲示板」 // -------------------------------------------------------------------------------- attachItem( "ExpandBbs_ScriptCallback_2ch" , [ 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; switch(work.bbs_name){ case "2ch.sc": nodes = ElementGetElementsByTagName(target,"span"); break; default: nodes = ElementGetElementsByTagName(target,"a"); break; } var num = nodes.length; for(i=0;i 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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 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(myself) 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(myself){ if(num < 2) return false; }else{ 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= 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= num){ insert_str = ">>" + (response.getNumber()) + "\n"; }else{ insert_str = ">>" + (response.getNumber()); } textarea.value = text.slice(0,selection_end) + insert_str + text.slice(selection_end); textarea.selectionEnd = selection_end + insert_str.length; textarea.focus(); }; return null; }); } if(node.dt){ forResponseAnchor(node.dt); forId(node.dt); forName(node.dt); forHost(node.dt); forFollower(node.dt); forReply(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 = DomNodeGetNextElementSibling(dt); 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); } })(); (function(){ switch(work.bbs_name){ case "2ch.sc": var node_list = ElementGetElementsByClassName(dt,"id"); var i; var num = node_list.length; for(i=num-1;i>=0;i--){ var node = node_list[i]; var text = DocumentCreateText(ElementGetTextContent(node)); DomNode_InsertAfter(node,text); DomNodeRemove(node); } var node_list = ElementGetElementsByClassName(dt,"idNum"); var i; var num = node_list.length; for(i=num-1;i>=0;i--){ DomNodeRemove(node_list[i]); } var node = dt.firstChild; if(node.tagName == "SPAN"){ var str = ElementGetTextContent(node); if(str.match(new RegExp("^([0-9]+)","i"))){ var text = DocumentCreateText(str); DomNode_InsertAfter(node,text); DomNodeRemove(node); } } break; } })(); // ナンバーを取得 var dt_text = ElementGetTextContent(dt); if(!(dt_text.match(new RegExp("^[ \t\r\n]*([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> 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; margin:0px 0px 2px auto; line-height:1.0; 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 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 _combo_box_load_cache_for_media; var _stepper_download_thread_max; var _combo_box_conflict_type; var _form_container_download_save_file_simple; var _form_container_download_save_file_detail; var _combo_box_download_save_file_type; var _combo_box_download_save_file_simple; var _text_input_download_save_file_detail; var _form_container_batch_download_save_file_simple; var _form_container_batch_download_save_file_detail; var _combo_box_batch_download_save_file_type; var _combo_box_batch_download_save_file_simple; var _text_input_batch_download_save_file_detail; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (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 container = new UI_LineContainer(group_parent,_i18n.getMessage("menu_setting_download_load_cache_for_media")); var parent = container.getElement(); _combo_box_load_cache_for_media = new UI_ComboBox(parent); _combo_box_load_cache_for_media.attachItem(_i18n.getMessage("menu_setting_expand_image_load_cache_for_media_combo_box_item_default"),"default"); _combo_box_load_cache_for_media.attachItem(_i18n.getMessage("menu_setting_expand_image_load_cache_for_media_combo_box_item_no_store"),"no-store"); _combo_box_load_cache_for_media.attachItem(_i18n.getMessage("menu_setting_expand_image_load_cache_for_media_combo_box_item_force_cache"),"force-cache"); _combo_box_load_cache_for_media.onchange = function(v){ download.load.cache_for_media = v; projectModify(); }; new UI_TextHint(parent,_i18n.getMessage("menu_setting_download_load_cache_for_media_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_save_file")); var parent = container.getElement(); _combo_box_download_save_file_type = new UI_ComboBox(parent); _combo_box_download_save_file_type.attachItem(_i18n.getMessage("menu_setting_download_download_save_file_combo_box_item_simple"),"simple"); _combo_box_download_save_file_type.attachItem(_i18n.getMessage("menu_setting_download_download_save_file_combo_box_item_detail"),"detail"); _combo_box_download_save_file_type.onchange = function(v){ download.download.save_file.type = v; autoDownloadUpdateSaveFile(true); projectModify(); }; new UI_BreakItem(parent); // フィルタ更新 function autoDownloadUpdateSaveFile(update){ var detail = Boolean(download.download.save_file.type === "detail"); if(detail && update){ var save_file_detail = "PageExpand/" + ProjectDownloadSaveFile_DetailFromSimple(download.download.save_file.simple); _text_input_download_save_file_detail.setValue(save_file_detail); download.download.save_file.detail = save_file_detail; } _form_container_download_save_file_simple.setVisible(!detail); _form_container_download_save_file_detail.setVisible(detail); } _form_container_download_save_file_simple = new UI_FormContainer(parent); _form_container_download_save_file_simple.setVisible(true); var form_parent_download_simple = _form_container_download_save_file_simple.getElement(); // 保存先を選択 new UI_TitleItem(form_parent_download_simple,_i18n.getMessage("menu_setting_download_download_save_file_simple")); _combo_box_download_save_file_simple = new UI_ComboBox(form_parent_download_simple); _combo_box_download_save_file_simple.attachItem("PageExpand / ","url"); _combo_box_download_save_file_simple.attachItem("PageExpand / ","kebab_url"); _combo_box_download_save_file_simple.attachItem("PageExpand / ","filename"); _combo_box_download_save_file_simple.attachItem("PageExpand / - ","domain"); _combo_box_download_save_file_simple.attachItem("PageExpand / / ","date"); _combo_box_download_save_file_simple.onchange = function(v){ download.download.save_file.simple = v; projectModify(); }; new UI_BreakItem(form_parent_download_simple); _form_container_download_save_file_detail = new UI_FormContainer(parent); _form_container_download_save_file_detail.setVisible(false); var form_parent_download_detail = _form_container_download_save_file_detail.getElement(); // 保存先を編集 new UI_TitleItem(form_parent_download_detail,_i18n.getMessage("menu_setting_download_download_save_file_detail")); _text_input_download_save_file_detail = new UI_TextInput(form_parent_download_detail); _text_input_download_save_file_detail.oninput = function(v){ download.download.save_file.detail = v; projectModify(); }; new UI_BreakItem(form_parent_download_detail); function downloadInsertSaveFileVariable(parent){ new UI_TitleItem(parent,_i18n.getMessage("menu_setting_download_download_save_file_variable")); new UI_TextItem(parent," "); new UI_TextItem(parent," "); } downloadInsertSaveFileVariable(form_parent_download_detail); // ファイル名衝突時の処理 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); // 一括ダウンロード設定 var title = new UI_TitleSub(_content_window,_i18n.getMessage("menu_setting_download_batch_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_save_file")); var parent = container.getElement(); _combo_box_batch_download_save_file_type = new UI_ComboBox(parent); _combo_box_batch_download_save_file_type.attachItem(_i18n.getMessage("menu_setting_download_download_save_file_combo_box_item_simple"),"simple"); _combo_box_batch_download_save_file_type.attachItem(_i18n.getMessage("menu_setting_download_download_save_file_combo_box_item_detail"),"detail"); _combo_box_batch_download_save_file_type.onchange = function(v){ download.batch_download.save_file.type = v; batchDownloadUpdateSaveFile(true); projectModify(); }; new UI_BreakItem(parent); // フィルタ更新 function batchDownloadUpdateSaveFile(update){ var detail = Boolean(download.batch_download.save_file.type === "detail"); if(detail && update){ var save_file_detail = ProjectDownloadSaveFile_DetailFromSimple(download.batch_download.save_file.simple); _text_input_batch_download_save_file_detail.setValue(save_file_detail); download.batch_download.save_file.detail = save_file_detail; } _form_container_batch_download_save_file_simple.setVisible(!detail); _form_container_batch_download_save_file_detail.setVisible(detail); } _form_container_batch_download_save_file_simple = new UI_FormContainer(parent); _form_container_batch_download_save_file_simple.setVisible(true); var form_parent_batch_download_simple = _form_container_batch_download_save_file_simple.getElement(); // 保存先を選択 new UI_TitleItem(form_parent_batch_download_simple,_i18n.getMessage("menu_setting_download_download_save_file_simple")); _combo_box_batch_download_save_file_simple = new UI_ComboBox(form_parent_batch_download_simple); _combo_box_batch_download_save_file_simple.attachItem("","url"); _combo_box_batch_download_save_file_simple.attachItem("","kebab_url"); _combo_box_batch_download_save_file_simple.attachItem("","filename"); _combo_box_batch_download_save_file_simple.attachItem(" - ","domain"); _combo_box_batch_download_save_file_simple.attachItem(" / ","date"); _combo_box_batch_download_save_file_simple.onchange = function(v){ download.batch_download.save_file.simple = v; projectModify(); }; new UI_BreakItem(form_parent_batch_download_simple); _form_container_batch_download_save_file_detail = new UI_FormContainer(parent); _form_container_batch_download_save_file_detail.setVisible(false); var form_parent_batch_download_detail = _form_container_batch_download_save_file_detail.getElement(); // 保存先を編集 new UI_TitleItem(form_parent_batch_download_detail,_i18n.getMessage("menu_setting_download_download_save_file_detail")); _text_input_batch_download_save_file_detail = new UI_TextInput(form_parent_batch_download_detail); _text_input_batch_download_save_file_detail.oninput = function(v){ download.batch_download.save_file.detail = v; projectModify(); }; new UI_BreakItem(form_parent_batch_download_detail); downloadInsertSaveFileVariable(form_parent_batch_download_detail); new UI_Break(_content_window); // 最大同時ロード数 _stepper_load_thread_max.setValue(download.load.thread_max); // タイムアウト _stepper_load_timeout.setValue(download.load.timeout); // キャッシュモード(メディア用) _combo_box_load_cache_for_media.setValue(download.load.cache_for_media); // 最大同時ダウンロード数 _stepper_download_thread_max.setValue(download.download.thread_max); // ファイル名衝突時の処理 _combo_box_conflict_type.setValue(download.download.conflict_type); // 設定タイプ _combo_box_download_save_file_type.setValue(download.download.save_file.type); // 保存先を選択 _combo_box_download_save_file_simple.setValue(download.download.save_file.simple); // 保存先を編集 _text_input_download_save_file_detail.setValue(download.download.save_file.detail); // 設定タイプ _combo_box_batch_download_save_file_type.setValue(download.batch_download.save_file.type); // 保存先を選択 _combo_box_batch_download_save_file_simple.setValue(download.batch_download.save_file.simple); // 保存先を編集 _text_input_batch_download_save_file_detail.setValue(download.batch_download.save_file.detail); autoDownloadUpdateSaveFile(false); batchDownloadUpdateSaveFile(false); })(); } // -------------------------------------------------------------------------------- // スレッド掲示板拡張設定 // -------------------------------------------------------------------------------- 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> 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; font-size:16px; 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_TitleItem(parent,label){ var _this = this; // -------------------------------------------------------------------------------- // 値をセット // -------------------------------------------------------------------------------- _this.setValue = function(v){ ElementSetTextContent(_body,v); }; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _body; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _body = DocumentCreateElement("div"); ElementSetStyle(_body,"margin:0px 0px 3px; font-size:14px; line-height:1.0; 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_BreakItem(parent){ var _this = this; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _body; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _body = DocumentCreateElement("div"); ElementSetStyle(_body,"margin:0px; height:8px;"); parent.appendChild(_body); })(); } // -------------------------------------------------------------------------------- // テキスト // -------------------------------------------------------------------------------- function UI_Text(parent,label){ var div = DocumentCreateElement("div"); ElementSetStyle(div,"margin:0px 0px 3px; line-height:1.0; font-size:14px;"); ElementSetTextContent(div,label); parent.appendChild(div); return div; } // -------------------------------------------------------------------------------- // アイテム用テキスト // -------------------------------------------------------------------------------- function UI_TextItem(parent,label){ var div = DocumentCreateElement("div"); ElementSetStyle(div,"margin:0px 0px 3px; line-height:1.0; font-size:12px; color:#444;"); ElementSetTextContent(div,label); parent.appendChild(div); return div; } // -------------------------------------------------------------------------------- // テキストヒント // -------------------------------------------------------------------------------- function UI_TextHint(parent,label){ var div = DocumentCreateElement("div"); ElementSetStyle(div,"margin:0px 0px 3px 0px; line-height:1.0; 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,"cursor:pointer; 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 0px 5px 0px;"); parent.appendChild(container); _textarea = DocumentCreateElement("textarea"); ElementSetStyle(_textarea,"width:100%; height:100px; box-sizing:border-box; display:block;"); container.appendChild(_textarea); _textarea.oninput = function(){ _this.oninput(_textarea.value); }; })(); } // -------------------------------------------------------------------------------- // スクリプトオブジェクトエディタ // -------------------------------------------------------------------------------- function UI_ScriptObjectEditer(parent){ var _this = this; // -------------------------------------------------------------------------------- // スクリプトオブジェクトをセット // -------------------------------------------------------------------------------- _this.setScriptObject = function(v){ _script_obj = ObjectCopy(v); update(); }; // -------------------------------------------------------------------------------- // 更新イベント // -------------------------------------------------------------------------------- _this.onchange = function(){}; // -------------------------------------------------------------------------------- // 更新イベント発行 // -------------------------------------------------------------------------------- function dispatchChange(){ if(_this.onchange){ _this.onchange(ObjectCopy(_script_obj)); } } // -------------------------------------------------------------------------------- // 更新 // -------------------------------------------------------------------------------- function update(){ var enable = PageExpandProjectScriptObject_HasUserScript(_script_obj); if(enable){ _button.setLabel(_i18n.getMessage("menu_script_obj_editer_delete_script")); var script = PageExpandProjectScriptObject_ToString(_script_obj); _script_area.setValue(script); }else{ _button.setLabel(_i18n.getMessage("menu_script_obj_editer_edit_script")); } _script_area.setVisible(enable); } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _body; var _script_obj; var _button; var _script_area; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _visible = false; _body = DocumentCreateElement("div"); ElementSetStyle(_body,"margin:0px 0px 0px 0px;"); parent.appendChild(_body); _button = new UI_InlineButton(_body,""); _button.onclick = function(){ if(PageExpandProjectScriptObject_HasUserScript(_script_obj)){ PageExpandProjectScriptObject_ReturnPreset(_script_obj); }else{ var script = PageExpandProjectScriptObject_ToString(_script_obj); PageExpandProjectScriptObject_SetUserScript(_script_obj,script); } update(); dispatchChange(); }; _script_area = new UI_ScriptArea(_body); _script_area.oninput = function(v){ PageExpandProjectScriptObject_SetUserScript(_script_obj,v); dispatchChange(); }; })(); } // -------------------------------------------------------------------------------- // スクリプトエリア // -------------------------------------------------------------------------------- function UI_ScriptArea(parent){ var _this = this; // -------------------------------------------------------------------------------- // 値を取得 // -------------------------------------------------------------------------------- _this.getValue = function(){ return _textarea.value; }; // -------------------------------------------------------------------------------- // 値をセット // -------------------------------------------------------------------------------- _this.setValue = function(v){ _textarea.value = v; }; // -------------------------------------------------------------------------------- // 更新イベント // -------------------------------------------------------------------------------- _this.oninput = function(){}; // -------------------------------------------------------------------------------- // 可視状態セット // -------------------------------------------------------------------------------- _this.setVisible = function(type){ if(type){ _body.style.display = ""; }else{ _body.style.display = "none"; } }; // -------------------------------------------------------------------------------- // 可視状態セット // -------------------------------------------------------------------------------- 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 0px 5px 0px;"); parent.appendChild(_body); _textarea = DocumentCreateElement("textarea"); ElementSetStyle(_textarea,"width:100%; height:300px; box-sizing:border-box; display:block; background-color:#fff; margin-bottom:5px;"); _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:0px 0px 5px 0px;"); _input = DocumentCreateElement("input"); _input.readOnly = "readonly"; ElementSetStyle(_input,"width:100%; box-sizing:border-box; display:block; font-size:12px; padding:2px; background:#f88;"); _input_container.appendChild(_input); new UI_TextHint(_body,_i18n.getMessage("menu_scriptarea_hint")); })(); } // -------------------------------------------------------------------------------- // ステッパー // -------------------------------------------------------------------------------- function UI_NumericStepper(parent){ var _this = this; // -------------------------------------------------------------------------------- // 値取得 // -------------------------------------------------------------------------------- _this.getValue = function(){ var v = parseInt(_input.value) || 0; if(v < _min) v = _min; if(v > _max) v = _max; return v; }; // -------------------------------------------------------------------------------- // 値をセット // -------------------------------------------------------------------------------- _this.setValue = function(v){ v = parseInt(v) || 0; if(v < _min) v = _min; if(v > _max) v = _max; _input.value = v; }; // -------------------------------------------------------------------------------- // 最小値をセット // -------------------------------------------------------------------------------- _this.setMinimum = function(v){ _min = v; _input.min = v; }; // -------------------------------------------------------------------------------- // 最大値をセット // -------------------------------------------------------------------------------- _this.setMaximum = function(v){ _max = v; _input.max = v; }; // -------------------------------------------------------------------------------- // 更新イベント // -------------------------------------------------------------------------------- _this.oninput = function(){}; // -------------------------------------------------------------------------------- // 更新イベント発行 // -------------------------------------------------------------------------------- function dispatchInput(v){ if(_this.oninput){ _this.oninput(v); } } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- 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:auto; min-width:200px; padding:2px; background-color:#fff;"); container.appendChild(_input); _input.oninput = function(){ var v = _this.getValue(); dispatchInput(v); }; _input.onchange = function(){ var v = _this.getValue(); _this.setValue(v); dispatchInput(v); }; _this.setMinimum(-0x80000000); _this.setMaximum( 0x7fffffff); })(); } // -------------------------------------------------------------------------------- // ラインボタン // -------------------------------------------------------------------------------- function UI_LineButton(parent,label){ var _this = this; // -------------------------------------------------------------------------------- // ラベルを編集 // -------------------------------------------------------------------------------- _this.setLabel = function(label){ _input.value = label; }; // -------------------------------------------------------------------------------- // クリックイベント // -------------------------------------------------------------------------------- _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.setLabel = function(label){ _input.value = label; }; // -------------------------------------------------------------------------------- // クリックイベント // -------------------------------------------------------------------------------- _this.onclick = function(){}; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _input; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _input = DocumentCreateElement("input"); ElementSetStyle(_input,"padding:4px 10px; margin:0px 2px 5px 0px; box-sizing:border-box;"); _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 0px 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; box-sizing:border-box;"); 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; box-sizing:border-box;"); 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 0px 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; box-sizing:border-box;"); 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:auto; min-width:200px; height:22px; font-size:14px; box-sizing:border-box; display:block;"); 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=0;i--){ removeItem(a[i]); } }; // -------------------------------------------------------------------------------- // 表示更新 // -------------------------------------------------------------------------------- _this.update = function(){ var a = _list.options; var i; var num = a.length; for(i=0;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=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= 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%; box-sizing:border-box; display:block; 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=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; box-sizing:border-box; display:block; 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=0;i--){ removeItem(a[i]); } }; // -------------------------------------------------------------------------------- // 表示更新 // -------------------------------------------------------------------------------- _this.update = function(){ var a = _list.options; var i; var num = a.length; for(i=0;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=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 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=0;i--){ removeItem(a[i]); } }; // -------------------------------------------------------------------------------- // 表示更新 // -------------------------------------------------------------------------------- _this.update = function(){ var a = _list.options; var i; var num = a.length; for(i=0;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=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=0;i--){ removeItem(a[i]); } }; // -------------------------------------------------------------------------------- // 表示更新 // -------------------------------------------------------------------------------- _this.update = function(){ var a = _list.options; var i; var num = a.length; for(i=0;i=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=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 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 1){ _definition_multiple = true; } _definitions_min = 0x7fffffff; _definitions_max = 0; var i; var num = _definitions.length; for(i=0;i _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=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=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 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 1){ _urlmap_multiple = true; } _urlmaps_min = 0x7fffffff; _urlmaps_max = 0; var i; var num = _urlmaps.length; for(i=0;i _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 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=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=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 client_size.height - 6){ splitter_bottom_width = client_size.height - 6; } var w = client_size.width - 6 - 6; if((splitter_left_width + splitter_right_width) > w){ var d = splitter_left_width / (splitter_left_width + splitter_right_width); splitter_left_width = d * w; splitter_right_width = (1.0 - d) * w; } var w = client_size.width - (24 * 3 + 4 + 4); if(w > 150) w = 150; if(w < 24) w = 24; _select_site.style.width = (w) + "px"; if(getCompactMode()){ w = client_size.width; h = client_size.height; style = _category_container.style; style.width = (w) + "px"; style = _catalog_container.style; style.left = "0px"; style.width = (w) + "px"; style.height = (h) + "px"; style = _thread_container.style; style.left = "0px"; style.right = "0px"; style.top = "0px"; style.bottom = "0px"; }else{ style = _category_container.style; w = splitter_left_width; style.width = (w) + "px"; style.bottom = "0px"; style = _catalog_container.style; l = splitter_left_width + 6; w = client_size.width - splitter_left_width - 6 - splitter_right_width; if(getVisibleSplitterRight()) w -= 6; h = client_size.height - splitter_bottom_width; if(getVisibleSplitterBottom()) h -= 6; style.left = (l) + "px"; style.width = (w) + "px"; style.height = (h) + "px"; if(_splitter_right_open){ style = _thread_container.style; l = client_size.width - splitter_right_width; style.left = (l) + "px"; style.right = "0px"; style.top = "0px"; style.bottom = "0px"; } if(_splitter_bottom_open){ style = _thread_container.style; l = splitter_left_width + 6; r = 6; t = client_size.height - splitter_bottom_width; style.left = (l) + "px"; style.right = (r) + "px"; style.top = (t) + "px"; style.bottom = "0px"; } style = _splitter_left.style; l = splitter_left_width; style.left = (l) + "px"; style = _splitter_right.style; r = splitter_right_width; style.right = (r) + "px"; style = _splitter_bottom.style; l = splitter_left_width + 6; r = splitter_right_width + 6; b = splitter_bottom_width; style.left = (l) + "px"; style.right = (r) + "px"; style.bottom = (b) + "px"; } _ui_catalog.resize(); } // -------------------------------------------------------------------------------- // サイト変更 // -------------------------------------------------------------------------------- function changeSelectSite(e){ _current_site = _select_site.value; updateSite(); } // -------------------------------------------------------------------------------- // サイト更新 // -------------------------------------------------------------------------------- function updateSite(callback){ disableCategoryContainer(true); disableCatalogContainer(true); disableThreadContainer(true); _ui_catalog.clearColumn(); _this.clearThread(); _active_panel = "category"; switch(_current_site){ case "2ch": case "5ch": case "5ch_pc": case "open2ch": case "shitaraba": if(_current_site == "shitaraba"){ _category_title.nodeValue = _current_site; disableCategoryContainer(true); openSplitterLeft(false); }else{ _category_title.nodeValue = _current_site; disableCategoryContainer(false); openSplitterLeft(true); } var convert_list = new Object(); convert_list["ppd"] = function(value){ value = Math.floor(value * 100) / 100; return value.toFixed(2); }; convert_list["date_new"] = UNIXTIME_ToString_JP; _ui_catalog.onUpdateItem = function (info){ var parent = info.parent; var data = info.data; var get_title = function(){ var title = data.title; while(true){ var m = title.match(new RegExp("(.*)©(2ch[.]net|5ch[.]net|bbspink[.]com)[ ]*$","i")); if(m){ title = m[1]; continue; } var m = title.match(new RegExp("(.*)\\[(転載禁止|無断転載禁止)\\]$","i")); if(m){ title = m[1]; continue; } break; } return title; }; var get_date = function(){ return convert_list["date_new"](data.date_new); }; var get_ppd = function(){ return convert_list["ppd"](data.ppd); }; switch(info.layout_mode){ case "list": var container = DocumentCreateElement("div"); ElementSetStyle(container,"margin:2px; margin-left:4px; margin-right:4px;"); parent.appendChild(container); var text_container = DocumentCreateElement("div"); ElementSetStyle(text_container,"left:0px; right:0px; top:0px; bottom:0px; overflow:hidden;"); container.appendChild(text_container); var text_block0 = DocumentCreateElement("div"); ElementSetStyle(text_block0,""); text_container.appendChild(text_block0); var inline_text0 = DocumentCreateElement("span"); ElementSetStyle(inline_text0,"word-break:break-all;"); text_block0.appendChild(inline_text0); var text_node0 = document.createTextNode(""); inline_text0.appendChild(text_node0); var text_block1 = DocumentCreateElement("div"); ElementSetStyle(text_block1,"margin-top:2px;"); text_container.appendChild(text_block1); var inline_text1 = DocumentCreateElement("span"); ElementSetStyle(inline_text1,"color:#888;"); text_block1.appendChild(inline_text1); var text_node1 = document.createTextNode(""); inline_text1.appendChild(text_node1); info.onupdate = function(){ text_node0.nodeValue = data.number + ":" + get_title() + " (" + data.res + ")"; text_node1.nodeValue = "[" + get_ppd() + "/d] [" + get_date() + "]"; }; break; case "small_icon": var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"text-decoration:underline; word-break:break-all;"); parent.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title() + " (" + data.res + ")"; }; break; case "large_icon": var container = DocumentCreateElement("div"); ElementSetStyle(container,"margin:4px;"); parent.appendChild(container); var text_container = DocumentCreateElement("div"); ElementSetStyle(text_container,"margin:4px; margin-top:0px;"); container.appendChild(text_container); var text_block0 = DocumentCreateElement("div"); ElementSetStyle(text_block0,""); text_container.appendChild(text_block0); var inline_text0 = DocumentCreateElement("span"); ElementSetStyle(inline_text0,"word-break:break-all;"); text_block0.appendChild(inline_text0); var text_node0 = document.createTextNode(""); inline_text0.appendChild(text_node0); var text_block1 = DocumentCreateElement("div"); ElementSetStyle(text_block1,"margin-top:2px;"); text_container.appendChild(text_block1); var inline_text1 = DocumentCreateElement("span"); ElementSetStyle(inline_text1,"color:#888;"); text_block1.appendChild(inline_text1); var text_node1 = document.createTextNode(""); inline_text1.appendChild(text_node1); info.onupdate = function(){ text_node0.nodeValue = data.number + ":" + get_title() + " (" + data.res + ")"; text_node1.nodeValue = "[" + get_ppd() + "/d] [" + get_date() + "]"; }; break; } return; var element; switch(info.layout_mode){ case "small_icon": element = DocumentCreateElement("span"); break; default: element = DocumentCreateElement("div"); ElementSetStyle(element,"margin:2px; margin-left:4px; margin-right:4px;"); break; } info.parent.appendChild(element); var data = info.data; ElementSetTextContent(element,data.number + ":" + data.title + "(" + data.res + ")"); }; _ui_catalog.onUpdateCell = function (info){ var callback = convert_list[info.key]; var parent = info.parent; var data = info.data; var text_node = document.createTextNode(""); parent.appendChild(text_node); info.onupdate = function(){ if(callback){ text_node.nodeValue = callback(data[info.key]); }else{ text_node.nodeValue = data[info.key]; } } }; var column; column = _ui_catalog.createColumn("number"); column.setLabel("No"); column.setWidthMin(50); column.setWidthMax(50); column.setTextAlign("center"); column = _ui_catalog.createColumn("title"); column.setLabel("Title"); column.setWidthMin(300); column = _ui_catalog.createColumn("res"); column.setLabel("Res"); column.setWidthMin(50); column.setWidthMax(50); column.setTextAlign("right"); column = _ui_catalog.createColumn("ppd"); column.setLabel("P/d"); column.setWidthMin(70); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("date_new"); column.setLabel("Since"); column.setWidthMin(150); column.setWidthMax(150); column.setTextAlign("center"); _ui_catalog.setBlockSize(180,180 * (1/2)); _ui_catalog.sort("number",false); break; case "2chan": _category_title.nodeValue = _current_site; disableCategoryContainer(false); openSplitterLeft(true); var convert_list = new Object(); convert_list["ppd"] = function(value){ value = Math.floor(value * 100) / 100; return value.toFixed(2); }; convert_list["date_new"] = Timestamp_ToString_JP; _ui_catalog.onUpdateItem = function (info){ var parent = info.parent; var data = info.data; var get_title = function(size){ if(data.title.length > size){ return data.title.substr(0,size) + "..."; } return data.title; }; var get_date = function(){ return convert_list["date_new"](data.date_new); }; var get_ppd = function(){ return convert_list["ppd"](data.ppd); }; switch(info.layout_mode){ case "list": var container = DocumentCreateElement("div"); ElementSetStyle(container,"position:relative; margin:2px; margin-left:4px; margin-right:4px; min-height:60px;"); parent.appendChild(container); var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"position:absolute; width:60px; height:60px; text-align:right;"); container.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:60px;"); img_block.appendChild(image); } var text_container = DocumentCreateElement("div"); ElementSetStyle(text_container,"margin-left:65px;"); container.appendChild(text_container); var text_block0 = DocumentCreateElement("div"); ElementSetStyle(text_block0,""); text_container.appendChild(text_block0); var inline_text0 = DocumentCreateElement("span"); ElementSetStyle(inline_text0,"word-break: break-all;"); text_block0.appendChild(inline_text0); var text_node0 = document.createTextNode(""); inline_text0.appendChild(text_node0); var text_block1 = DocumentCreateElement("div"); ElementSetStyle(text_block1,"margin-top:2px;"); text_container.appendChild(text_block1); var inline_text1 = DocumentCreateElement("span"); ElementSetStyle(inline_text1,"color:#888;"); text_block1.appendChild(inline_text1); var text_node1 = document.createTextNode(""); inline_text1.appendChild(text_node1); info.onupdate = function(){ text_node0.nodeValue = data.number + ":" + data.title + " (" + data.res + ")"; text_node1.nodeValue = "[" + get_ppd() + "/d] [" + get_date() + "]"; }; break; case "small_icon": var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"text-decoration:underline; word-break:break-all;"); parent.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(100) + " (" + data.res + ")"; }; break; case "large_icon": var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"margin:4px; margin-bottom:0px; text-align:center;"); parent.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:140px;"); img_block.appendChild(image); } var text_block = DocumentCreateElement("div"); ElementSetStyle(text_block,"margin:4px; margin-top:2px;"); parent.appendChild(text_block); var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"word-break:break-all;"); text_block.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(50) + " (" + data.res + ")"; }; break; } }; _ui_catalog.onUpdateCell = function (info){ var callback = convert_list[info.key]; var parent = info.parent; var data = info.data; var text_node = document.createTextNode(""); parent.appendChild(text_node); info.onupdate = function(){ if(callback){ text_node.nodeValue = callback(data[info.key]); }else{ text_node.nodeValue = data[info.key]; } } }; var column; column = _ui_catalog.createColumn("number"); column.setLabel("No"); column.setWidthMin(50); column.setWidthMax(50); column.setTextAlign("center"); column = _ui_catalog.createColumn("title"); column.setLabel("Title"); column.setWidthMin(300); column = _ui_catalog.createColumn("res"); column.setLabel("Res"); column.setWidthMin(50); column.setWidthMax(50); column.setTextAlign("right"); column = _ui_catalog.createColumn("ppd"); column.setLabel("P/d"); column.setWidthMin(70); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("id"); column.setLabel("id"); column.setWidthMin(100); column.setWidthMax(100); column.setTextAlign("center"); column = _ui_catalog.createColumn("date_new"); column.setLabel("Since"); column.setWidthMin(150); column.setWidthMax(150); column.setTextAlign("center"); _ui_catalog.setBlockSize(140,140 * (4/3)); _ui_catalog.sort("number",false); break; case "4chan": _category_title.nodeValue = _current_site; disableCategoryContainer(false); openSplitterLeft(true); var convert_list = new Object(); convert_list["ppd"] = function(value){ value = Math.floor(value * 100) / 100; return value.toFixed(2); }; convert_list["date_new"] = UNIXTIME_ToString_JP; _ui_catalog.onUpdateItem = function (info){ var parent = info.parent; var data = info.data; var get_title = function(size){ if(data.title.length > size){ return data.title.substr(0,size) + "..."; } return data.title; }; var get_date = function(){ return convert_list["date_new"](data.date_new); }; var get_ppd = function(){ return convert_list["ppd"](data.ppd); }; switch(info.layout_mode){ case "list": var container = DocumentCreateElement("div"); ElementSetStyle(container,"position:relative; margin:2px; margin-left:4px; margin-right:4px; min-height:60px;"); parent.appendChild(container); var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"position:absolute; width:60px; height:60px; text-align:right;"); container.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:60px;"); img_block.appendChild(image); } var text_container = DocumentCreateElement("div"); ElementSetStyle(text_container,"margin-left:65px;"); container.appendChild(text_container); var text_block0 = DocumentCreateElement("div"); ElementSetStyle(text_block0,""); text_container.appendChild(text_block0); var inline_text0 = DocumentCreateElement("span"); ElementSetStyle(inline_text0,"word-break: break-all;"); text_block0.appendChild(inline_text0); var text_node0 = document.createTextNode(""); inline_text0.appendChild(text_node0); var text_block1 = DocumentCreateElement("div"); ElementSetStyle(text_block1,"margin-top:2px;"); text_container.appendChild(text_block1); var inline_text1 = DocumentCreateElement("span"); ElementSetStyle(inline_text1,"color:#888;"); text_block1.appendChild(inline_text1); var text_node1 = document.createTextNode(""); inline_text1.appendChild(text_node1); info.onupdate = function(){ text_node0.nodeValue = data.number + ":" + data.title; text_node1.nodeValue = "R:" + data.replies + " I:" + data.images + " [" + get_ppd() + "/d] [" + get_date() + "]"; }; break; case "small_icon": var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"text-decoration:underline; word-break:break-all;"); parent.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(100) + " (" + data.replies + ")"; }; break; case "large_icon": var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"margin:4px; margin-bottom:0px; text-align:center;"); parent.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:140px;"); img_block.appendChild(image); } var text_block = DocumentCreateElement("div"); ElementSetStyle(text_block,"margin:4px; margin-top:2px;"); parent.appendChild(text_block); var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"word-break:break-all;"); text_block.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(50) + " (" + data.replies + ")"; }; break; } }; _ui_catalog.onUpdateCell = function (info){ var callback = convert_list[info.key]; var parent = info.parent; var data = info.data; var text_node = document.createTextNode(""); parent.appendChild(text_node); info.onupdate = function(){ if(callback){ text_node.nodeValue = callback(data[info.key]); }else{ text_node.nodeValue = data[info.key]; } } }; var column; column = _ui_catalog.createColumn("number"); column.setLabel("No"); column.setWidthMin(50); column.setWidthMax(50); column.setTextAlign("center"); column = _ui_catalog.createColumn("title"); column.setLabel("Title"); column.setWidthMin(300); column = _ui_catalog.createColumn("replies"); column.setLabel("Replies"); column.setWidthMin(50); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("images"); column.setLabel("Images"); column.setWidthMin(50); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("ppd"); column.setLabel("P/d"); column.setWidthMin(70); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("id"); column.setLabel("id"); column.setWidthMin(100); column.setWidthMax(100); column.setTextAlign("center"); column = _ui_catalog.createColumn("date_new"); column.setLabel("Since"); column.setWidthMin(150); column.setWidthMax(150); column.setTextAlign("center"); _ui_catalog.setBlockSize(140,140 * (4/3)); _ui_catalog.sort("number",false); break; case "8chan": _category_title.nodeValue = _current_site; disableCategoryContainer(false); openSplitterLeft(true); var convert_list = new Object(); convert_list["ppd"] = function(value){ value = Math.floor(value * 100) / 100; return value.toFixed(2); }; convert_list["date_new"] = UNIXTIME_ToString_JP; _ui_catalog.onUpdateItem = function (info){ var parent = info.parent; var data = info.data; var get_title = function(size){ if(data.title.length > size){ return data.title.substr(0,size) + "..."; } return data.title; }; var get_date = function(){ return convert_list["date_new"](data.date_new); }; var get_ppd = function(){ return convert_list["ppd"](data.ppd); }; switch(info.layout_mode){ case "list": var container = DocumentCreateElement("div"); ElementSetStyle(container,"position:relative; margin:2px; margin-left:4px; margin-right:4px; min-height:60px;"); parent.appendChild(container); var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"position:absolute; width:60px; height:60px; text-align:right;"); container.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:60px;"); img_block.appendChild(image); } var text_container = DocumentCreateElement("div"); ElementSetStyle(text_container,"margin-left:65px;"); container.appendChild(text_container); var text_block0 = DocumentCreateElement("div"); ElementSetStyle(text_block0,""); text_container.appendChild(text_block0); var inline_text0 = DocumentCreateElement("span"); ElementSetStyle(inline_text0,"word-break: break-all;"); text_block0.appendChild(inline_text0); var text_node0 = document.createTextNode(""); inline_text0.appendChild(text_node0); var text_block1 = DocumentCreateElement("div"); ElementSetStyle(text_block1,"margin-top:2px;"); text_container.appendChild(text_block1); var inline_text1 = DocumentCreateElement("span"); ElementSetStyle(inline_text1,"color:#888;"); text_block1.appendChild(inline_text1); var text_node1 = document.createTextNode(""); inline_text1.appendChild(text_node1); info.onupdate = function(){ text_node0.nodeValue = data.number + ":" + data.title; text_node1.nodeValue = "R:" + data.replies + " I:" + data.images + " [" + get_ppd() + "/d] [" + get_date() + "]"; }; break; case "small_icon": var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"text-decoration:underline; word-break:break-all;"); parent.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(100) + " (" + data.replies + ")"; }; break; case "large_icon": var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"margin:4px; margin-bottom:0px; text-align:center;"); parent.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:140px;"); img_block.appendChild(image); } var text_block = DocumentCreateElement("div"); ElementSetStyle(text_block,"margin:4px; margin-top:2px;"); parent.appendChild(text_block); var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"word-break:break-all;"); text_block.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(50) + " (" + data.replies + ")"; }; break; } }; _ui_catalog.onUpdateCell = function (info){ var callback = convert_list[info.key]; var parent = info.parent; var data = info.data; var text_node = document.createTextNode(""); parent.appendChild(text_node); info.onupdate = function(){ if(callback){ text_node.nodeValue = callback(data[info.key]); }else{ text_node.nodeValue = data[info.key]; } } }; var column; column = _ui_catalog.createColumn("number"); column.setLabel("No"); column.setWidthMin(50); column.setWidthMax(50); column.setTextAlign("center"); column = _ui_catalog.createColumn("title"); column.setLabel("Title"); column.setWidthMin(300); column = _ui_catalog.createColumn("replies"); column.setLabel("Replies"); column.setWidthMin(50); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("images"); column.setLabel("Images"); column.setWidthMin(50); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("ppd"); column.setLabel("P/d"); column.setWidthMin(70); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("id"); column.setLabel("id"); column.setWidthMin(100); column.setWidthMax(100); column.setTextAlign("center"); column = _ui_catalog.createColumn("date_new"); column.setLabel("Since"); column.setWidthMin(150); column.setWidthMax(150); column.setTextAlign("center"); _ui_catalog.setBlockSize(140,140 * (4/3)); _ui_catalog.sort("number",false); break; case "2ch.hk": _category_title.nodeValue = _current_site; disableCategoryContainer(false); openSplitterLeft(true); var convert_list = new Object(); convert_list["ppd"] = function(value){ value = Math.floor(value * 100) / 100; return value.toFixed(2); }; convert_list["date_new"] = UNIXTIME_ToString_JP; _ui_catalog.onUpdateItem = function (info){ var parent = info.parent; var data = info.data; var get_title = function(size){ if(data.title.length > size){ return data.title.substr(0,size) + "..."; } return data.title; }; var get_date = function(){ return convert_list["date_new"](data.date_new); }; var get_ppd = function(){ return convert_list["ppd"](data.ppd); }; switch(info.layout_mode){ case "list": var container = DocumentCreateElement("div"); ElementSetStyle(container,"position:relative; margin:2px; margin-left:4px; margin-right:4px; min-height:60px;"); parent.appendChild(container); var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"position:absolute; width:60px; height:60px; text-align:right;"); container.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:60px;"); img_block.appendChild(image); } var text_container = DocumentCreateElement("div"); ElementSetStyle(text_container,"margin-left:65px;"); container.appendChild(text_container); var text_block0 = DocumentCreateElement("div"); ElementSetStyle(text_block0,""); text_container.appendChild(text_block0); var inline_text0 = DocumentCreateElement("span"); ElementSetStyle(inline_text0,"word-break: break-all;"); text_block0.appendChild(inline_text0); var text_node0 = document.createTextNode(""); inline_text0.appendChild(text_node0); var text_block1 = DocumentCreateElement("div"); ElementSetStyle(text_block1,"margin-top:2px;"); text_container.appendChild(text_block1); var inline_text1 = DocumentCreateElement("span"); ElementSetStyle(inline_text1,"color:#888;"); text_block1.appendChild(inline_text1); var text_node1 = document.createTextNode(""); inline_text1.appendChild(text_node1); info.onupdate = function(){ text_node0.nodeValue = data.number + ":" + data.title; text_node1.nodeValue = "R:" + data.replies + " I:" + data.images + " [" + get_ppd() + "/d] [" + get_date() + "]"; }; break; case "small_icon": var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"text-decoration:underline; word-break:break-all;"); parent.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(100) + " (" + data.replies + ")"; }; break; case "large_icon": var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"margin:4px; margin-bottom:0px; text-align:center;"); parent.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:140px;"); img_block.appendChild(image); } var text_block = DocumentCreateElement("div"); ElementSetStyle(text_block,"margin:4px; margin-top:2px;"); parent.appendChild(text_block); var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"word-break:break-all;"); text_block.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(50) + " (" + data.replies + ")"; }; break; } }; _ui_catalog.onUpdateCell = function (info){ var callback = convert_list[info.key]; var parent = info.parent; var data = info.data; var text_node = document.createTextNode(""); parent.appendChild(text_node); info.onupdate = function(){ if(callback){ text_node.nodeValue = callback(data[info.key]); }else{ text_node.nodeValue = data[info.key]; } } }; var column; column = _ui_catalog.createColumn("number"); column.setLabel("No"); column.setWidthMin(50); column.setWidthMax(50); column.setTextAlign("center"); column = _ui_catalog.createColumn("title"); column.setLabel("Title"); column.setWidthMin(300); column = _ui_catalog.createColumn("replies"); column.setLabel("Replies"); column.setWidthMin(50); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("images"); column.setLabel("Images"); column.setWidthMin(50); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("ppd"); column.setLabel("P/d"); column.setWidthMin(70); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("id"); column.setLabel("id"); column.setWidthMin(100); column.setWidthMax(100); column.setTextAlign("center"); column = _ui_catalog.createColumn("date_new"); column.setLabel("Since"); column.setWidthMin(150); column.setWidthMax(150); column.setTextAlign("center"); _ui_catalog.setBlockSize(140,140 * (4/3)); _ui_catalog.sort("number",false); break; case "reddit": _category_title.nodeValue = "reddit"; disableCategoryContainer(true); openSplitterLeft(false); var convert_list = new Object(); convert_list["ppd"] = function(value){ value = Math.floor(value * 100) / 100; return value.toFixed(2); }; convert_list["date_new"] = UNIXTIME_ToString_JP; _ui_catalog.onUpdateItem = function (info){ var parent = info.parent; var data = info.data; var get_title = function(size){ if(data.title.length > size){ return data.title.substr(0,size) + "..."; } return data.title; }; var get_date = function(){ return convert_list["date_new"](data.date_new); }; var get_ppd = function(){ return convert_list["ppd"](data.ppd); }; switch(info.layout_mode){ case "list": var container = DocumentCreateElement("div"); ElementSetStyle(container,"position:relative; margin:2px; margin-left:4px; margin-right:4px; min-height:60px;"); parent.appendChild(container); var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"position:absolute; width:60px; height:60px; text-align:right;"); container.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:60px;"); img_block.appendChild(image); } var text_container = DocumentCreateElement("div"); ElementSetStyle(text_container,"margin-left:65px;"); container.appendChild(text_container); var text_block0 = DocumentCreateElement("div"); ElementSetStyle(text_block0,""); text_container.appendChild(text_block0); var inline_text0 = DocumentCreateElement("span"); ElementSetStyle(inline_text0,"word-break: break-all;"); text_block0.appendChild(inline_text0); var text_node0 = document.createTextNode(""); inline_text0.appendChild(text_node0); var text_block1 = DocumentCreateElement("div"); ElementSetStyle(text_block1,"margin-top:2px;"); text_container.appendChild(text_block1); var inline_text1 = DocumentCreateElement("span"); ElementSetStyle(inline_text1,"color:#888;"); text_block1.appendChild(inline_text1); var text_node1 = document.createTextNode(""); inline_text1.appendChild(text_node1); info.onupdate = function(){ text_node0.nodeValue = data.number + ":" + data.title; text_node1.nodeValue = "S:" + data.score + " C:" + data.comments + " [" + get_ppd() + "/d] [" + get_date() + "]"; }; break; case "small_icon": var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"text-decoration:underline; word-break:break-all;"); parent.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(100) + " (" + data.comments + ")"; }; break; case "large_icon": var img_block = DocumentCreateElement("div"); ElementSetStyle(img_block,"margin:4px; margin-bottom:0px; text-align:center;"); parent.appendChild(img_block); var image = data.image; if(image){ ElementSetStyle(image,"max-width:100%; max-height:140px;"); img_block.appendChild(image); } var text_block = DocumentCreateElement("div"); ElementSetStyle(text_block,"margin:4px; margin-top:2px;"); parent.appendChild(text_block); var inline_text = DocumentCreateElement("span"); ElementSetStyle(inline_text,"word-break:break-all;"); text_block.appendChild(inline_text); var text_node = document.createTextNode(""); inline_text.appendChild(text_node); info.onupdate = function(){ text_node.nodeValue = data.number + ":" + get_title(50) + " (" + data.comments + ")"; }; break; } }; _ui_catalog.onUpdateCell = function (info){ var callback = convert_list[info.key]; var parent = info.parent; var data = info.data; var text_node = document.createTextNode(""); parent.appendChild(text_node); info.onupdate = function(){ if(callback){ text_node.nodeValue = callback(data[info.key]); }else{ text_node.nodeValue = data[info.key]; } } }; var column; column = _ui_catalog.createColumn("number"); column.setLabel("No"); column.setWidthMin(50); column.setWidthMax(50); column.setTextAlign("center"); column = _ui_catalog.createColumn("title"); column.setLabel("Title"); column.setWidthMin(300); column = _ui_catalog.createColumn("comments"); column.setLabel("Comments"); column.setWidthMin(50); column.setWidthMax(100); column.setTextAlign("right"); column = _ui_catalog.createColumn("score"); column.setLabel("Score"); column.setWidthMin(50); column.setWidthMax(100); column.setTextAlign("right"); column = _ui_catalog.createColumn("ppd"); column.setLabel("P/d"); column.setWidthMin(70); column.setWidthMax(70); column.setTextAlign("right"); column = _ui_catalog.createColumn("date_new"); column.setLabel("Since"); column.setWidthMin(150); column.setWidthMax(150); column.setTextAlign("center"); _ui_catalog.setBlockSize(140,140 * (4/3)); _ui_catalog.sort("number",false); break; default: _category_title.nodeValue = _current_site; disableCategoryContainer(true); openSplitterLeft(false); _active_panel = ""; break; } updateCompactMode(); _ui_catalog.resize(); updateCategoryReload(callback); } // -------------------------------------------------------------------------------- // サイト設定 // -------------------------------------------------------------------------------- _this.setSite = function (type,callback){ if(_current_site == type) return; _select_site.value = _current_site = type; updateSite(callback); }; // -------------------------------------------------------------------------------- // カタログ設定 // -------------------------------------------------------------------------------- _this.setCatalog = function (url,callback){ disableCatalogContainer(false); _active_panel = "catalog"; updateCompactMode(); _catalog_url = url; _ui_catalog.clearItem(); updateCatalogReload(callback); }; // -------------------------------------------------------------------------------- // スレッド設定 // -------------------------------------------------------------------------------- _this.setThread = function (url){ disableThreadContainer(false); _thread_url = url; _thread_title.nodeValue = url; _thread_iframe.src = url; }; // -------------------------------------------------------------------------------- // スレッドクリア // -------------------------------------------------------------------------------- _this.clearThread = function (){ disableThreadContainer(true); _thread_url = "about:blank"; _thread_iframe.src = _thread_url; _thread_title.nodeValue = ""; }; // -------------------------------------------------------------------------------- // カテゴリの無効設定 // -------------------------------------------------------------------------------- function disableCategoryContainer(disable){ _category_container_disable = disable; updateCategoryContainer(); } // -------------------------------------------------------------------------------- // カタログの無効設定 // -------------------------------------------------------------------------------- function disableCatalogContainer(disable){ _catalog_container_disable = disable; updateCatalogContainer(); } // -------------------------------------------------------------------------------- // スレッドの無効設定 // -------------------------------------------------------------------------------- function disableThreadContainer(disable){ _thread_container_disable = disable; updateThreadContainer(); } // -------------------------------------------------------------------------------- // カテゴリの表示設定 // -------------------------------------------------------------------------------- function visibleCategoryContainer(type){ var style = _category_container.style; if(type){ style.display = "block"; }else{ style.display = "none"; } } // -------------------------------------------------------------------------------- // カタログの表示設定 // -------------------------------------------------------------------------------- function visibleCatalogContainer(type){ var style = _catalog_container.style; if(type){ style.display = "block"; _ui_catalog.resize(); }else{ style.display = "none"; } } // -------------------------------------------------------------------------------- // スレッドの表示設定 // -------------------------------------------------------------------------------- function visibleThreadContainer(type){ var style = _thread_container.style; if(type){ style.display = "block"; _ui_catalog.setTargetMode("thread"); }else{ style.display = "none"; _ui_catalog.setTargetMode("_blank"); } } // -------------------------------------------------------------------------------- // カテゴリの表示取得 // -------------------------------------------------------------------------------- function getVisibleCategoryContainer(){ if(_category_container_disable){ return false; } if(!(_splitter_left_open)){ return false; } return true; } // -------------------------------------------------------------------------------- // カタログの表示取得 // -------------------------------------------------------------------------------- function getVisibleCatalogContainer(){ if(_catalog_container_disable){ return false; } return true; } // -------------------------------------------------------------------------------- // スレッドの表示取得 // -------------------------------------------------------------------------------- function getVisibleThreadContainer(){ if(_compact_mode){ return false; } if(_thread_container_disable){ return false; } if(_splitter_right_open || _splitter_bottom_open){ }else{ return false; } return true; } // -------------------------------------------------------------------------------- // カテゴリの表示更新 // -------------------------------------------------------------------------------- function updateCategoryContainer(){ visibleCategoryContainer(getVisibleCategoryContainer()); } // -------------------------------------------------------------------------------- // カタログの表示更新 // -------------------------------------------------------------------------------- function updateCatalogContainer(){ visibleCatalogContainer(getVisibleCatalogContainer()); } // -------------------------------------------------------------------------------- // スレッドの表示更新 // -------------------------------------------------------------------------------- function updateThreadContainer(){ visibleThreadContainer(getVisibleThreadContainer()); } // -------------------------------------------------------------------------------- // メニューカテゴリをクリック // -------------------------------------------------------------------------------- function clickMenuCategory(e){ if(_compact_mode){ _active_panel = "category"; updateCompactMode(); }else{ openSplitterLeft(!(_splitter_left_open)); } } // -------------------------------------------------------------------------------- // メニューカタログをクリック // -------------------------------------------------------------------------------- function clickMenuCatalog(e){ if(_compact_mode){ _active_panel = "catalog"; updateCompactMode(); } } // -------------------------------------------------------------------------------- // サイドバーリロードをクリック // -------------------------------------------------------------------------------- function clickMenuSidebarReload(e){ if(_this.onreload){ _this.onreload(); } } // -------------------------------------------------------------------------------- // リロードイベント // -------------------------------------------------------------------------------- _this.onreload = function (){}; // -------------------------------------------------------------------------------- // メニュースレッドをクリック // -------------------------------------------------------------------------------- function clickMenuThread(e){ if(_splitter_bottom_open){ openSplitterBottom(false); openSplitterRight(true); }else if(_splitter_right_open){ openSplitterBottom(false); openSplitterRight(false); }else{ openSplitterBottom(true); openSplitterRight(false); } } // -------------------------------------------------------------------------------- // メニュースレッドを更新 // -------------------------------------------------------------------------------- function updateMenuThread(){ _button_menu_thread.setVisible(getVisibleMenuThread()); } function getVisibleMenuThread(){ if(_sidebar_mode) return false; if(_compact_mode) return false; return true; } // -------------------------------------------------------------------------------- // カテゴリレイアウトをクリック // -------------------------------------------------------------------------------- function clickCategoryLayout(e){ _category_layout_mode ++; if(_category_layout_mode >= 4){ _category_layout_mode = 0; } updateCategoryLayout(e); } // -------------------------------------------------------------------------------- // カテゴリレイアウトを更新 // -------------------------------------------------------------------------------- function updateCategoryLayout(e){ switch(_category_layout_mode){ case 0: _ui_category.setOpenMode(true); _ui_category.setLayoutMode("inline"); break; case 1: _ui_category.setOpenMode(true); _ui_category.setLayoutMode("block"); break; case 2: _ui_category.setOpenMode(false); _ui_category.setLayoutMode("inline"); break; case 3: _ui_category.setOpenMode(false); _ui_category.setLayoutMode("block"); break; } } // -------------------------------------------------------------------------------- // カテゴリリロードをクリック // -------------------------------------------------------------------------------- function clickCategoryReload(e){ updateCategoryReload(); } // -------------------------------------------------------------------------------- // カテゴリリロードを更新 // -------------------------------------------------------------------------------- function updateCategoryReload(callback){ _category_modify_count += 1; var modify = _category_modify_count; var complete = function(response){ _button_category_reload.setDisabled(false); if(callback){ callback(response); } }; var exit = function(){ if(modify == _category_modify_count) return false; complete({result:false}); return true; }; _ui_category.clear(); _button_category_reload.setDisabled(true); // ローダーオブジェクトを作成 var loader = new Loader(); switch(_current_site){ case "2ch": case "5ch": case "5ch_pc": case "open2ch": var domain = (_current_site == "5ch_pc") ? "5ch" : _current_site; var loader_url = "https://menu." + domain + ".net/bbsmenu.html"; // 成功 loader.onload = function(str){ if(exit()) return; var re_folder = new RegExp("^
(.*)
","i"); var re_item = new RegExp("(.*)","gi"); var re_start = new RegExp("
","gi"); var re_end = new RegExp("
","gi"); var p = 0; var n = str.length; function f(){ if(exit()) return; try{ if(p >= n) throw 0; re_start.lastIndex = p; var m = re_start.exec(str); if(!m) throw 0; p = m.index; re_end.lastIndex = re_start.lastIndex; var m = re_end.exec(str); if(m){ e = m.index; }else{ e = n; } var s = str.substring(p,e); var m = s.match(re_folder); if(m){ var folder = _ui_category.createFolder(m[1]); folder.setLabel(m[1]); s.replace(re_item,function(m,p1,p2,index,str){ var url = p1; url = StringLiteral_To_String(url) || url; url = StringUrl_To_Absolute(url,loader_url); var item = folder.createItem(p1); item.setLabel(p2); item.setTooltip(url); item.setURL(url); }); } if(p < e){ p = e; execute_queue.attachFirst(f,null); return; } }catch(e){ } complete({result:true}); } execute_queue.attachLast(f,null); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(loader_url); loader.overrideMimeType("text/plain; charset=Shift_JIS"); loader.loadText(); break; case "2chan": var loader_url = "https://www.2chan.net/bbsmenu.html"; // 成功 loader.onload = function(str){ if(exit()) return; var re_folder = new RegExp("^(.*)
","i"); var re_item = new RegExp(']*>([^<]*)',"gi"); var re_sub = new RegExp('://([^.]+)',"i"); var board_list = new Array(); var board_dictionary = new Object(); var p = 0; var n = str.length; try{ while(p < n){ p = str.indexOf("",p); if(p < 0) break; var e = str.indexOf("",p+3); if(e < 0) e = n; var s = str.substring(p,e); var m = s.match(re_folder); if(m){ var category = { label:m[1] }; s.replace(re_item,function(m,p1,p2,index,str){ var board = { category:category, url:StringUrl_To_Absolute(p1,loader_url), label:p2 }; board.prev = board; board.next = board; var m = board.url.match(re_sub); board.sub = (m) ? m[1] : ""; var list = board_dictionary[board.label]; if(list){ var prev = list; var next = list.next; prev.next = board; next.prev = board; board.prev = prev; board.next = next; }else{ list = board_dictionary[board.label] = board; } board_list.push(board); }); } p = e; } }catch(e){ } var p = 0; function f(){ if(exit()) return; try{ var board = board_list[p]; if(!board) throw 0; p++; var category = board.category; var folder = _ui_category.getFolder(category.label); if(!folder){ folder = _ui_category.createFolder(category.label); folder.setLabel(category.label); } var label = board.label; if(board.prev != board){ label += "(" + board.sub + ")"; } var item = folder.createItem(board.url); item.setLabel(label); item.setTooltip(board.url); item.setURL(board.url); execute_queue.attachFirst(f,null); return; }catch(e){ } complete({result:true}); } execute_queue.attachLast(f,null); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(loader_url); loader.overrideMimeType("text/plain; charset=Shift_JIS"); loader.loadText(); break; case "4chan": // 成功 loader.onload = function(str){ if(exit()) return; var boards = JsonParse(str).boards; var folder0 = _ui_category.createFolder("boards"); folder0.setLabel("Boards"); var folder1 = _ui_category.createFolder("folders"); folder1.setLabel("Folders"); var p = 0; var n = boards.length; function f(){ if(exit()) return; try{ if(p >= n) throw 0; var board = boards[p]; p += 1; var url = "https://boards.4chan.org/" + (board.board) + "/"; var item = folder0.createItem(board.board); item.setLabel(board.title); item.setTooltip(board.board); item.setURL(url); var item = folder1.createItem("#" + board.board); item.setLabel(board.board); item.setTooltip(board.title); item.setURL(url); execute_queue.attachFirst(f,null); }catch(e){ } complete({result:true}); } execute_queue.attachLast(f,null); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL("https://a.4cdn.org/boards.json"); loader.loadText(); break; case "8chan": // 成功 loader.onload = function(str){ if(exit()) return; var boards = JsonParse(str); var folder = _ui_category.createFolder("8chan"); folder.setLabel("8chan"); var p = 0; var n = boards.length; if(n > 2000) n = 2000; function f(){ if(exit()) return; try{ if(p >= n) throw 0; var board = boards[p]; p += 1; var item = folder.createItem(board.title); item.setLabel(board.uri); item.setTooltip(board.title); item.setURL("https://8ch.net/" + (board.uri) + "/"); execute_queue.attachFirst(f,null); }catch(e){ } complete({result:true}); } execute_queue.attachLast(f,null); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL("https://8ch.net/boards.json"); loader.loadText(); break; case "2ch.hk": // 成功 loader.onload = function(str){ if(exit()) return; var boards = JsonParse(str).boards; var board_list = new Array(); var folder_dictionary = new Array(); var p = 0; var n = boards.length; for(p=0;p= 4){ _catalog_layout_mode = 0; } updateCatalogLayout(e); } // -------------------------------------------------------------------------------- // カタログレイアウトを更新 // -------------------------------------------------------------------------------- function updateCatalogLayout(e){ switch(_catalog_layout_mode){ case 0: _ui_catalog.setLayoutMode("detail"); break; case 1: _ui_catalog.setLayoutMode("list"); break; case 2: _ui_catalog.setLayoutMode("large_icon"); break; case 3: _ui_catalog.setLayoutMode("small_icon"); break; } } // -------------------------------------------------------------------------------- // カタログリロードをクリック // -------------------------------------------------------------------------------- function clickCatalogReload(e){ updateCatalogReload(); } // -------------------------------------------------------------------------------- // カタログリロードを更新 // -------------------------------------------------------------------------------- function updateCatalogReload(callback){ _catalog_modify_count += 1; var modify = _catalog_modify_count; var complete = function(response){ _button_catalog_reload.setDisabled(false); if(callback){ callback(response); } }; var exit = function(){ if(modify == _catalog_modify_count) return false; complete({result:false}); return true; }; _button_catalog_reload.setDisabled(true); switch(_current_site){ case "2ch": case "5ch": case "5ch_pc": case "open2ch": case "shitaraba": var protocol; var domain; var directory; if(_current_site == "shitaraba"){ if(!domain){ var m = _catalog_url.match(new RegExp("(http|https)://([^/]+[.](shitaraba)[.]net)/(test|bbs)/[^/]+[.]cgi/([^/]+/[0-9]+)","i")); if(m){ protocol = m[1]; domain = m[2]; directory = m[5]; } } if(!domain){ var m = _catalog_url.match(new RegExp("(http|https)://([^/]+[.](shitaraba)[.]net)/([^/]+/[0-9]+)","i")); if(m){ protocol = m[1]; domain = m[2]; directory = m[4]; } } if(domain){ _catalog_title.nodeValue = protocol + "://" + domain + "/" + directory + "/"; }else{ complete({result:false}); return; } }else{ if(!domain){ var m = _catalog_url.match(new RegExp("(http|https)://([^/]+[.](bbspink[.]com|open2ch[.]net|2ch[.]net|5ch[.]net))/test/read[.]cgi/([^/]+)","i")); if(m){ protocol = m[1]; domain = m[2]; directory = m[4]; } } if(!domain){ var m = _catalog_url.match(new RegExp("(http|https)://([^/]+[.](bbspink[.]com|open2ch[.]net|2ch[.]net|5ch[.]net))/([^/]+)","i")); if(m){ protocol = m[1]; domain = m[2]; directory = m[4]; } } if(domain){ _catalog_title.nodeValue = protocol + "://" + domain + "/" + directory + "/"; }else{ complete({result:false}); return; } } // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ if(exit()) return; var re = new RegExp("([0-9]+)[.](dat<>[ ]*|cgi,)(.*)[(]([0-9]+)[)]","i"); var item_list = _ui_catalog.getItemList(); var i; var num = item_list.length; for(i=0;i 0){ ppd = data.res / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); } var p = 0; var n = str.length; var index = 1; function f(){ if(exit()) return; try{ if(p >= n) throw 0; var e = str.indexOf("\n",p+1); if(e < 0) e = n; var s = str.substring(p,e); var m = s.match(re); if(m){ var item = _ui_catalog.createItem(m[1]); if(_current_site == "shitaraba"){ item.setURL(protocol + "://" + domain + "/bbs/read.cgi/" + directory + "/" + (m[1])); }else{ var c = ""; if(_current_site == "5ch_pc") c = "c/"; if(domain.match(/bbspink[.]com$/)) c = ""; item.setURL(protocol + "://" + domain + "/test/read.cgi/" + c + directory + "/" + (m[1])); } var data = item.getData(); data.number = index; data.id = parseInt(m[1]); data.title = StringConvert_From_CharacterReferences_To_Text(m[3]); data.res = parseInt(m[4]); data.date_new = parseInt(data.id); data.ppd = (function(){ var now = new Date(); var old = new Date(data.date_new * 1000); var sub = now.getTime() - old.getTime(); var ppd = 0; if(sub > 0){ ppd = data.res / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); index += 1; } if(p < e){ p = e; f(); return; } }catch(e){ } _ui_catalog.commit(); complete({result:true}); } f(); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(protocol + "://" + domain + "/" + directory + "/subject.txt"); if(_current_site == "shitaraba"){ loader.overrideMimeType("text/plain; charset=euc-jp"); }else{ loader.overrideMimeType("text/plain; charset=Shift_JIS"); } loader.loadText(); break; case "2chan": var domain; var directory; if(!domain){ var m = _catalog_url.match(new RegExp("(http|https)://([^/]+[.]2chan[.]net)/([^/]+)","i")); if(m){ domain = m[2]; directory = m[3]; } } if(domain){ _catalog_title.nodeValue = "https://" + domain + "/" + directory + "/futaba.htm"; }else{ complete({result:false}); return; } // ローダーオブジェクトを作成 var loader = new Loader(); var loader_url = "https://" + domain + "/" + directory + "/futaba.php?mode=cat&cxyl=1x2000x2000x0x6"; // 成功 loader.onload = function(str){ if(exit()) return; var re_href = new RegExp("([^<]*)","i"); var re_res = new RegExp("]*>([0-9]+)","i"); var re_date = new RegExp("/([0-9]+)s[.]jpg","i"); var item_list = _ui_catalog.getItemList(); var i; var num = item_list.length; for(i=0;i 0){ ppd = data.res / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); } var p = 0; var n = str.length; var index = 1; function f(){ if(exit()) return; try{ if(p >= n) throw 0; p = str.indexOf("",p); if(p < 0) throw 0; var e = str.indexOf("",p+8); if(e < 0) e = n; var s = str.substring(p,e); var m = s.match(re_href); if(m){ var item = _ui_catalog.createItem(m[1]); var data = item.getData(); data.number = index; data.id = parseInt(m[1]); item.setURL("https://" + domain + "/" + directory + "/res/" + (data.id) + ".htm"); m = s.match(re_title); if(m) data.title = StringConvert_From_CharacterReferences_To_Text(m[1]); m = s.match(re_res); if(m) data.res = parseInt(m[1]); m = s.match(re_date); if(m){ data.date_new = parseInt(m[1]); }else{ data.date_new = 0; } m = s.match(re_image); if(m){ data.image_url = StringUrl_To_Absolute(m[1] + "/thumb/" + m[3],loader_url); var image = new Image(); image.src = data.image_url; data.image = image; } data.ppd = (function(){ var now = new Date(); var old = new Date(data.date_new); var sub = now.getTime() - old.getTime(); var ppd = 0; if(sub > 0){ ppd = data.res / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); index += 1; } if(p < e){ p = e; f(); return; } }catch(e){ } _ui_catalog.commit(); complete({result:true}); } f(); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(loader_url); loader.overrideMimeType("text/plain; charset=Shift_JIS"); loader.loadText(); break; case "4chan": var domain; var directory; if(!domain){ var m = _catalog_url.match(new RegExp("(http|https)://([^/]+[.]4chan[.]org)/([^/]+)","i")); if(m){ domain = m[2]; directory = m[3]; } } if(domain){ _catalog_title.nodeValue = "https://" + domain + "/" + directory + "/"; }else{ complete({result:false}); return; } // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ if(exit()) return; var item_list = _ui_catalog.getItemList(); var i; var num = item_list.length; for(i=0;i 0){ ppd = data.replies / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); } var index = 1; try{ var pages = JsonParse(str); var i,j; for(i=0;i 0){ ppd = data.replies / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); index += 1; } } }catch(e){ } _ui_catalog.commit(); complete({result:true}); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL("https://a.4cdn.org/" + directory + "/catalog.json"); loader.loadText(); break; case "8chan": var domain; var directory; if(!domain){ var m = _catalog_url.match(new RegExp("(http|https)://(8ch[.]net)/([^/]+)","i")); if(m){ domain = m[2]; directory = m[3]; } } if(domain){ _catalog_title.nodeValue = "https://" + domain + "/" + directory + "/"; }else{ complete({result:false}); return; } // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ if(exit()) return; var item_list = _ui_catalog.getItemList(); var i; var num = item_list.length; for(i=0;i 0){ ppd = data.replies / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); } var index = 1; try{ var pages = JsonParse(str); var i,j; for(i=0;i 0){ ppd = data.replies / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); index += 1; } } }catch(e){ } _ui_catalog.commit(); complete({result:true}); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL("https://8ch.net/" + directory + "/catalog.json"); loader.loadText(); break; case "2ch.hk": var domain; var directory; if(!domain){ var m = _catalog_url.match(new RegExp("(http|https)://(2ch[.]hk)/([^/]+)","i")); if(m){ domain = m[2]; directory = m[3]; } } if(domain){ _catalog_title.nodeValue = "https://" + domain + "/" + directory + "/"; }else{ complete({result:false}); return; } // ローダーオブジェクトを作成 var loader = new Loader(); var loader_url = "https://2ch.hk/" + directory + "/catalog.json"; // 成功 loader.onload = function(str){ if(exit()) return; var item_list = _ui_catalog.getItemList(); var i; var num = item_list.length; for(i=0;i 0){ ppd = data.replies / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); } var index = 1; try{ var response = JsonParse(str); var threads = response.threads; var i; for(i=0;i 0){ ppd = data.replies / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); index += 1; } }catch(e){ } _ui_catalog.commit(); complete({result:true}); }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; // テキストの読み込み loader.setMethod("GET"); loader.setURL(loader_url); loader.loadText(); break; case "reddit": var domain; var directory; var order; if(!domain){ var m = _catalog_url.match(new RegExp("https://(www[.]reddit[.]com)/r/([^/]+)","i")); if(m){ domain = m[1]; directory = m[2]; } } if(domain){ var m = _catalog_url.match(new RegExp("reddit[.]com/r/[^/]+/(hot|new|rising|controversial|top)")); if(m){ order = m[1]; } var title = "https://" + domain + "/r/" + directory + "/"; if(order) title += order + "/"; _catalog_title.nodeValue = title; }else{ complete({result:false}); return; } var index = 0; var load_count = 0; var load_max = 10; var load_func = function (after){ // ローダーオブジェクトを作成 var loader = new Loader(); // 成功 loader.onload = function(str){ if(exit()) return; try{ var response = JsonParse(str); after = response.data.after; var children = response.data.children; var i; var num = children.length; for(i=0;i= 0){ data.image_url = thread.thumbnail; } if(data.image_url){ var image = new Image(); image.src = data.image_url; data.image = image; } data.ppd = (function(){ var now = new Date(); var old = new Date(data.date_new * 1000); var sub = now.getTime() - old.getTime(); var ppd = 0; if(sub > 0){ ppd = data.comments / (sub / 1000 / 60 / 60 / 24); } return ppd; })(); index += 1; } }catch(e){ } _ui_catalog.commit(); load_count ++; if((load_count < load_max) && after){ load_func(after); }else{ complete({result:true}); } }; // 失敗 loader.onerror = function(){ if(exit()) return; complete({result:false}); }; var loader_url = "https://" + domain + "/r/" + directory; if(order){ loader_url += "/" + order; } loader_url += ".json?count=" + (index) + "&limit=100"; if(after){ loader_url += "&after=" + after; } // テキストの読み込み loader.setMethod("GET"); loader.setURL(loader_url); loader.loadText(); }; load_func(); break; default: complete({result:false}); break; } } // -------------------------------------------------------------------------------- // スレッドリロードをクリック // -------------------------------------------------------------------------------- function clickThreadReload(e){ _thread_iframe.src = _thread_url; } // -------------------------------------------------------------------------------- // 左スプリッタをクリック // -------------------------------------------------------------------------------- function clickSplitterLeft(e){ openSplitterLeft(!(_splitter_left_open)); } // -------------------------------------------------------------------------------- // 右スプリッタをクリック // -------------------------------------------------------------------------------- function clickSplitterRight(e){ openSplitterBottom(false); openSplitterRight(!(_splitter_right_open)); } // -------------------------------------------------------------------------------- // 下スプリッタをクリック // -------------------------------------------------------------------------------- function clickSplitterBottom(e){ openSplitterRight(false); openSplitterBottom(!(_splitter_bottom_open)); } // -------------------------------------------------------------------------------- // 左スプリッタ開閉 // -------------------------------------------------------------------------------- function openSplitterLeft(open){ _splitter_left_open = open; updateCategoryContainer(); resize(); } // -------------------------------------------------------------------------------- // 右スプリッタ開閉 // -------------------------------------------------------------------------------- function openSplitterRight(open){ _splitter_right_open = open; if(open && (_splitter_right_width <= 0)){ var client_size = DocumentGetClientSize(document); var w = client_size.width - _splitter_left_width - 6 - 6; _splitter_right_width = w * (2/3); if(_splitter_right_width < 10) _splitter_right_width = 10; } updateThreadContainer(); resize(); } // -------------------------------------------------------------------------------- // 下スプリッタ開閉 // -------------------------------------------------------------------------------- function openSplitterBottom(open){ _splitter_bottom_open = open; if(open && (_splitter_bottom_width <= 0)){ var client_size = DocumentGetClientSize(document); var h = client_size.height - 28 - 6; _splitter_bottom_width = h * (2/3); if(_splitter_bottom_width < 10) _splitter_bottom_width = 10; } updateThreadContainer(); resize(); } // -------------------------------------------------------------------------------- // コンパクトモードを取得 // -------------------------------------------------------------------------------- function getCompactMode(){ return _compact_mode; } // -------------------------------------------------------------------------------- // コンパクトモードの有無を設定 // -------------------------------------------------------------------------------- _this.enableCompactMode = function (type){ var update = (_compact_mode != type); _compact_mode = type; if(update){ updateCompactMode(); resize(); } }; // -------------------------------------------------------------------------------- // コンパクトモードの更新 // -------------------------------------------------------------------------------- function updateCompactMode(){ updateSplitterLeft(); updateSplitterBottom(); updateSplitterRight(); updateMenuThread(); if(_compact_mode){ var category_enable = !Boolean(_category_container_disable); var catalog_enable = !Boolean(_catalog_container_disable); switch(_active_panel){ case "category": category_enable = false; break; case "catalog": catalog_enable = false; break; } _button_menu_category.setDisabled(!category_enable); _button_menu_catalog.setDisabled(!catalog_enable); _button_menu_catalog.setVisible(true); }else{ _button_menu_category.setDisabled(false); _button_menu_catalog.setDisabled(false); _button_menu_catalog.setVisible(false); } if(_compact_mode){ visibleCategoryContainer(false); visibleCatalogContainer(false); visibleThreadContainer(false); switch(_active_panel){ case "category": visibleCategoryContainer(true); break; case "catalog": visibleCatalogContainer(true); break; } }else{ updateCategoryContainer(); updateCatalogContainer(); updateThreadContainer(); } } // -------------------------------------------------------------------------------- // サイドバーモードの有無を設定 // -------------------------------------------------------------------------------- _this.enableSidebarMode = function (type){ var update = (_sidebar_mode != type); _sidebar_mode = type; if(update){ updateSidebarMode(); } }; // -------------------------------------------------------------------------------- // サイドバーモードの更新 // -------------------------------------------------------------------------------- function updateSidebarMode(){ updateSplitterBottom(); updateSplitterRight(); updateMenuThread(); _button_menu_sidebar_reload.setVisible(_sidebar_mode); } // -------------------------------------------------------------------------------- // 左スプリッタの更新 // -------------------------------------------------------------------------------- function updateSplitterLeft(){ visibleSplitterLeft(getVisibleSplitterLeft()); } function getVisibleSplitterLeft(){ if(_compact_mode) return false; return true; } function visibleSplitterLeft(type){ _splitter_left.style.display = ((type) ? "block":"none"); } // -------------------------------------------------------------------------------- // 下スプリッタの更新 // -------------------------------------------------------------------------------- function updateSplitterBottom(){ visibleSplitterBottom(getVisibleSplitterBottom()); } function getVisibleSplitterBottom(){ if(_compact_mode) return false; if(_sidebar_mode) return false; return true; } function visibleSplitterBottom(type){ _splitter_bottom.style.display = ((type) ? "block":"none"); } // -------------------------------------------------------------------------------- // 右スプリッタの更新 // -------------------------------------------------------------------------------- function updateSplitterRight(){ visibleSplitterRight(getVisibleSplitterRight()); } function getVisibleSplitterRight(){ if(_compact_mode) return false; if(_sidebar_mode) return false; return true; } function visibleSplitterRight(type){ _splitter_right.style.display = ((type) ? "block":"none"); } // -------------------------------------------------------------------------------- // ツールボタン // -------------------------------------------------------------------------------- function UI_ToolButton(parent){ var _this = this; // -------------------------------------------------------------------------------- // 表示設定 // -------------------------------------------------------------------------------- _this.setVisible = function(visible){ var style = _button.style; if(visible){ style.display = "inline-block"; }else{ style.display = "none"; } }; // -------------------------------------------------------------------------------- // 無効設定 // -------------------------------------------------------------------------------- _this.setDisabled = function(disabled){ _button.disabled = disabled; var style = _button.style; if(disabled){ style.opacity = 0.5; }else{ style.opacity = 1.0; } }; // -------------------------------------------------------------------------------- // ラベルを編集 // -------------------------------------------------------------------------------- _this.setLabel = function(value){ _button.value = value; }; // -------------------------------------------------------------------------------- // ラベルを編集 // -------------------------------------------------------------------------------- _this.setImageURL = function(url){ _image.src = url; }; // -------------------------------------------------------------------------------- // ツールチップを編集 // -------------------------------------------------------------------------------- _this.setTooltip = function(value){ _button.title = value; }; // -------------------------------------------------------------------------------- // クリックイベント // -------------------------------------------------------------------------------- _this.onclick = function(){}; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _button; var _label; var _image; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _button = DocumentCreateElement("button"); ElementSetStyle(_button,"position:relative; width:24px; height:24px; vertical-align:top; padding:0px;"); parent.appendChild(_button); _image = DocumentCreateElement("img"); ElementSetStyle(_image,CSSTextGetInitialImageElement()); ElementAddStyle(_image,"vertical-align:top; margin:0px auto; display:block; pointer-events:inherit;"); _button.appendChild(_image); _label = DocumentCreateElement("div"); ElementSetStyle(_label,"position:absolute; left:0px; top:0px; right:0px; bottom:0px; text-align:center;"); _button.appendChild(_label); _button.onclick = function(e){ if(_this.onclick){ _this.onclick(e) } }; })(); } // -------------------------------------------------------------------------------- // ロード(内部用) // -------------------------------------------------------------------------------- function projectLoad(func){ var proj = new PageExpandProject(); // プロジェクトをロード proj.loadLocalStorage(function(e){ // プロジェクトを更新 page_expand_project = proj; project = new Project(); project.importObjectForBackground(page_expand_project.getProject()); func(e); }); } // -------------------------------------------------------------------------------- // イベントを追加(内部用) // -------------------------------------------------------------------------------- function addEvent(){ removeEvent(); if(window.addEventListener){ window.addEventListener("resize",resize,false); }else if(window.attachEvent){ window.attachEvent("onresize",resize); } } // -------------------------------------------------------------------------------- // イベントを破棄(内部用) // -------------------------------------------------------------------------------- function removeEvent(){ if(window.removeEventListener){ window.removeEventListener("resize",resize,false); }else if(window.detachEvent){ window.detachEvent("onresize",resize); } } // -------------------------------------------------------------------------------- // セットアップ // -------------------------------------------------------------------------------- _this.setURL = function(url){ if(!url) return; var m = url.match(new RegExp("(http|https)://([^/]+)","i")); if(!m) return; var domain = m[2]; var site; if(domain.match(new RegExp("open2ch[.]net$","i"))){ site = "open2ch"; }else if(domain.match(new RegExp("shitaraba[.]net$","i"))){ site = "shitaraba"; }else if(domain.match(new RegExp("(5ch[.]net)$","i"))){ site = "5ch"; }else if(domain.match(new RegExp("(bbspink[.]com|2ch[.]net)$","i"))){ site = "2ch"; }else if(domain.match(new RegExp("2chan[.]net$","i"))){ site = "2chan"; }else if(domain.match(new RegExp("4chan[.]org","i"))){ site = "4chan"; }else if(domain.match(new RegExp("8ch[.]net|8chan.co","i"))){ site = "8chan"; }else if(domain.match(new RegExp("2ch[.]hk","i"))){ site = "2ch.hk"; }else if(domain.match(new RegExp("reddit[.]com$","i"))){ site = "reddit"; } if(site){ _this.setSite(site); _this.setCatalog(url); }else{ _this.setSite(""); _select_site.focus(); } }; // -------------------------------------------------------------------------------- // 初期化(内部用) // -------------------------------------------------------------------------------- function initialize(){ var data_uri_category = "data:image/gif;base64,R0lGODlhEAAQAIAAAP///wAAACH5BAUUAAAALAAAAAAQABAAAAInRH6gy4bR4oORzWofbnRdy3nc1HWKaYhghoSb62mrmrJyvZWv0wIFADs="; var data_uri_catalog = "data:image/gif;base64,R0lGODlhEAAQAIAAAP///wAAACH5BAUUAAAALAAAAAAQABAAAAIhhI9pwe2+mEIh1rns27iDDV6NJ0pdGULelD4W+Z5auyoFADs="; var data_uri_thread = "data:image/gif;base64,R0lGODlhEAAQAIAAAP///wAAACH5BAUUAAAALAAAAAAQABAAAAIojI9pwO2+VACITvmsTft6/kRKp2XmYmai17Fp+G2a+zZiy6I1I/VGAQA7"; var data_uri_layout = "data:image/gif;base64,R0lGODlhEAAQAIAAAAAAAP///yH5BAUUAAEALAAAAAAQABAAAAIrjI9pwBDt4Jru2Vsjna919lXKeEimh6UZp1lrCEvkfILyirOby3q1OEsUAAA7"; var data_uri_reload = "data:image/gif;base64,R0lGODlhEAAQAIAAAP///wAAACH5BAUUAAAALAAAAAAQABAAAAIlhI+pyxD/UJDRQDdtptcymFUJGC5k2YzpuJlS02JmjG3dfK9MAQA7"; // エレメントを全てクリア DomNodeRemoveChildren(document.head); DomNodeRemoveChildren(document.body); // ボディ var body = document.body; ElementSetStyle(body,'font-family:"Meiryo","sans-serif"; margin:0px; padding:0px; background-color:#ccc; overflow:hidden; user-select:none; -moz-user-select:none; -webkit-user-select:none;'); // タイトル document.title = "BBS Board"; // シャドウツリー var shadow_host = DocumentCreateElement("div"); body.appendChild(shadow_host); var shadow_root; if(shadow_host.attachShadow){ shadow_root = shadow_host.attachShadow({mode:"closed"}); }else{ shadow_root = shadow_host; } // メニュー var bbs_board_menu = DocumentCreateElement("div"); ElementSetStyle(bbs_board_menu,"position:absolute; top:0px; left:0px; right:0px; height:28px; color:#fff; background:#000;"); shadow_root.appendChild(bbs_board_menu); // メニュー右 var container_right = DocumentCreateElement("div"); ElementSetStyle(container_right,"position:absolute; right:4px; top:2px;"); bbs_board_menu.appendChild(container_right); // リロードボタン _button_menu_sidebar_reload = new UI_ToolButton(container_right); _button_menu_sidebar_reload.setImageURL(data_uri_reload); _button_menu_sidebar_reload.setTooltip("reload"); _button_menu_sidebar_reload.onclick = clickMenuSidebarReload; // メニュー左 var container_left = DocumentCreateElement("div"); ElementSetStyle(container_left,"position:absolute; left:4px; top:2px;"); bbs_board_menu.appendChild(container_left); // ドメイン選択 _select_site = DocumentCreateElement("select"); _select_site.size = 1; _select_site.onchange = changeSelectSite; ElementSetStyle(_select_site,"height:24px; box-sizing:border-box; vertical-align:top;"); container_left.appendChild(_select_site); var option = DocumentCreateElement("option"); ElementSetStyle(option,"color:#aaa;"); ElementSetTextContent(option,"Select the site ..."); option.value = ""; _select_site.appendChild(option); var option = DocumentCreateElement("option"); ElementSetTextContent(option,"2ch.net"); option.value = "2ch"; _select_site.appendChild(option); var option = DocumentCreateElement("option"); ElementSetTextContent(option,"5ch.net"); option.value = "5ch"; _select_site.appendChild(option); var option = DocumentCreateElement("option"); ElementSetTextContent(option,"5ch.net (PC)"); option.value = "5ch_pc"; _select_site.appendChild(option); var option = DocumentCreateElement("option"); ElementSetTextContent(option,"open2ch.net"); option.value = "open2ch"; _select_site.appendChild(option); var option = DocumentCreateElement("option"); ElementSetTextContent(option,"2chan.net"); option.value = "2chan"; _select_site.appendChild(option); var option = DocumentCreateElement("option"); ElementSetTextContent(option,"4chan.org"); option.value = "4chan"; _select_site.appendChild(option); var option = DocumentCreateElement("option"); ElementSetTextContent(option,"8ch.net"); option.value = "8chan"; _select_site.appendChild(option); var option = DocumentCreateElement("option"); ElementSetTextContent(option,"2ch.hk"); option.value = "2ch.hk"; _select_site.appendChild(option); // カテゴリボタン _button_menu_category = new UI_ToolButton(container_left); _button_menu_category.setImageURL(data_uri_category); _button_menu_category.setTooltip("category"); _button_menu_category.onclick = clickMenuCategory; // カタログボタン _button_menu_catalog = new UI_ToolButton(container_left); _button_menu_catalog.setImageURL(data_uri_catalog); _button_menu_catalog.setTooltip("catalog"); _button_menu_catalog.onclick = clickMenuCatalog; // スレッドボタン _button_menu_thread = new UI_ToolButton(container_left); _button_menu_thread.setImageURL(data_uri_thread); _button_menu_thread.setTooltip("thread"); _button_menu_thread.onclick = clickMenuThread; // コンテナ _bbs_board_container = DocumentCreateElement("div"); ElementSetStyle(_bbs_board_container,"position:absolute; top:28px; left:0px; right:0px; bottom:0px;"); shadow_root.appendChild(_bbs_board_container); // スプリッタ左 _splitter_left = DocumentCreateElement("div"); ElementSetStyle(_splitter_left,"position:absolute; width:2px; top:0px; bottom:0px; border-left:2px #fff solid; border-right:2px #666 solid; cursor:col-resize;"); _bbs_board_container.appendChild(_splitter_left); // スプリッタ右 _splitter_right = DocumentCreateElement("div"); ElementSetStyle(_splitter_right,"position:absolute; width:2px; top:0px; bottom:0px; border-left:2px #fff solid; border-right:2px #666 solid; cursor:col-resize;"); _bbs_board_container.appendChild(_splitter_right); // スプリッタ下 _splitter_bottom = DocumentCreateElement("div"); ElementSetStyle(_splitter_bottom,"position:absolute; height:2px; bottom:0px; border-top:2px #fff solid; border-bottom:2px #666 solid; cursor:row-resize;"); _bbs_board_container.appendChild(_splitter_bottom); (function(){ function f(info){ var task; var old_pos; var dragging = false; var element = info.splitter; element.onmousedown = function(e){ if(task) task.release(); input_mouse.setMouseEvent(e); old_pos = input_mouse.getPositionClient(); task = task_container.createTask(); task.setDestructorFunc(function(){ dragging = false; task = null; }); task.setExecuteFunc(function(){ if(!dragging){ var mouse_pos = input_mouse.getPositionClient(); var vec_x = mouse_pos.x - old_pos.x; var vec_y = mouse_pos.y - old_pos.y; if(Math.sqrt(vec_x * vec_x + vec_y * vec_y) >= 3.0){ dragging = true; _thread_cover.style.display = "block"; info.ondragstart(); } } if(dragging){ info.ondrag(); resize(); } if(!(input_mouse.getButtonLeft())){ if(dragging){ _thread_cover.style.display = "none"; info.ondragend(); } task.release(); return; } }); }; element.onclick = function(e){ if(dragging) return; info.onclick(e); }; } f({ splitter:_splitter_left, onclick:clickSplitterLeft, ondragstart:function(){ openSplitterLeft(true); }, ondrag:function(){ var mouse_pos = input_mouse.getPositionClient(); _splitter_left_width = mouse_pos.x - 3; }, ondragend:function(){ if(_splitter_left_width < 10){ _splitter_left_width = 10; openSplitterLeft(false); } } }); f({ splitter:_splitter_right, onclick:clickSplitterRight, ondragstart:function(){ openSplitterBottom(false); openSplitterRight(true); }, ondrag:function(){ var client_size = DocumentGetClientSize(document); var mouse_pos = input_mouse.getPositionClient(); _splitter_right_width = client_size.width - mouse_pos.x - 3; }, ondragend:function(){ if(_splitter_right_width < 10){ _splitter_right_width = 10; openSplitterRight(false); } } }); f({ splitter:_splitter_bottom, onclick:clickSplitterBottom, ondragstart:function(){ openSplitterRight(false); openSplitterBottom(true); }, ondrag:function(){ var client_size = DocumentGetClientSize(document); var mouse_pos = input_mouse.getPositionClient(); _splitter_bottom_width = client_size.height - mouse_pos.y - 3; }, ondragend:function(){ if(_splitter_bottom_width < 10){ _splitter_bottom_width = 10; openSplitterBottom(false); } } }); })(); // カテゴリコンテナ _category_container = DocumentCreateElement("div"); ElementSetStyle(_category_container,"position:absolute; left:0px; top:0px; bottom:0px; overflow:hidden;"); _bbs_board_container.appendChild(_category_container); // カタログコンテナ _catalog_container = DocumentCreateElement("div"); ElementSetStyle(_catalog_container,"position:absolute; top:0px; overflow:hidden;"); _bbs_board_container.appendChild(_catalog_container); // スレッドコンテナ _thread_container = DocumentCreateElement("div"); ElementSetStyle(_thread_container,"position:absolute; top:0px; overflow:hidden;"); _bbs_board_container.appendChild(_thread_container); // カテゴリメニュー var category_menu = DocumentCreateElement("div"); ElementSetStyle(category_menu,"position:absolute; left:0px; top:0px; right:0px; height:28px; background:#444;"); _category_container.appendChild(category_menu); // メニュー左 var container_left = DocumentCreateElement("div"); ElementSetStyle(container_left,"position:absolute; left:8px; top:2px; right:56px;"); category_menu.appendChild(container_left); // メニュー右 var container_right = DocumentCreateElement("div"); ElementSetStyle(container_right,"position:absolute; right:4px; top:2px;"); category_menu.appendChild(container_right); // カテゴリタイトル var category_title = DocumentCreateElement("div"); ElementSetStyle(category_title,"color:#fff; font-size:14px; padding-top:1px; width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;"); container_left.appendChild(category_title); _category_title = document.createTextNode(""); _category_title.nodeValue = "Category Panel"; category_title.appendChild(_category_title); // レイアウトボタン _button_category_layout = new UI_ToolButton(container_right); _button_category_layout.setImageURL(data_uri_layout); _button_category_layout.setTooltip("layout"); _button_category_layout.onclick = clickCategoryLayout; // リロードボタン _button_category_reload = new UI_ToolButton(container_right); _button_category_reload.setImageURL(data_uri_reload); _button_category_reload.setTooltip("reload"); _button_category_reload.onclick = clickCategoryReload; // カテゴリボディ var category_body = DocumentCreateElement("div"); ElementSetStyle(category_body,"position:absolute; left:0px; top:28px; right:0px; bottom:0px;"); _category_container.appendChild(category_body); // カテゴリ _ui_category = new BbsBoardCategory(category_body); _ui_category.onselect = function(e){ if(e.button == 1) return; var selected_item = _ui_category.getSelectedItem(); disableCatalogContainer(false); _active_panel = "catalog"; updateCompactMode(); _catalog_url = selected_item.getURL(); _ui_catalog.clearItem(); updateCatalogReload(); return false; }; updateCategoryLayout(); // カタログメニュー var catalog_menu = DocumentCreateElement("div"); ElementSetStyle(catalog_menu,"position:absolute; left:0px; top:0px; right:0px; height:28px; background:#444;"); _catalog_container.appendChild(catalog_menu); // メニュー左 var container_left = DocumentCreateElement("div"); ElementSetStyle(container_left,"position:absolute; left:8px; top:2px; right:56px;"); catalog_menu.appendChild(container_left); // メニュー右 var container_right = DocumentCreateElement("div"); ElementSetStyle(container_right,"position:absolute; right:4px; top:2px;"); catalog_menu.appendChild(container_right); // タイトル var catalog_title = DocumentCreateElement("div"); ElementSetStyle(catalog_title,"color:#fff; font-size:14px; padding-top:1px; width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;"); container_left.appendChild(catalog_title); _catalog_title = document.createTextNode(""); _catalog_title.nodeValue = "Catalog Panel"; catalog_title.appendChild(_catalog_title); // レイアウトボタン _button_catalog_layout = new UI_ToolButton(container_right); _button_catalog_layout.setImageURL(data_uri_layout); _button_catalog_layout.setTooltip("layout"); _button_catalog_layout.onclick = clickCatalogLayout; // 更新ボタン _button_catalog_reload = new UI_ToolButton(container_right); _button_catalog_reload.setImageURL(data_uri_reload); _button_catalog_reload.setTooltip("reload"); _button_catalog_reload.onclick = clickCatalogReload; // カタログボディ var catalog_body = DocumentCreateElement("div"); ElementSetStyle(catalog_body,"position:absolute; left:0px; top:28px; right:0px; bottom:0px;"); _catalog_container.appendChild(catalog_body); // カタログ _ui_catalog = new BbsBoardCatalog(catalog_body); _ui_catalog.onselect = function(e){ if(e.button == 1) return; disableThreadContainer(false); if(getVisibleThreadContainer()){ var selected_item = _ui_catalog.getSelectedItem(); _this.setThread(selected_item.getURL()); return false; } }; // スレッドメニュー var thread_menu = DocumentCreateElement("div"); ElementSetStyle(thread_menu,"position:absolute; left:0px; top:0px; right:0px; height:28px; background:#444;"); _thread_container.appendChild(thread_menu); // メニュー左 var container_left = DocumentCreateElement("div"); ElementSetStyle(container_left,"position:absolute; left:8px; top:2px; right:40px;"); thread_menu.appendChild(container_left); // メニュー右 var container_right = DocumentCreateElement("div"); ElementSetStyle(container_right,"position:absolute; right:4px; top:2px;"); thread_menu.appendChild(container_right); // スレッドタイトル var thread_title = DocumentCreateElement("div"); ElementSetStyle(thread_title,"color:#fff; font-size:14px; padding-top:1px; width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;"); container_left.appendChild(thread_title); _thread_title = document.createTextNode(""); _thread_title.nodeValue = "Thread Panel"; thread_title.appendChild(_thread_title); // 更新ボタン _button_thread_reload = new UI_ToolButton(container_right); _button_thread_reload.setImageURL(data_uri_reload); _button_thread_reload.setTooltip("reload"); _button_thread_reload.onclick = clickThreadReload; // スレッドボディ var thread_body = DocumentCreateElement("div"); ElementSetStyle(thread_body,"position:absolute; left:0px; top:28px; right:0px; bottom:0px;"); _thread_container.appendChild(thread_body); // スレッドフレーム _thread_iframe = DocumentCreateElement("iframe"); _thread_iframe.name = "thread"; _thread_iframe.frameBorder = "0"; _thread_iframe.allowFullscreen = true; ElementSetStyle(_thread_iframe,"position:absolute; display:block; background:#fff; left:0px; top:0px; width:100%; height:100%;"); thread_body.appendChild(_thread_iframe); // カバー _thread_cover = DocumentCreateElement("div"); ElementSetStyle(_thread_cover,"position:absolute; display:none; background:#000; opacity:0.2; left:0px; top:0px; right:0px; bottom:0px;"); thread_body.appendChild(_thread_cover); updateCompactMode(); updateSidebarMode(); disableCategoryContainer(true); disableCatalogContainer(true); disableThreadContainer(true); addEvent(); _splitter_left_width = 200; _splitter_right_width = 0; _splitter_bottom_width = 0; resize(); } // -------------------------------------------------------------------------------- // 初期化関数 // -------------------------------------------------------------------------------- _this.initialize = function(func){ var info = { result:false }; // フレームは動作させない if (WindowIsChild(window)){ func(info); return; } // BODY が存在しない var body = document.body; if(!body){ func(info); return; } // プロジェクト読み込み projectLoad(function(e){ // ロケール _i18n = new InternationalMessage(page_expand_project.getLanguage()); // 設定 execute_queue.setOccupancyTime(project.getExecuteQueueOccupancyTime()); execute_queue.setSleepTime(project.getExecuteQueueSleepTime()); initialize(); info.result = true; func(info); }); }; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _i18n; var _bbs_board_container; var _category_container; var _catalog_container; var _thread_container; var _splitter_left; var _splitter_right; var _splitter_bottom; var _category_title; var _catalog_title; var _thread_title; var _thread_iframe; var _thread_cover; var _catalog_url; var _thread_url; var _select_site; var _button_menu_category; var _button_menu_catalog; var _button_menu_thread; var _button_menu_sidebar_reload; var _button_category_layout; var _button_category_reload; var _button_catalog_layout; var _button_catalog_reload; var _button_thread_reload; var _ui_category; var _ui_catalog; var _splitter_left_width = 0; var _splitter_right_width = 0; var _splitter_bottom_width = 0; var _splitter_left_open = false; var _splitter_right_open = false; var _splitter_bottom_open = false; var _category_container_disable = false; var _catalog_container_disable = false; var _thread_container_disable = false; var _compact_mode = false; var _sidebar_mode = false; var _active_panel = ""; var _category_layout_mode = 0; var _catalog_layout_mode = 0; var _current_site = ""; var _category_modify_count = 0; var _catalog_modify_count = 0; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ })(); } // -------------------------------------------------------------------------------- // カテゴリ // -------------------------------------------------------------------------------- function BbsBoardCategory(parent){ var _this = this; // -------------------------------------------------------------------------------- // フォルダを作成 // -------------------------------------------------------------------------------- _this.createFolder = function (key){ var _folder = new Object(); // -------------------------------------------------------------------------------- // フォルダを作成 // -------------------------------------------------------------------------------- _folder.createItem = function (key){ var _item = new Object(); // -------------------------------------------------------------------------------- // ラベルを設定 // -------------------------------------------------------------------------------- _item.setLabel = function (label){ _anchor_text.nodeValue = label; }; // -------------------------------------------------------------------------------- // ツールチップを設定 // -------------------------------------------------------------------------------- _item.setTooltip = function (label){ _anchor.title = label; }; // -------------------------------------------------------------------------------- // アドレスを取得 // -------------------------------------------------------------------------------- _item.getURL = function (){ return _anchor.href; }; // -------------------------------------------------------------------------------- // アドレスを設定 // -------------------------------------------------------------------------------- _item.setURL = function (url){ _anchor.href = url; }; // -------------------------------------------------------------------------------- // クリック // -------------------------------------------------------------------------------- function click(e){ _selected_item = _item if(_this.onselect){ return _this.onselect(e); } } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _anchor; var _anchor_text; var _separator; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _item_dictionary[key] = _item; _anchor = DocumentCreateElement("a"); ElementSetStyle(_anchor,""); _anchor.className = "category_item"; _anchor.title = key; _anchor.target = "_blank"; _anchor.onclick = click; _folder_child.appendChild(_anchor); _anchor_text = document.createTextNode(""); _anchor.appendChild(_anchor_text); _separator = DocumentCreateElement("div"); _separator.className = "category_item_separator"; _folder_child.appendChild(_separator); ElementSetTextContent(_separator,"/"); })(); return _item; }; // -------------------------------------------------------------------------------- // ラベルを設定 // -------------------------------------------------------------------------------- _folder.setLabel = function (label){ _label_text.nodeValue = label; }; // -------------------------------------------------------------------------------- // 開閉を設定 // -------------------------------------------------------------------------------- _folder.setOpen = function (type){ _open_child = Boolean(type); if(_open_child){ _icon_text.nodeValue = "-"; var style = _folder_child.style; style.height = "auto"; style.paddingBottom = "10px"; }else{ _icon_text.nodeValue = "+"; var style = _folder_child.style; style.height = "0px"; style.paddingBottom = "0px"; } }; // -------------------------------------------------------------------------------- // ボディ部をクリック // -------------------------------------------------------------------------------- function clickBody(){ _folder.setOpen(!(_open_child)); } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _folder_container; var _icon; var _icon_text; var _label; var _label_text; var _folder_body; var _folder_child; var _open_child; var _item_dictionary; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _folder_dictionary[key] = _folder; _item_dictionary = new Object(); _folder_container = DocumentCreateElement("div"); ElementSetStyle(_folder_container,"position:relative; margin:2px; margin-bottom:2px; padding:1px;"); _category_container.appendChild(_folder_container); _folder_body = DocumentCreateElement("div"); _folder_body.className = "category_folder"; _folder_body.onclick = clickBody; _folder_container.appendChild(_folder_body); _icon = DocumentCreateElement("div"); ElementSetStyle(_icon,"display:inline-block; width:20px; text-align:center;"); _folder_body.appendChild(_icon); _icon_text = document.createTextNode(""); _icon.appendChild(_icon_text); _label = DocumentCreateElement("span"); ElementSetStyle(_label,""); _folder_body.appendChild(_label); _label_text = document.createTextNode(""); _label.appendChild(_label_text); _folder_child = DocumentCreateElement("div"); ElementSetStyle(_folder_child,"margin-left:10px; overflow:hidden; line-height:16px; font-size:14px;"); _folder_container.appendChild(_folder_child); _folder.setOpen(_open_mode); })(); return _folder; }; // -------------------------------------------------------------------------------- // フォルダを取得 // -------------------------------------------------------------------------------- _this.getFolder = function (key){ return _folder_dictionary[key] || null; }; // -------------------------------------------------------------------------------- // レイアウトモードを設定 // -------------------------------------------------------------------------------- _this.setLayoutMode = function (type){ var style; switch(type){ case "inline": style = _style_item.style; style.display = "inline-block"; style.width = "auto"; style.whiteSpace = "normal"; style.overflow = "visible"; style.wordBreak = "break-all"; style.wordWrap = "break-word"; style = _style_item_separator.style; style.display = "inline"; break; case "block": style = _style_item.style; style.display = "block"; style.width = "100%"; style.whiteSpace = "nowrap"; style.overflow = "hidden"; style.wordBreak = "normal"; style.wordWrap = "normal"; style = _style_item_separator.style; style.display = "none"; break; } }; // -------------------------------------------------------------------------------- // 開閉モードを設定 // -------------------------------------------------------------------------------- _this.setOpenMode = function (type){ _open_mode = type; var key; var folder; for(key in _folder_dictionary){ folder = _folder_dictionary[key]; folder.setOpen(type); } }; // -------------------------------------------------------------------------------- // クリア // -------------------------------------------------------------------------------- _this.clear = function (){ _folder_dictionary = new Object(); DomNodeRemoveChildren(_category_container); }; // -------------------------------------------------------------------------------- // 選択したアイテムを取得 // -------------------------------------------------------------------------------- _this.getSelectedItem = function (){ return _selected_item; }; // -------------------------------------------------------------------------------- // 選択イベント // -------------------------------------------------------------------------------- _this.onselect = function (item){}; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _category_container; var _style_item; var _style_item_separator; var _open_mode; var _folder_dictionary; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _folder_dictionary = new Object(); _category_container = DocumentCreateElement("div"); ElementSetStyle(_category_container,"position:absolute; left:0px; top:0px; right:0px; bottom:0px; overflow-y:scroll; background:#fff;"); parent.appendChild(_category_container); var category_style = DocumentCreateElement("style"); parent.appendChild(category_style); var style_sheet = ElementGetStyleSheet(category_style); CSSStyleSheetInsertRule(style_sheet,".category_folder","margin-left:0px; font-size:14px; color:#000; background:#e8e8e8; border-radius:4px; cursor:pointer; padding:2px; user-select:none; -moz-user-select:none; -webkit-user-select:none;",0); CSSStyleSheetInsertRule(style_sheet,".category_folder:hover","color:#fff; background:#4281F4;",1); CSSStyleSheetInsertRule(style_sheet,".category_item","text-overflow:ellipsis;",2); CSSStyleSheetInsertRule(style_sheet,".category_item:hover","background-color:rgba(192,255,160,0.3);",3); CSSStyleSheetInsertRule(style_sheet,".category_item_separator","font-size:14px; color:ccc; margin-left:2px; margin-right:2px;",4); var rule_list = CSSStyleSheetGetCSSRuleList(style_sheet); _style_item = rule_list[2]; _style_item_separator = rule_list[4]; _this.setLayoutMode("block"); })(); } // -------------------------------------------------------------------------------- // カタログ // -------------------------------------------------------------------------------- function BbsBoardCatalog(parent){ var _this = this; // -------------------------------------------------------------------------------- // カラムを作成 // -------------------------------------------------------------------------------- _this.createColumn = function (key){ var _column = _column_dictionary[key]; if(_column) return _column; return createColumn(key); }; function createColumn(key){ var _column = new Object(); // -------------------------------------------------------------------------------- // ラベルを設定 // -------------------------------------------------------------------------------- _column.setLabel = function (label){ _text.nodeValue = label; }; // -------------------------------------------------------------------------------- // ラベルを設定 // -------------------------------------------------------------------------------- _column.setTextAlign = function (str){ _column.text_align = str; }; // -------------------------------------------------------------------------------- // 最小幅を設定 // -------------------------------------------------------------------------------- _column.setWidthMin = function (value){ _column.width_min = value; }; // -------------------------------------------------------------------------------- // 最大幅を設定 // -------------------------------------------------------------------------------- _column.setWidthMax = function (value){ _column.width_max = value; }; // -------------------------------------------------------------------------------- // 最大幅を設定 // -------------------------------------------------------------------------------- _column.setWidth = function (value){ _column.width = value; _column.width_auto = false; }; // -------------------------------------------------------------------------------- // ソートアイコンを変更 // -------------------------------------------------------------------------------- _column.setSortIcon = function (type){ var style = _block.style; switch(type){ case "up": style.backgroundImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOAgMAAABvOLUFAAAAA3NCSVQICAjb4U/gAAAACVBMVEX////o6Ojo6OgQrkfNAAAAA3RSTlMARP9DYaFSAAAACXBIWXMAAAsSAAALEgHS3X78AAAAFnRFWHRDcmVhdGlvbiBUaW1lADEyLzMwLzE1azlJyQAAACF0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgNC4w6iYndQAAAB5JREFUeJxj4GBgACItMFrVAEIQEOoAQqIMIMQCQgBf3AQV/YKvewAAAABJRU5ErkJggg==)"; break; case "down": style.backgroundImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOAgMAAABvOLUFAAAAA3NCSVQICAjb4U/gAAAACVBMVEX////o6Ojo6OgQrkfNAAAAA3RSTlMARP9DYaFSAAAACXBIWXMAAAsSAAALEgHS3X78AAAAFnRFWHRDcmVhdGlvbiBUaW1lADEyLzMwLzE1azlJyQAAACF0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgNC4w6iYndQAAAB5JREFUeJxjYGFgACJRMAp1ACEIWNUAQloMIMQBQgBM1AQV4OptKwAAAABJRU5ErkJggg==)"; break; default: style.backgroundImage = "none"; break; } switch(type){ case "up": case "down": break; default: break; } }; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _container; var _block; var _text; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _column.key = key; _column_dictionary[key] = _column; var index = _column_list.length; _column_list.push(_column); _column.text_align = "left"; _column.width = 0; _column.width_min = 0; _column.width_max = 65535; _column.width_auto = true; _column.index = index; _container = DocumentCreateElement("div"); ElementSetStyle(_container,"position:relative; display:inline-block; vertical-align:top; height:24px;"); _container.className = "catalog_column_" + (index); _container.draggable = true; _container.ondragstart = function (e){ var cancel = (function(){ if(_column_dragging_border) return true; if(_column_hover_place != "center") return true; return false; })(); if(cancel) return false; var data_transfer = e.dataTransfer; data_transfer.setData("text",key); }; _table_column.appendChild(_container); _block = DocumentCreateElement("div"); _block.className = "catalog_column"; _container.appendChild(_block); _text = document.createTextNode(""); _block.appendChild(_text); var rule_list = CSSStyleSheetGetCSSRuleList(_style_column_list); if(!(rule_list[index])){ CSSStyleSheetInsertRule(_style_column_list , ".catalog_column_" + index , "width:200px;" , index); } _column.element = _container; _column.setSortIcon(""); })(); return _column; } // -------------------------------------------------------------------------------- // アイテムを作成 // -------------------------------------------------------------------------------- _this.createItem = function (key){ var _item = _item_dictionary[key]; if(_item) return _item; return createItem(key); }; function createItem(key){ var _item = new Object(); // -------------------------------------------------------------------------------- // データオブジェクトを取得 // -------------------------------------------------------------------------------- _item.getData = function (){ return _item.data; }; // -------------------------------------------------------------------------------- // アドレスを取得 // -------------------------------------------------------------------------------- _item.getURL = function (){ return _anchor.href; }; // -------------------------------------------------------------------------------- // アドレスをセット // -------------------------------------------------------------------------------- _item.setURL = function (url){ _anchor.href = url; }; // -------------------------------------------------------------------------------- // コミット // -------------------------------------------------------------------------------- _item.commit = function (){ sort(); updateItem(_item); }; // -------------------------------------------------------------------------------- // ソート // -------------------------------------------------------------------------------- function sort(index){ var descending; var index = _item.index; var value = _item_list[index].data[_sort_key]; var num = _item_list.length; if(index+1 >= num){ descending = true; }else if(0 > compareValue(value,_item_list[index+1].data[_sort_key])){ descending = true; }else if(index <= 0){ descending = false; }else if(0 > compareValue(_item_list[index-1].data[_sort_key],value)){ descending = false; }else{ return; } if(descending){ var p = index; var n = 1; while(p >= n){ if(0 > compareValue(_item_list[p-1].data[_sort_key],value)){ break; } p--; } if(index != p){ move(p); } }else{ var p = index + 1; var n = num; while(p < n){ if(0 > compareValue(value,_item_list[p].data[_sort_key])){ break; } p++; } if(index != p){ move(p); } } } // -------------------------------------------------------------------------------- // 移動 // -------------------------------------------------------------------------------- function move(index){ var i = index; var j = _item.index; var num = _item_list.length; var ref; if(_item_list[i]){ ref = _item_list[i].element; } if(i < j){ _item_list.splice(j,1); var a0 = _item_list.slice(0,i); var a1 = _item_list.slice(i); _item_list = a0.concat([_item],a1); for(;i item.max) break; } list.splice(j,0,item); } if(width > 0){ if(count) width /= count; for(i=0;i 0){ if(count) width = (width * count + sub) / count; item.value = item.max; }else{ item.value += width; } } } var container_width = 0; for(i=0;i0;i--){ for(j=i-1;j>=0;j--){ if(0 < compareValue(_item_list[j].data[_sort_key],_item_list[i].data[_sort_key])){ var t = _item_list[i]; _item_list[i] = _item_list[j]; _item_list[j] = t; } } } var after; if(num){ var item = _item_list[num-1]; item.index = num - 1; if(_table_body.lastChild != item.element){ _table_body.appendChild(item.element); } after = item.element; } for(i=num-2;i>=0;i--){ var item = _item_list[i]; item.index = i; if(after.previousSibling != item.element){ _table_body.insertBefore(item.element , after); } after = item.element; } }; // -------------------------------------------------------------------------------- // カラム移動 // -------------------------------------------------------------------------------- _this.moveColumn = function (key , index){ var column = _column_dictionary[key]; if(!column) return; var old_index = column.index; if(old_index > index) index += 1; var p = _column_list[old_index]; _column_list.splice(old_index,1); if(index < 0){ _column_list.unshift(p); }else{ _column_list.splice(index,0,p); } var columns = new Array(); var nodes = _table_column.childNodes; var i; var num = nodes.length; for(i=0;i= num){ _column_hover_place = "border"; } var hover_border = (function(){ if(_column_hover_place == "border") return true; if(_column_dragging_border) return true; return false; })(); _table_column.style.cursor = (hover_border) ? "col-resize" : "pointer"; }; // クリックソート _table_column.onclick = function(e){ if(_column_hover_place != "center") return; var column = _column_list[_column_hover_index_center]; if(!column) return; _this.sort(column.key,!(_sort_descending)); }; // 境界線ダブルクリック _table_column.ondblclick = function(e){ if(_column_hover_place != "border") return; var column = _column_list[_column_hover_index_border]; if(!column) return; var width = 10; var i; var num = _item_list.length; for(i=0;i= 3.0){ _column_dragging_border = true; } } if(_column_dragging_border){ var column_rect = ElementGetBoundingClientRect(column.element); var mouse_pos = input_mouse.getPositionClient(); var width = mouse_pos.x - column_rect.left; if(width < 10) width = 10; column.setWidth(width); _this.resize(); } }); }; })(); })(); _table_body = DocumentCreateElement("div"); ElementSetStyle(_table_body,"position:absolute; left:0px; top:32px; right:0px; bottom:0px; font-size:12px; line-height:1.0; overflow-x:auto; overflow-y:scroll; background:#fff;"); parent.appendChild(_table_body); var right = (function(){ var div = DocumentCreateElement("div"); ElementSetStyle(div,"position:absolute; left:0px; top:0px; width:100px; overflow-y:scroll;"); document.body.appendChild(div); var right = div.offsetWidth - (div.clientWidth + div.clientLeft); DomNodeRemove(div); return right; })(); _table_column.style.right = (right) + "px"; _table_body.onscroll = function(e){ _table_column.scrollLeft = _table_body.scrollLeft; }; var catalog_style = DocumentCreateElement("style"); parent.appendChild(catalog_style); var catalog_style_width = DocumentCreateElement("style"); parent.appendChild(catalog_style_width); var style_sheet = ElementGetStyleSheet(catalog_style); CSSStyleSheetInsertRule(style_sheet,".catalog_item","margin:2px; vertical-align:top; text-decoration:none; border-radius:4px; user-select:none; -moz-user-select:none; -webkit-user-select:none;",0); CSSStyleSheetInsertRule(style_sheet,".catalog_item:nth-child(2n)","",1); CSSStyleSheetInsertRule(style_sheet,".catalog_item:nth-child(2n+1)","",2); CSSStyleSheetInsertRule(style_sheet,".catalog_item:hover","background-color:rgba(192,255,160,0.3);",3); CSSStyleSheetInsertRule(style_sheet,".catalog_column","font-size:14px; background-color:#646464; color:#fff; border-right:1px #888 solid; border-bottom:1px #888 solid; position:absolute; top:0px; bottom:0px; left:0px; right:0px; overflow:hidden; padding-left:4px; padding-top:2px; padding-right:10px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; text-align:center; background-repeat:no-repeat; background-position:center right; user-select:none; -moz-user-select:none; -webkit-user-select:none;",4); CSSStyleSheetInsertRule(style_sheet,".catalog_column:hover","background-color:#4281F4;",5); var rule_list = CSSStyleSheetGetCSSRuleList(style_sheet); _style_item_container = rule_list[0]; _style_item_even = rule_list[1]; _style_item_odd = rule_list[2]; _style_item_hover = rule_list[3]; _style_column_list = ElementGetStyleSheet(catalog_style_width); _this.setLayoutMode("detail"); })(); } // -------------------------------------------------------------------------------- // ダウンロードボード // -------------------------------------------------------------------------------- function PageExpandDownloadBoard(){ var _dlbd = this; var RESIZE_STATE = { NORMAL:1, FULL:2 }; var COLUMN_WIDTH_MINIMUM = 20; var svg_close = "data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iMTUuOTk5OTk5IgpoZWlnaHQ9IjE1Ljk5OTk5OSIKdmlld0JveD0iMCAwIDQuMjMzMzMzIDQuMjMzMzMzIgp2ZXJzaW9uPSIxLjEiCmlkPSIiCnhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxkZWZzCmlkPSIiIC8+CjxnCmlkPSIiPgo8cGF0aApzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjAzO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjUyOTE2NztzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKZD0iTSAwLjI2NDU4MzMzLDAuMjY0NTgzMzMgMy45Njg3NSwzLjk2ODc1IgppZD0iIiAvPgo8cGF0aApzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjAzO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjUyOTE2NztzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKZD0iTSAwLjI2NDU4MzMzLDMuOTY4NzUgMy45Njg3NSwwLjI2NDU4MzMzIgppZD0iIiAvPgo8L2c+Cjwvc3ZnPg=="; var svg_cancel = "data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iNDQuNDkwMTg5IgpoZWlnaHQ9IjQ0LjQ5MDIwNCIKdmlld0JveD0iMCAwIDExLjc3MTM2MiAxMS43NzEzNjciCnZlcnNpb249IjEuMSIKaWQ9IiIKeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgp4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGRlZnMKaWQ9IiIgLz4KPGcKaWQ9IiIKdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuMzQzNDg1NSwtMC43Mjg4OTk4OCkiPgo8ZWxsaXBzZQpzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjA1O3N0cm9rZTojZmYwMDAwO3N0cm9rZS13aWR0aDowLjc5Mzc1O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmlkPSIiCmN4PSIxMy4yMjkxNjciCmN5PSI2LjYxNDU4MzUiCnJ4PSI1LjQ4ODgwNjciCnJ5PSI1LjQ4ODgwODYiIC8+CjxwYXRoCnN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuMDU7c3Ryb2tlOiNmZjAwMDA7c3Ryb2tlLXdpZHRoOjEuNTg3NTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJNIDE2LjI3MTg3NSwzLjU3MTg3NSAxMC4xODY0NTgsOS42NTcyOTE4IgppZD0iIiAvPgo8cGF0aApzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjA1O3N0cm9rZTojZmYwMDAwO3N0cm9rZS13aWR0aDoxLjU4NzU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKZD0ibSAxMC4xODY0NTgsMy41NzE4NzUgNi4wODU0MTcsNi4wODU0MTY4IgppZD0iIiAvPgo8L2c+Cjwvc3ZnPg=="; // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _dlbd.release = function(){ if(fade_main_window){ fade_main_window.release(); fade_main_window = null; } if(archive_creator){ archive_creator.release(); archive_creator = null; } if(hide_scrollbar){ hide_scrollbar.release(); hide_scrollbar = null; } if(download_history_monitor){ download_history_monitor.release(); download_history_monitor = null; } }; // -------------------------------------------------------------------------------- // 表示 // -------------------------------------------------------------------------------- _dlbd.setVisible = function(type){ if(type){ initialize(); fade_main_window.fadein(); }else{ fade_main_window.fadeout(); } }; function setVisible(type){ if(type){ if(_element_style){ _shadow_host.style.display = "initial"; }else{ document.body.appendChild(_shadow_host); } switch(resize_state){ case RESIZE_STATE.FULL: hide_scrollbar.setVisible(false); break; } }else{ if(_element_style){ _shadow_host.style.display = "none"; }else{ DomNodeRemove(_shadow_host); } hide_scrollbar.setVisible(true); } }; function Fade(){ var _this = this; _this.release = function(){ setVisible(false); if(task){ task.release(); task = null; } }; _this.fadein = function(){ alpha_sign = 1; create_task(); }; _this.fadeout = function(){ alpha_sign = -1; create_task(); }; _this.onattach = function(){}; _this.onremove = function(){}; _this.onupdate = function(v){}; _this.speed = 0.0; _this.value = 0.0; function create_task(){ if(task) return; _this.onattach(); task = task_container.createTask(); task.setDestructorFunc(function(){ task = null; }); task.setExecuteFunc(function(){ var finish = false; _this.value += (_this.speed * alpha_sign); if(alpha_sign > 0){ if(_this.value >= 1.0){ _this.value = 1.0; finish = true; } }else{ if(_this.value <= 0.0){ _this.value = 0.0; _this.onremove(); finish = true; } } _this.onupdate(_this.value); if(finish){ task.release(); return; } }); task.execute(0xffffffff); } var task = null; var alpha_sign = 1; } // -------------------------------------------------------------------------------- // フィルタ // -------------------------------------------------------------------------------- _dlbd.setFilter = function(type){ _select_filter.value = filter_type = type; updateFilter(); }; function updateFilter(){ item_container.getItemsAll().forEach(function(item){ item.updateVisible(); }); } // -------------------------------------------------------------------------------- // リサイズ // -------------------------------------------------------------------------------- _dlbd.restoreWindow = function(){ resize_state = RESIZE_STATE.NORMAL; updateResize(); }; _dlbd.maximizeWindow = function(){ resize_state = RESIZE_STATE.FULL; updateResize(); }; _dlbd.toggleWindow = function(){ if(resize_state == RESIZE_STATE.FULL){ resize_state = RESIZE_STATE.NORMAL; }else{ resize_state = RESIZE_STATE.FULL; } updateResize(); }; var updateResize = (function(){ var list = { "border-radius":"initial", "border":"initial", "bottom":"0px", "height":"auto", "left":"0px", "max-height":"none", "max-width":"none", "min-height":"auto", "min-width":"auto", "right":"0px", "top":"0px", "width":"auto" }; return function (){ var k; var style = _element_window.style; switch(resize_state){ case RESIZE_STATE.FULL: for(k in list){ StyleDeclarationSetProperty(style,k,list[k]); } _button_resize.setTooltip(_i18n.getMessage("download_board_button_restore")); _button_resize.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iMTYiCmhlaWdodD0iMTYiCnZpZXdCb3g9IjAgMCA0LjIzMzMzMyA0LjIzMzMzMyIKdmVyc2lvbj0iMS4xIgppZD0iIgp4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCnhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZGVmcwppZD0iIiAvPgo8ZwppZD0iIj4KPHBhdGgKc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC4wMztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ1ODM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKZD0iTSAwLjEzMjI5MTY3LDAuMTMyMjkxNjcgViA0LjEwMTA0MTYgSCA0LjEwMTA0MTYgViAwLjEzMjI5MTY3IFoiCmlkPSIiIC8+CjwvZz4KPC9zdmc+"); hide_scrollbar.setVisible(false); break; case RESIZE_STATE.NORMAL: for(k in list){ StyleDeclarationRemoveProperty(style,k); } _button_resize.setTooltip(_i18n.getMessage("download_board_button_maximum")); _button_resize.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iMTYiCmhlaWdodD0iMTYiCnZpZXdCb3g9IjAgMCA0LjIzMzMzMyA0LjIzMzMzMyIKdmVyc2lvbj0iMS4xIgppZD0iIgp4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCnhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZGVmcwppZD0iIiAvPgo8ZwppZD0iIj4KPHBhdGgKc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC4wMztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ1ODM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKZD0iTSAwLjEzMjI5MTY3LDAuNTk0Njk1MDEgViA0LjEwMTA0MTYgSCAzLjYzODYzODIgViAwLjU5NDY5NTAxIFoiCmlkPSIiIC8+CjxwYXRoCnN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuMDM7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJNIDAuNTk0Njk1MDEsMC4xMzIyOTE2NyBIIDQuMTAxMDQxNiBWIDMuNjM4NjM4MyIKaWQ9IiIgLz4KPC9nPgo8L3N2Zz4="); hide_scrollbar.setVisible(true); break; } }; })(); // -------------------------------------------------------------------------------- // アイテム編集 // -------------------------------------------------------------------------------- function eraseItemsSelected(){ var items = item_container.getItemsErased(); items.forEach(function(item){ item.release(); }); }; _dlbd.deselectItemsAll = function (){ var items = item_container.getItemsAll(); items.forEach(function(item){ item.url_info.setValue("select",false); }); }; function editItemsModal(){ new UI_UrlEditDialog(_element_dlbd); }; function UI_UrlEditDialog(parent){ var _this = this; var _element_background; var _element_window; var _fade; var _items_erase; this.release = function(){ element_remove(); _items_erase.clear(); }; function fadeout(){ _fade.fadeout(); } function element_remove(){ DomNodeRemove(_element_window); DomNodeRemove(_element_background); } _items_erase = new Map(); item_container.getItemsVisibled().forEach(function(item){ _items_erase.set(item,item); }); _element_background = DocumentCreateElement("div"); _element_background.style.cssText = "background:rgba(0,0,0,0.3333);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2147483647;"; _element_background.addEventListener("click",function(e){ fadeout(); }); _element_window = DocumentCreateElement("div"); _element_window.style.cssText = "background:#f8f8f8;border:1px #000 solid;border-radius:10px;bottom:50px;left:50px;margin:auto;max-height:600px;max-width:800px;min-height:200px;min-width:200px;position:fixed;right:50px;top:50px;z-index:2147483647;"; var element_toolbar = DocumentCreateElement("div"); element_toolbar.style.cssText = "background:#fff;height:30px;left:10px;position:absolute;right:10px;top:10px;"; _element_window.appendChild(element_toolbar); var element_toolbar_right = DocumentCreateElement("div"); element_toolbar_right.style.cssText = "display:inline-block;float:right;"; element_toolbar.appendChild(element_toolbar_right); var button_close = new UI_ToolButton(element_toolbar_right); button_close.setImageURL(svg_close); button_close.onclick = fadeout; var element_body = DocumentCreateElement("div"); element_body.style.cssText = "background:#fff;bottom:70px;left:10px;position:absolute;right:10px;top:45px;"; _element_window.appendChild(element_body); var textarea = DocumentCreateElement("textarea"); textarea.wrap = "off"; textarea.style.cssText = "box-sizing:border-box;font-family:inherit;font-size:16px;height:100%;resize:none;width:100%;"; element_body.appendChild(textarea); var element_foot = DocumentCreateElement("div"); element_foot.style.cssText = "background:#fff;bottom:10px;height:50px;left:10px;position:absolute;right:10px;"; _element_window.appendChild(element_foot); var button_update = DocumentCreateElement("button"); ElementSetTextContent(button_update,"OK"); button_update.style.cssText = "height:50px;width:100%;"; element_foot.appendChild(button_update); button_update.onclick = function(){ var urls = new Array(); var re = new RegExp("[^\r\n]+","g"); var r; while(r = re.exec(textarea.value)){ try{ var url = new URL(r[0], _shadow_root.baseURI); urls.push(url.href); }catch(e){} } urls.forEach(function(url){ // 登録済み var url_info = url_info_dictionary.getUrlInfo(url); if(url_info){ var item = item_container.items[url_info.getId()]; if(item){ _items_erase.delete(item); return; } } // 新規追加 url_info = url_info_dictionary.addURL(url); if(url_info) createItem(url_info); }); // 消失したアイテムをすべて除外 _items_erase.forEach(function(item){ item.release(); }); fadeout(); }; var a = new Array(); _items_erase.forEach(function(item){ a.push(item.url_info.url); }); textarea.value = a.join("\n"); _fade = new Fade(); _fade.speed = (1/60)/0.15; _fade.onattach = function(v){ parent.appendChild(_element_background); parent.appendChild(_element_window); }; _fade.onremove = function(){ element_remove(); _this.release(); }; _fade.onupdate = function(v){ var a = v.toFixed(8); _element_background.style.opacity = a; _element_window.style.opacity = a; var f = (v * 4).toFixed(8); _element_background.style.backdropFilter = "blur(" + f + "px)"; }; _fade.fadein(); } // -------------------------------------------------------------------------------- // 解析待ち // -------------------------------------------------------------------------------- _dlbd.waitAnalyze = function(optional){ optional = optional || {}; if(!wait_analyze){ var updateInfo = function(){ var node = _info_wait.root; if(DomNodeGetFirstElementChild(_element_info) == node) return; DomNodeRemoveChildren(_element_info); _element_info.appendChild(node); }; wait_analyze = new WaitAnalize(); wait_analyze.onprogress = function(r){ _info_wait.setText(0,"analyzing this document..."); var s = r.value + " / " + r.max; _info_wait.setText(1,s); var p = (function(){ var p = 1.0; if(r.max) p = (r.value/r.max); if(!Number.isFinite(p)) p = 0.0; return p; })(); _info_wait.setProgress(1,p); updateInfo(); }; wait_analyze.oncomplete = function(){ DomNodeRemoveChildren(_element_info); if(wait_analyze){ wait_analyze.release(); wait_analyze = null; } updateDownloadButton(); }; updateDownloadButton(); } var event_handler = wait_analyze.event_dispatcher.createEventHandler("complete"); event_handler.setFunction(function(){ var f = optional.oncomplete; if(f) f(); }); wait_analyze.start(); } function WaitAnalize(){ this.event_dispatcher = new EventDispatcher(); } WaitAnalize.prototype = { release : function(){ this.event_dispatcher.release(); if(this.task){ this.task.release(); this.task = null; } }, start : function(){ var _this = this; if(this.started) return; this.started = true; var task = this.task = task_container.createTask(); task.setDestructorFunc(function(){ _this.task = null; }); task.setExecuteFunc(function(){ var v = execute_queue.getCountQueue(); if(_this.max < v) _this.max = v; _this.value = _this.max - v; var f = _this.onprogress; if(f) f(_this); if(_this.value >= _this.max){ _this.event_dispatcher.dispatchEvent("complete",null); var f = _this.oncomplete; if(f) f(); _this.release(); return; } }); task.execute(0xffffffff); }, started : false, task : null, value : 0, max : 0 }; // -------------------------------------------------------------------------------- // アーカイブ作成 // -------------------------------------------------------------------------------- _dlbd.archive = (function(){ var a = ArchiveCreaterState; var list = {}; list[a.LOADING] = "step:1 loading file..."; list[a.CALCULATING] = "step:2 calculating CRC32..."; list[a.WRITING] = "step:3 writing ZIP binary"; list[a.DOWNLOADING] = "step:4 save as"; list[a.DOWNLOAD_FAILURE] = ""; list[a.DOWNLOAD_SUCCESS] = "archives succeeded"; list[a.FAILED] = "archives failured"; return function (optional){ optional = optional || {}; if(archive_creator){ archive_creator.release(); archive_creator = null; } function complete(){ updateDownloadButton(); } var updateInfo = function(){ var node = _info_archive.root; if(DomNodeGetFirstElementChild(_element_info) == node) return; DomNodeRemoveChildren(_element_info); _element_info.appendChild(node); }; _info_archive.attach(0,"progress"); archive_creator = new ArchiveCreater(); item_container.getItemsEnabled().forEach(function(item){ archive_creator.attachUrlInfo(item.url_info); }); archive_creator.oncomplete = function(r){ if(r.result){ var f = optional.onsuccess; if(f) f(); }else{ var blob_url = archive_creator.blobURL; if(blob_url){ _info_archive.attach(0,"save"); var anchor = _info_archive.getAnchor(0); anchor.href = blob_url; anchor.download = archive_creator.fileName; ElementSetTextContent(anchor,"[Zip File]"); } } complete(); }; archive_creator.onerror = function(reason){ _info_archive.pause(0); _info_archive.pause(1); }; archive_creator.onprogress = function(r){ var s = r.loaded + " / " + r.total; if(r.error) s += " (error:" + r.error + ")"; _info_archive.setText(1,s); _info_archive.setProgress(0,r.progress_rate); _info_archive.setProgress(1,r.rate); updateInfo(); }; archive_creator.onstatechange = function(state){ _info_archive.setText(0,list[state]); updateInfo(); }; archive_creator.start(); updateDownloadButton(); }; })(); // -------------------------------------------------------------------------------- // ヘッダーダウンロード // -------------------------------------------------------------------------------- function downloadHeader(items){ if(!header_downloader){ var updateInfo = function(){ var node = _info_header.root; if(DomNodeGetFirstElementChild(_element_info) == node) return; DomNodeRemoveChildren(_element_info); _element_info.appendChild(node); }; header_downloader = new HeaderDownloader(); header_downloader.onprogress = function(r){ _info_header.setText(0,"loading response header..."); var s = r.loaded + " / " + r.total; if(r.error) s += " (error:" + r.error + ")"; _info_header.setText(1,s); var p = (function(){ var p = 1.0; if(r.total) p = (r.loaded/r.total); if(!Number.isFinite(p)) p = 0.0; return p; })(); _info_header.setProgress(1,p); updateInfo(); }; header_downloader.oncomplete = function(){ _info_header.setText(0,"load completed"); updateInfo(); if(header_downloader){ header_downloader.release(); header_downloader = null; } updateDownloadButton(); }; updateDownloadButton(); } items.forEach(function(item){ header_downloader.attachUrlInfo(item.url_info); }); header_downloader.start(); } // -------------------------------------------------------------------------------- // 順次ダウンロード // -------------------------------------------------------------------------------- function downloadSequential(items){ if(!sequential_downloader){ var updateInfo = function(){ var node = _info_sequential.root; if(DomNodeGetFirstElementChild(_element_info) == node) return; DomNodeRemoveChildren(_element_info); _element_info.appendChild(node); }; sequential_downloader = new SequentialDownloader(); sequential_downloader.onprogress = function(r){ _info_sequential.setText(0,"sequential downloading..."); var s = r.loaded + " / " + r.total; if(r.error) s += " (error:" + r.error + ")"; _info_sequential.setText(1,s); var p = (function(){ var p = 1.0; if(r.total) p = (r.loaded/r.total); if(!Number.isFinite(p)) p = 0.0; return p; })(); _info_sequential.setProgress(1,p); updateInfo(); }; sequential_downloader.oncomplete = function(){ _info_sequential.setText(0,"download completed"); updateInfo(); if(sequential_downloader){ sequential_downloader.release(); sequential_downloader = null; } updateDownloadButton(); }; updateDownloadButton(); } items.forEach(function(item){ sequential_downloader.attachUrlInfo(item.url_info); }); sequential_downloader.start(); } // -------------------------------------------------------------------------------- // ツールボタン // -------------------------------------------------------------------------------- var UI_ToolButton = (function(){ var f = function(parent){ var _this = this; var button = this.button = DocumentCreateElement("button"); ElementSetStyle(button,"height:30px;padding:0;position:relative;vertical-align:top;width:30px;"); parent.appendChild(button); var image = this.image = DocumentCreateElement("img"); ElementSetStyle(image,CSSTextGetInitialImageElement()); ElementAddStyle(image,"display:block;margin:0 auto;pointer-events:inherit;vertical-align:top;"); button.appendChild(image); button.addEventListener("click",function(e){ var f = _this.onclick; if(f) f(e); }); }; f.prototype = { setVisible : function(v){ this.button.style.display = (v ? "inline-block" : "none"); }, setDisabled : function(v){ this.button.disabled = v; this.button.style.opacity = (v ? 0.5 : 1.0); }, setImageURL : function(url){ this.image.src = url; }, setTooltip : function(v){ this.button.title = v; }, onclick : function(){} }; return f; })(); // -------------------------------------------------------------------------------- // ダウンロードボタン // -------------------------------------------------------------------------------- function updateDownloadButton(){ DomNodeRemoveChildren(_element_download); if((function(){ if(!archive_creator) return false; if(!archive_creator.executing) return false; return true; })()){ _element_download.appendChild(_button_archive_cancel.root); _element_download.appendChild(_button_archive_abort.root); return; } if(header_downloader){ _element_download.appendChild(_button_header_cancel.root); return; } if(sequential_downloader){ _element_download.appendChild(_button_download_cancel.root); _element_download.appendChild(_button_download_pause.root); return; } if(wait_analyze){ return; } _element_download.appendChild(_button_archive.root); _element_download.appendChild(_button_download.root); } var UI_DownloadButton = (function(){ var f = function(){ var _this = this; var button = this.root = this.button = DocumentCreateElement("button"); ElementSetStyle(button,"height:50px;padding:0;position:relative;vertical-align:top;width:200px;"); var image = this.image = DocumentCreateElement("img"); ElementSetStyle(image,CSSTextGetInitialImageElement()); ElementAddStyle(image,"bottom:0;left:0;margin:auto;opacity:0.05;position:absolute;right:0;top:0;vertical-align:top;"); button.appendChild(image); var span = this.span = DocumentCreateElement("span"); ElementAddStyle(span,"position:relative;"); button.appendChild(span); var text = this.text = DocumentCreateText(""); span.appendChild(text); button.addEventListener("click",function(e){ var f = _this.onclick; if(f) f(e); }); }; f.prototype = { setVisible : function(v){ this.button.style.display = (v ? "inline-block" : "none"); }, setDisabled : function(v){ this.button.disabled = v; this.button.style.opacity = (v ? 0.5 : 1.0); }, setText : function(v){ this.text.nodeValue = v; }, setImageURL : function(url){ this.image.src = url; }, setTooltip : function(v){ this.button.title = v; }, onclick : function(){} }; return f; })(); // -------------------------------------------------------------------------------- // 情報コンテナ // -------------------------------------------------------------------------------- var UI_Info = (function(){ var f = function(){ var root = this.root = DocumentCreateElement("div"); ElementSetStyle(root,"line-height:0;margin:auto;max-width:500px;position:relative;text-align:center;"); }; f.prototype = { attach : function(id,type){ var element; var old = this.root.childNodes[id]; if(old){ DomNodeRemove(old); } switch(type){ case "text": element = this["element" + id] = DocumentCreateElement("div"); ElementSetStyle(element,"box-sizing:border-box;font-size:16px;height:24px;line-height:1;overflow:hidden;padding:4px;position:relative;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;width:auto;"); var text = this["text" + id] = DocumentCreateText(""); element.appendChild(text); break; case "progress": element = this["element" + id] = DocumentCreateElement("div"); ElementSetStyle(element,"background-color:#fff;border:1px solid #888;box-sizing:border-box;font-size:16px;height:24px;line-height:1;overflow:hidden;padding:4px;position:relative;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;width:auto;"); this.root.appendChild(element); var progress = this["progress" + id] = DocumentCreateElement("div"); progress.className = "meter_play"; ElementSetStyle(progress,"background-color:rgba(255,0,0,0.1);bottom:0;height:24px;left:0;position:absolute;right:0;top:0;width:0;"); element.appendChild(progress); var text = this["text" + id] = DocumentCreateText(""); element.appendChild(text); break; case "save": element = this["element" + id] = DocumentCreateElement("div"); ElementSetStyle(element,"box-sizing:border-box;font-size:16px;height:24px;line-height:1;overflow:hidden;padding:4px;position:relative;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;width:auto;"); this.root.appendChild(element); var text = this["text" + id] = DocumentCreateText("Save as : "); element.appendChild(text); var anchor = this["anchor" + id] = DocumentCreateElement("a"); element.appendChild(anchor); break; } if(id == 0){ DomNode_InsertFirstChild(this.root,element); }else{ ElementAddStyle(element,"margin-top:2px;"); DomNode_InsertLastChild(this.root,element); } }, setText : function(id,v){ this["text"+id].nodeValue = v; }, setProgress : function(id,v){ var e = this["progress"+id]; var s = e.style; if(v >= 1.0){ s.backgroundColor = "rgba(0,0,255,0.1)"; e.classList.remove("meter_play"); }else{ s.backgroundColor = "rgba(255,0,0,0.1)"; e.classList.add("meter_play"); } s.width = (v * 100).toFixed(8) + "%";; }, pause : function(id){ var e = this["progress"+id]; var s = e.style; s.backgroundColor = "rgba(0,0,0,0.1)"; e.classList.remove("meter_play"); }, getAnchor : function(id,v){ return this["anchor"+id]; }, }; return f; })(); // -------------------------------------------------------------------------------- // ColumnContainer // -------------------------------------------------------------------------------- function ColumnContainer(root){ var _this = this; this._prev = this._next = this; this.root = root; this.columns = new Object(); this.columnList = new Array(); [ {name:"select",label:"Select",width:24,sort:-1}, {name:"state",label:"State",width:100,sort:-1}, {name:"icon",label:"Icon",width:24,sort:-1}, {name:"name",label:"File Name",width:200,sort:1}, {name:"ext",label:"Ext",width:50,sort:-1}, {name:"type",label:"Type",width:150,sort:-1}, {name:"status",label:"Status Code",width:50,sort:-1}, {name:"loaded",label:"Loaded",width:90,sort:-1}, {name:"total",label:"Total",width:90,sort:-1}, {name:"url",label:"URL",width:1000,sort:1}, {name:"lastModified",label:"Last Modified",width:240,sort:-1}, {name:"id",label:"Id",width:50,sort:1} ].forEach(function(param){ _this.createColumn(param); }); var DRAG_TYPE = {MOVE:1,RESIZE:2}; var drag_column_index; var drop_column_index; var resize_index; var drag_type; var drag_task; function release_drag_task(){ if(drag_task){ drag_task.release(); drag_task = null; } } function mousemove_handler(e){ var pos_x = e.clientX; var rects = (function(){ var a = new Array(); _element_list_head.childNodes.forEach(function(node){ a.push(ElementGetBoundingClientRect(node)); }); return a; })(); var i; var num = rects.length; drag_column_index = num - 1; for(i=0;i= num){ drag_type = DRAG_TYPE.RESIZE; } _element_list_head.style.cursor = (function(){ if(drag_task) return "ew-resize"; if(drag_type == DRAG_TYPE.RESIZE) return "col-resize"; return "pointer"; })(); } root.addEventListener("mousemove",mousemove_handler,true); root.addEventListener("click",function(e){ if(drag_type != DRAG_TYPE.MOVE) return; if(drag_task) return; var column = _this.columnList[drag_column_index]; if(!column) return; if(sort_type == column.name){ column.sort_order *= -1; } sort_type = column.name; column.updateSort(); }); root.addEventListener("dblclick",function(e){ if(drag_type != DRAG_TYPE.RESIZE) return; var column = _this.columnList[resize_index]; if(!column) return; var width = column.getWidthMax(); column.setWidth(width); }); root.addEventListener("dragstart",function(e){ mousemove_handler(e); if(drag_type == DRAG_TYPE.MOVE){ var column = _this.getColumnByIndex(drag_column_index); var data_transfer = e.dataTransfer; data_transfer.setData("text",column.name); }else if(drag_type == DRAG_TYPE.RESIZE){ release_drag_task(); var column = _this.getColumnByIndex(resize_index); drag_task = task_container.createTask(); drag_task.setDestructorFunc(function(){ drag_task = null; }); drag_task.setExecuteFunc(function(){ var mouse_pos = input_mouse.getPositionClient(); var rect = ElementGetBoundingClientRect(column.root); var w = mouse_pos.x - rect.left; if(w < COLUMN_WIDTH_MINIMUM) w = COLUMN_WIDTH_MINIMUM; column.width_style.style.width = (w.toFixed(8)) + "px"; if((function(){ if(!input_mouse.getButtonLeft()) return true; return false; })()){ release_drag_task(); return; } }); drag_task.execute(0xffffffff); e.preventDefault(); } }); root.addEventListener("dragover",function(e){ e.preventDefault(); }); root.addEventListener("drop",function(e){ mousemove_handler(e); try{ var data_transfer = e.dataTransfer; var name = data_transfer.getData("text"); var column = _this.getColumnByName(name); if(column){ _this.move(column.index,drop_column_index); } }catch(e){ } e.preventDefault(); }); } ColumnContainer.prototype = { release:function(){ }, createColumn:function(param){ var column = new Column(param); var index = this.columnList.length; column.index = index; var _next = this; var _prev = _next._prev; column._prev = _prev; column._next = _next; _prev._next = column; _next._prev = column; this.columnList[index] = this.columns[param.name] = column; }, move:function(p0,p1){ var a; var p; var n0,n1; var sub = p1 - p0; if(sub >= 0 && sub <= 1) return; // インデックスを更新 a = this.columnList; n0 = a[p0]; n1 = a[p1]; if(!n1) n1 = this; var _prev = n0._prev; var _next = n0._next; _prev._next = _next; _next._prev = _prev; _next = n1; _prev = _next._prev; n0._prev = _prev; n0._next = _next; _prev._next = n0; _next._prev = n0; var index = 0; var column = this._next; while(column != this){ column.index = index; a[index] = column; index += 1; column = column._next; } // カラムの入れ替え p = this.root; a = p.childNodes; n0 = a[p0]; n1 = a[p1]; if(n1){ DomNode_InsertBefore(n1,n0); }else{ DomNode_InsertLastChild(p,n0); } // 全アイテムの入れ替え var items = item_container.getItemsAll(); var i; var num = items.length; for(i=0;i 0) ? "ascend":"descend"); }, setWidth:function(w){ this.width_style.style.width = (w.toFixed(8)) + "px"; }, getWidthMax:function(){ var _this = this; switch(_this.name){ case "select": case "icon": return 24; } var width = COLUMN_WIDTH_MINIMUM; var item = item_container.next; while(item != item_container){ (function(){ if(!(item.visible)) return; var node = item.root; node = node.childNodes[_this.index]; node = node.cloneNode(true); node.className = "cell_container"; _element_list_items.appendChild(node); var rect = ElementGetBoundingClientRect(node); DomNodeRemove(node); var w = (rect.right - rect.left) + 2; if(width < w) width = w; })(); item = item.next; } return width; }, setWidthStyle:function(style){ this.width_style = style; this.setWidth(this._initial_width); delete this._initial_width; }, name:"", ext : "" }; // -------------------------------------------------------------------------------- // ItemContainer // -------------------------------------------------------------------------------- var ItemContainer = (function(){ var f = function(){ this.prev = this.next = this; this.items = new Array(); }; f.prototype = { getItemsAll : function(){ var items = new Array(); var item = this.next; while(item != this){ items.push(item); item = item.next; } return items; }, getItemsVisibled : function(){ var items = new Array(); var item = this.next; while(item != this){ if(item.visible) items.push(item); item = item.next; } return items; }, getItemsErased : function(){ var items = new Array(); var item = this.next; while(item != this){ if(item.visible){ if(item.getValue("select")) items.push(item); } item = item.next; } return items; }, getItemsEnabled : function(){ var items0 = new Array(); var items1 = new Array(); var item = this.next; while(item != this){ if(item.visible){ items0.push(item); if(item.getValue("select")) items1.push(item); } item = item.next; } if(items1.length) return items1; return items0; } }; return f; })(); // -------------------------------------------------------------------------------- // Item // -------------------------------------------------------------------------------- function Item(url_info){ var _this = this; this.url_info = url_info; this.elements = new Object(); this.textnodes = new Object(); var element_item = this.root = DocumentCreateElement("div"); element_item.className = "item"; element_item.addEventListener("dblclick",function(e){ // ダウンロード完了なら開く if(url_info.getValue("state") == DownloaderState.DOWNLOAD.COMPLETED.EXISTS){ var downloader = new Downloader(); downloader.setURL(url_info.getURL()); downloader.setAllowSameRequest(true); downloader.onstatechange = function(response){ url_info.setValue("state",response.state); }; downloader.oncomplete = function(response){ if(response.result){ }else{ url_info.setValue("reason",response.errorText); } }; downloader.start({order:"open"}); return; } // ダウンロード途中なら一時停止 if(sequential_downloader){ var downloader = sequential_downloader.getDownloader(_this.url_info); if(downloader){ downloader.pause(); return; } } // ダウンロードの開始、再開 downloadSequential([_this]); }); var columns = column_container.getColumnList(); columns.forEach(function(column){ var element_cell = _this.elements[column.name] = DocumentCreateElement("div"); element_cell.className = "cell_container width_" + (column.name); element_item.appendChild(element_cell); var element = DocumentCreateElement((function(){ switch(column.name){ case "select": return "input"; case "icon": return "img"; case "url": return "a"; default: return "div"; } })()); switch(column.name){ case "select": element.type = "checkbox"; element.className = "cell cell_" + column.name; break; case "icon": element.className = "cell cell_" + column.name; break; default: element.className = "cell cell_label cell_" + column.name; var text = _this.textnodes[column.name] = document.createTextNode(""); element.appendChild(text); break; } element_cell.appendChild(element); }); var element = DocumentCreateElement("div"); element.className = "cell cell_progress"; DomNode_InsertFirstChild(this.elements["loaded"],element); this.element_progress = element; columns.forEach(function(column){ _this.setValue(column.name,_this.getValue(column.name)); }); // 最後尾に登録してソート更新 var next = item_container; var prev = next.prev; this.next = next; this.prev = prev; next.prev = this; prev.next = this; _element_list_items.appendChild(element_item); this.updateSort(); this.updateVisible(); } Item.prototype = { release : function(){ if(this.released) return; var prev = this.prev; var next = this.next; prev.next = next; next.prev = prev; this.prev = this.next = this; this.visible = false; DomNodeRemove(this.root); delete item_container.items[this.url_info.getId()]; this.released = true; }, getValue : (function(){ var commands = { "url":function(){ return this.url_info.getURL(); }, "id":function(){ return this.url_info.getId(); } }; return function(k){ var f = commands[k]; if(f){ return f.call(this); }else{ return this.url_info.getValue(k); } }; })(), setValue : (function(){ function updateCommon(k,v){ var n = this.textnodes[k]; if(!n) return; n.nodeValue = v; } var updateState = (function(){ var list = {}; var reason = {}; var h = DownloaderState.HEADER; list[h.WAITING] = "wait..."; list[h.FAILED] = "failed"; list[h.LOADED] = "loaded"; reason[h.WAITING] = "header_waiting"; reason[h.FAILED] = "header_failed"; reason[h.LOADED] = "header_loaded"; var a = DownloaderState.ARCHIVE; list[a.WAITING] = "wait..."; list[a.FAILED] = "failed"; list[a.LOADING] = "loading.."; list[a.LOADED] = "loaded"; list[a.CALCULATING] = "calc..."; list[a.CALCULATED] = "done"; list[a.WRITING] = "writing.."; list[a.COMPLETED] = "completed"; reason[a.WAITING] = "archive_waiting"; reason[a.FAILED] = "archive_failed"; reason[a.LOADING] = "archive_loading"; reason[a.LOADED] = "archive_loaded"; reason[a.CALCULATING] = "archive_calculating"; reason[a.CALCULATED] = "archive_calculated"; reason[a.WRITING] = "archive_writing"; reason[a.COMPLETED] = "archive_completed"; var d = DownloaderState.DOWNLOAD; list[d.WAITING] = "wait..."; list[d.FAILED] = "failed"; list[d.ERASED] = "erased"; list[d.CREATING] = "creating"; list[d.LOADING] = "loading.."; list[d.PAUSING.CAN_RESUMED] = "pause"; list[d.PAUSING.CANNOT_RESUME] = "cancel"; list[d.COMPLETED.DELETED] = "deleted"; list[d.COMPLETED.UNKNOWN] = "completed"; list[d.COMPLETED.EXISTS] = "exists"; reason[d.WAITING] = "download_wait"; reason[d.FAILED] = "download_failed"; reason[d.ERASED] = "download_erased"; reason[d.CREATING] = "download_creating"; reason[d.LOADING] = "download_loading"; reason[d.PAUSING.CAN_RESUMED] = "download_pausing_can_resumed"; reason[d.PAUSING.CANNOT_RESUME] = "download_pausing_cannot_resume"; reason[d.COMPLETED.DELETED] = "download_completed_deleted"; reason[d.COMPLETED.UNKNOWN] = "download_completed_unknown"; reason[d.COMPLETED.EXISTS] = "download_completed_exists"; return function (k,v){ var n = this.textnodes[k]; if(!n) return; n.nodeValue = list[v] || v; if(!reason[v]) return; var e = this.elements["state"]; e.title = _i18n.getMessage("downloader_state_" + reason[v]); }; })(); var updateProgress = (function(){ var a = DownloaderState.ARCHIVE; var d = DownloaderState.DOWNLOAD; var isLoad = new Object(); isLoad[a.LOADING] = isLoad[d.LOADING] = true; var isCalc = new Object(); isCalc[a.CALCULATING] = true; return function(){ var e = this.element_progress; var s = e.style; var loaded = this.getValue("loaded") || 0; var total = this.getValue("total") || 0; var state = this.getValue("state") || 0; var p; if((total > 0) && Number.isFinite(total)){ p = loaded / total; if(p < 0.0) p = 0.0; if(p > 1.0) p = 1.0; }else{ p = (loaded ? 1.0 : 0.0); } s.width = (p * 100).toFixed(8) + "%"; var n = "backgroundColor"; StyleDeclarationRemoveProperty(s,n); if(isLoad[state]){ s[n] = "rgba(255,0,0,0.1)"; }else if(isCalc[state]){ s[n] = "rgba(0,255,0,0.1)"; }else if((loaded >= total) && (total > 0)){ s[n] = "rgba(0,0,255,0.1)"; }else{ s[n] = "rgba(0,0,0,0.1)"; } e.classList.remove("meter_play"); if(isLoad[state] || isCalc[state]){ e.classList.add("meter_play"); } }; })(); function updateSize(v){ if(v < 1000) return String(v); var units = ["KB","MB","GB","TB","PB","EB"]; var i; var num = units.length; for(i=0;i= num) i = num - 1; return (v).toFixed(1) + units[i]; } var commands = { "select":function(k,v){ var c = this.root.classList; if(v){ c.add("select"); }else{ c.remove("select"); } var e = this.elements[k]; e = DomNodeGetLastElementChild(e); e.checked = v; }, "state":function(k,v){ updateState.call(this,k,v); updateProgress.call(this); }, "url":function(k,v){ var e = this.elements[k]; e = DomNodeGetLastElementChild(e); var n = this.textnodes[k]; if(!n) return; var s = v.slice(0,2048); try{ s = decodeURIComponent(s); }catch(e){ } n.nodeValue = s; e.href = v; e.target = "_blank"; this.root.title = s; }, "icon":function(k,v){ var e = this.elements[k]; e = DomNodeGetLastElementChild(e); var s = e.style; if(v){ e.src = v; StyleDeclarationRemoveProperty(s,"display"); }else{ s.display = "none"; } }, "name":function(k,v){ var n = this.textnodes[k]; if(!n) return; try{ v = decodeURIComponent(v); }catch(e){ } n.nodeValue = v; }, "loaded":function(k,v){ updateCommon.call(this,k,updateSize(v)); updateProgress.call(this); }, "total":function(k,v){ updateCommon.call(this,k,updateSize(v)); updateProgress.call(this); }, "lastModified":function(k,v){ var s = ""; if(Number.isFinite(v)){ try{ s = new Date(v).toLocaleString(navigator.language,{ "hour12": false, "year": "numeric", "month": "2-digit", "day": "2-digit", "hour": "2-digit", "minute": "2-digit", "second": "2-digit", "weekday": "narrow", "timeZoneName": "short" }); }catch(e){ s = new Date(v).toISOString(); } } updateCommon.call(this,k,s); }, "reason":function(k,v){ if(!v) return; var e = this.elements["state"]; e.title += "\nReason: " + v; } }; return function(k,v){ if(Number.isFinite(v)){ v = Number(v); }else{ v = String(v || ""); } var f = commands[k]; if(f){ f.call(this,k,v); }else{ updateCommon.call(this,k,v); } }; })(), updateVisible : (function(){ function setVisible(v){ this.visible = v; if(!v){ DomNodeRemove(this.root); return; } var next = this.next; var o = item_container; while(next != o){ if(next.visible) break; next = next.next; } if(next.root){ if(DomNodeGetPreviousElementSibling(next.root) != this.root){ DomNode_InsertBefore(next.root,this.root); } }else{ if(DomNodeGetLastElementChild(_element_list_items) != this.root){ DomNode_InsertLastChild(_element_list_items,this.root); } } } var commands = new Object(); commands["all"] = function(){ setVisible.call(this,true); }; commands["image"] = commands["audio"] = commands["video"] = commands["text"] = commands["application"] = function(){ var type = this.getValue("type") || ""; var v = Boolean(type.match(new RegExp("^" + filter_type + "(/|$)","i"))); setVisible.call(this,v); }; commands["media"] = function(){ var type = this.getValue("type") || ""; var v = Boolean(type.match(new RegExp("^(image|audio|video)(/|$)","i"))); setVisible.call(this,v); }; commands["archive"] = function(){ var ext = this.getValue("ext") || ""; var v = MIMEType_is_Archive(ext); setVisible.call(this,v); }; commands["unknown"] = function(){ var type = this.getValue("type"); var v = !Boolean(type); setVisible.call(this,v); }; commands["select"] = function(){ var v = this.getValue("select"); setVisible.call(this,v); }; return function(){ var f = commands[filter_type] || commands["all"]; f.call(this); }; })(), updateSort : function(){ var column = column_container.getColumnByName(sort_type); var item = this; var prev = item.prev; var next = item.next; var c = 0; if((function(){ if(!prev.root) return false; var c = compareValue(prev.getValue(sort_type),item.getValue(sort_type)); c *= column.sort_order; return (c > 0); })()){ c = -1; }else if((function(){ if(!next.root) return false; var c = compareValue(item.getValue(sort_type),next.getValue(sort_type)); c *= column.sort_order; return (c > 0); })()){ c = 1; } var o = item_container; if(c < 0){ // 上に順番に調べる var prev = item.prev; while(prev != o){ var c = compareValue(prev.getValue(sort_type),item.getValue(sort_type)); c *= column.sort_order; if(c <= 0){ break; } prev = prev.prev; } (function(){ var prev = item.prev; var next = item.next; prev.next = next; next.prev = prev; })(); next = prev.next; next.prev = item; prev.next = item; item.prev = prev; item.next = next; }else if(c > 0){ // 下に順番に調べる var next = item.next; while(next != o){ var c = compareValue(item.getValue(sort_type),next.getValue(sort_type)); c *= column.sort_order; if(c <= 0){ break; } next = next.next; } (function(){ var prev = item.prev; var next = item.next; prev.next = next; next.prev = prev; })(); prev = next.prev; next.prev = item; prev.next = item; item.prev = prev; item.next = next; } item.updateVisible(); }, elements : {}, visible:false, released:false }; // -------------------------------------------------------------------------------- // アイテムを作成 // -------------------------------------------------------------------------------- function createItem(url_info){ var id = url_info.getId(); if(item_container.items[id]) return; var item = new Item(url_info); item_container.items[id] = item; }; // -------------------------------------------------------------------------------- // 値の比較 // -------------------------------------------------------------------------------- function compareValue(v0,v1){ if(Number.isFinite(v0) && Number.isFinite(v1)){ return v0 - v1; } var f = function(v){ if((typeof v) == "number") return String(v); return String(v||""); }; return f(v0).localeCompare(f(v1)); } // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- function initialize(){ if(_initialized) return; _initialized = true; _i18n = new InternationalMessage(project.getLanguage()); hide_scrollbar = new DocumentHideScrollbar(document); _shadow_host = DocumentCreateElement("div"); ElementSetStyle(_shadow_host,"all:initial; user-select:none;"); document.body.appendChild(_shadow_host); // シャドウルート if(_shadow_host.attachShadow){ _shadow_root = _shadow_host.attachShadow({mode:"closed"}); }else{ _shadow_root = _shadow_host; } _element_dlbd = DocumentCreateElement("div"); _element_dlbd.className = "dlbd"; _shadow_root.appendChild(_element_dlbd); _element_background = DocumentCreateElement("div"); _element_background.className = "background"; _element_background.addEventListener("click",function(){ _dlbd.setVisible(false); }); _element_dlbd.appendChild(_element_background); _element_window = DocumentCreateElement("div"); _element_window.className = "window"; _element_dlbd.appendChild(_element_window); _element_toolbar = DocumentCreateElement("div"); _element_toolbar.className = "toolbar"; _element_window.appendChild(_element_toolbar); var _element_toolbar_left = DocumentCreateElement("div"); _element_toolbar_left.style.cssText = "display:inline-block;float:left;"; _element_toolbar.appendChild(_element_toolbar_left); var _element_toolbar_right = DocumentCreateElement("div"); _element_toolbar_right.style.cssText = "display:inline-block;float:right;"; _element_toolbar.appendChild(_element_toolbar_right); _button_resize = new UI_ToolButton(_element_toolbar_right); _button_resize.onclick = function(e){ _dlbd.toggleWindow(); }; _dlbd.restoreWindow(); var button_close = new UI_ToolButton(_element_toolbar_right); button_close.setTooltip(_i18n.getMessage("download_board_button_close")); button_close.setImageURL(svg_close); button_close.onclick = function(e){ _dlbd.setVisible(false); }; var button_edit = new UI_ToolButton(_element_toolbar_left); button_edit.setTooltip(_i18n.getMessage("download_board_button_edit")); button_edit.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iMTYiCmhlaWdodD0iMTYiCnZpZXdCb3g9IjAgMCA0LjIzMzMzMyA0LjIzMzMzMyIKdmVyc2lvbj0iMS4xIgppZD0iIgp4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCnhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZGVmcwppZD0iIiAvPgo8ZwppZD0iIj4KPHBhdGgKc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC4wMztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC44MjAyMDg7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCmQ9Ik0gMC4yNjQ1ODMzMywyLjExNjY2NjcgSCAzLjk2ODc1IgppZD0iIiAvPgo8cGF0aApzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjc5Mzc1O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKZD0iTSAyLjExNjY2NjcsMC4yNjQ1ODMzMyBWIDMuOTY4NzUiCmlkPSIiIC8+CjwvZz4KPC9zdmc+"); button_edit.onclick = editItemsModal; var button_erase = new UI_ToolButton(_element_toolbar_left); button_erase.setTooltip(_i18n.getMessage("download_board_button_erase")); button_erase.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iMTYiCmhlaWdodD0iMTYiCnZpZXdCb3g9IjAgMCA0LjIzMzMzMyA0LjIzMzMzMyIKdmVyc2lvbj0iMS4xIgppZD0iIgp4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCnhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZGVmcwppZD0iIiAvPgo8ZwppZD0iIj4KPHBhdGgKc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC4wMztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC43OTM3NTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKZD0iTSAwLjI2NDU4MzMzLDIuMTE2NjY2NyBIIDMuOTY4NzUiCmlkPSIiIC8+CjwvZz4KPC9zdmc+"); button_erase.onclick = eraseItemsSelected; var button_eselect = new UI_ToolButton(_element_toolbar_left); button_eselect.setTooltip(_i18n.getMessage("download_board_button_deselect")); button_eselect.setImageURL("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2Zwp3aWR0aD0iMTYiCmhlaWdodD0iMTYiCnZpZXdCb3g9IjAgMCA0LjIzMzMzMyA0LjIzMzMzMyIKdmVyc2lvbj0iMS4xIgppZD0iIgp4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCnhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZGVmcwppZD0iIiAvPgo8ZwppZD0iIj4KPHJlY3QKc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzA0MDQwNDtzdHJva2Utd2lkdGg6MC4yMjUzMTY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgppZD0iIgp3aWR0aD0iNC4wMDgwMTgiCmhlaWdodD0iNC4wMDgwMTc1Igp4PSIwLjExMjY1NzczIgp5PSIwLjExMjY1NzczIgpyeT0iMC42MTU0MzY3OSIgLz4KPGcKaWQ9IiIKc3R5bGU9Im9wYWNpdHk6MC4yNSI+CjxwYXRoCnN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNmZjAwMDA7c3Ryb2tlLXdpZHRoOjAuNTI5MTY3O3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmQ9Ik0gMS4wNTgzMzMzLDEuMDU4MzMzMyAzLjE3NSwzLjE3NSIKaWQ9IiIgLz4KPHBhdGgKc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNmZjAwMDA7c3Ryb2tlLXdpZHRoOjAuNTI5MTY3O3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmQ9Ik0gMy4xNzUsMS4wNTgzMzMzIDEuMDU4MzMzMywzLjE3NSIKaWQ9IiIgLz4KPC9nPgo8L2c+Cjwvc3ZnPg=="); button_eselect.onclick = _dlbd.deselectItemsAll; var button_header = new UI_ToolButton(_element_toolbar_left); button_header.setTooltip(_i18n.getMessage("download_board_button_header")); button_header.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iMTYiCmhlaWdodD0iMTYiCnZpZXdCb3g9IjAgMCA0LjIzMzMzMyA0LjIzMzMzMyIKdmVyc2lvbj0iMS4xIgppZD0iIgp4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCnhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZGVmcwppZD0iIiAvPgo8ZwppZD0iIj4KPGcKaWQ9IiIKdHJhbnNmb3JtPSJtYXRyaXgoMS42OTQ2NjAzLDAsMCwxLjY5NDY2MDMsLTMuMTUxNzg1LDAuMjExMDU2NTkpIj4KPGcKaWQ9IiI+CjxwYXRoCmlkPSIiCnN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmQ9Ik0gMi4xMTY2NjY2LDAuMTMyMjkxNTYgQSAxLjk4NDM3NSwxLjk4NDM3NSAwIDAgMSA0LjEwMTA0MTYsMi4xMTY2NjY2IiAvPgo8cGF0aAppZD0iIgpzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI2NDU4MztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJNIDIuMTE2NjY2NiwwLjY2MTQ1ODI1IEEgMS40NTUyMDgzLDEuNDU1MjA4MyAwIDAgMSAzLjU3MTg3NDksMi4xMTY2NjY2IiAvPgo8cGF0aAppZD0iIgpzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI2NDU4MztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJNIDIuMTE2NjY2NiwxLjE5MDYyNDkgQSAwLjkyNjA0MTY2LDAuOTI2MDQxNjYgMCAwIDEgMy4wNDI3MDgyLDIuMTE2NjY2NiIgLz4KPHBhdGgKaWQ9IiIKc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ1ODM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKZD0ibSAyLjExNjY2NjYsMS43MTk3OTE2IGEgMC4zOTY4NzQ5OSwwLjM5Njg3NDk5IDAgMCAxIDAuMzk2ODc0OSwwLjM5Njg3NSB2IDAiIC8+CjwvZz4KPC9nPgo8L2c+Cjwvc3ZnPg=="); button_header.onclick = function(){ var items = item_container.getItemsEnabled(); downloadHeader(items); }; _element_search = DocumentCreateElement("div"); ElementAddStyle(_element_search,"border:0px #F00 solid; top:45px; left:10px; right:10px; height:30px; position:absolute;"); _element_window.appendChild(_element_search); // フィルター (function(){ _select_filter = DocumentCreateElement("select"); _select_filter.size = 1; ElementSetStyle(_select_filter,"box-sizing:border-box;font-family:inherit;font-size:16px;height:30px;vertical-align:top;"); _element_search.appendChild(_select_filter); _select_filter.addEventListener("change",function(e){ filter_type = _select_filter.value; updateFilter(); }); [ {value:"all",i18n:"download_board_select_filter",cssText:"color:#aaa;"}, {value:"all"}, {value:"image"}, {value:"audio"}, {value:"video"}, {value:"media"}, {value:"archive"}, {value:"text"}, {value:"application"}, {value:"unknown"}, {value:"select"} ].forEach(function(param){ var option = DocumentCreateElement("option"); if(param.cssText) ElementSetStyle(option,param.cssText); ElementSetTextContent(option,_i18n.getMessage(param.i18n || ("download_board_option_filter_" + param.value))); option.value = param.value; _select_filter.appendChild(option); }); })(); _element_list = DocumentCreateElement("div"); ElementAddStyle(_element_list,"border:1px #444 solid; bottom:65px; box-sizing:border-box; left:10px; position:absolute; right:10px; top:80px;"); _element_window.appendChild(_element_list); _element_list_head = DocumentCreateElement("div"); _element_list_head.className = "download_board_list_head"; _element_list.appendChild(_element_list_head); column_container = new ColumnContainer(_element_list_head); column_container.getColumnByName(sort_type).updateSort(); _element_list_body = DocumentCreateElement("div"); _element_list_body.className = "download_board_list_body"; _element_list.appendChild(_element_list_body); _element_list_items = DocumentCreateElement("div"); _element_list_items.tabIndex = 0; _element_list_items.className = "download_board_list_items"; _element_list_body.appendChild(_element_list_items); _element_list_draw = DocumentCreateElement("div"); _element_list_draw.className = "download_board_list_draw"; _element_list_body.appendChild(_element_list_draw); // アイテムの選択、ドラッグ選択 (function(){ var ITEM_HEIGHT = 24; var drag_task; var item_old = null; var item_focus = null; var element_when_mouseup; var key_event = {}; var draw = DocumentCreateElement("div"); draw.style.cssText = "position:absolute;background-color:rgba(0,0,0,0.05);"; function release_drag_task(){ if(drag_task){ drag_task.release(); drag_task = null; } } function event_get_element_item(e){ var node = e.target; while(node != e.currentTarget){ if(node.classList.contains("item")){ return node; } node = node.parentNode; } return null; } function select_item_single(y,checked){ var items_all = item_container.getItemsAll() var items_visibled = item_container.getItemsVisibled(); var index_map = (function(){ var map = new Map(); var i = 0; items_all.forEach(function(item){ map.set(item,i); i++; }); return map; })(); var index = Math.floor(y / ITEM_HEIGHT); var item_now = items_visibled[index]; if(!item_now) return; if(checked === undefined){ checked = !(item_now.getValue("select")); } // 範囲選択 if((function(){ if(!key_event.shiftKey) return false; if(!index_map.has(item_old)) return false; if(!index_map.has(item_now)) return false; var index_old = index_map.get(item_old); var index_now = index_map.get(item_now); if(index_old > index_now){ var t = index_old; index_old = index_now; index_now = t; } var a = new Array(); var i; for(i=index_old;i<=index_now;i++){ var item = items_all[i]; if(item.visible) a.push(item); } a.forEach(function(item){ item.url_info.setValue("select",checked); }); return true; })()){ // 単一選択 }else if((function(){ item_now.url_info.setValue("select",checked); return true; })()){ } item_focus = item_old = item_now; } _element_list_items.addEventListener("mouseup",function(e){ // 高精度の要素取得を試みる element_when_mouseup = event_get_element_item(e); }); _element_list_items.addEventListener("mousedown",function(e){ if(drag_task) return; if(!input_mouse.getButtonLeft()) return; var r0 = ElementGetBoundingClientRect(_element_list_body); var old_x = e.clientX; var old_y = e.clientY; old_x -= r0.left; old_x += _element_list_body.scrollLeft; old_y -= r0.top; old_y += _element_list_body.scrollTop; element_when_mouseup = null; var index_old = (function(){ var y; var element = event_get_element_item(e); if(element){ var r1 = ElementGetBoundingClientRect(element); y = (r1.bottom - r1.top) / 2 + r1.top; }else{ // 誤差あり y = e.clientY; } y -= r0.top; y += _element_list_body.scrollTop; return Math.floor(y / ITEM_HEIGHT); })(); _element_list_draw.appendChild(draw); drag_task = task_container.createTask(); drag_task.setDestructorFunc(function(){ DomNodeRemove(draw); drag_task = null; }); drag_task.setExecuteFunc(function(){ var r0 = ElementGetBoundingClientRect(_element_list_body); var pos = input_mouse.getPositionClient(); var now_x = pos.x; var now_y = pos.y; now_x -= r0.left; now_x += _element_list_body.scrollLeft; now_y -= r0.top; now_y += _element_list_body.scrollTop; var min_x = (old_x < now_x) ? old_x : now_x; var min_y = (old_y < now_y) ? old_y : now_y; var w = now_x - old_x; var h = now_y - old_y; if(w < 0) w = -w; if(h < 0) h = -h; var s = draw.style; s.left = (min_x).toFixed(8) + "px"; s.top = (min_y).toFixed(8) + "px"; s.width = (w).toFixed(8) + "px"; s.height = (h).toFixed(8) + "px"; if(!input_mouse.getButtonLeft()){ var items_visibled = item_container.getItemsVisibled(); var items_visibled_length = items_visibled.length; var index_now = (function(){ var y; if(element_when_mouseup){ var r1 = ElementGetBoundingClientRect(element_when_mouseup); y = (r1.bottom - r1.top) / 2 + r1.top; }else{ // 誤差あり y = pos.y; } var r0 = ElementGetBoundingClientRect(_element_list_body); y -= r0.top; y += _element_list_body.scrollTop; return Math.floor(y / ITEM_HEIGHT); })(); if(index_now > items_visibled_length - 1){ index_now = items_visibled_length - 1; } if(index_now < 0){ index_now = 0; } var item_now = items_visibled[index_now]; if(item_now){ var checked = !(item_now.getValue("select")); if(index_old > index_now){ var t = index_old; index_old = index_now; index_now = t; } var a = new Array(); var i; for(i=index_old;i<=index_now;i++){ var item = items_visibled[i]; if(item) a.push(item); } if(a.length == 1){ // 単一選択 select_item_single(index_now * ITEM_HEIGHT + ITEM_HEIGHT * 0.5,checked); }else{ // 範囲選択 a.forEach(function(item){ item.url_info.setValue("select",checked); }); item_focus = item_old = item_now; } } release_drag_task(); return; } }); drag_task.execute(0xffffffff); }); // チェックボックスの更新 _element_list_body.addEventListener("change",function(e){ release_drag_task(); var input = e.target; var r = ElementGetBoundingClientRect(input); var y = (r.bottom - r.top) / 2 + r.top; r = ElementGetBoundingClientRect(_element_list_body); y -= r.top; y += _element_list_body.scrollTop; select_item_single(y,input.checked); }); // 最新の装飾キーを取得 document.addEventListener("keydown",function(e){ key_event = e; },true); document.addEventListener("keyup",function(e){ key_event = e; }); // ショートカット _element_list_items.addEventListener("keydown",(function(){ var dic = new Object(); function focus_item(e,item){ var node = item.elements["select"]; node = DomNodeGetLastElementChild(node); node.focus(); item_focus = item; e.preventDefault(); } dic["ArrowUp"] = function(e){ if(!item_focus) return; var item = item_focus.prev; if(item.released) return; while(item != item_container){ if(item.visible){ focus_item(e,item); break; } item = item.prev; } }; dic["ArrowDown"] = function(e){ if(!item_focus) return; var item = item_focus.next; if(item.released) return; while(item != item_container){ if(item.visible){ focus_item(e,item); break; } item = item.next; } }; dic["Escape"] = function(e){ release_drag_task(); }; dic["Delete"] = function(e){ eraseItemsSelected(); }; dic["a"] = dic["A"] = function(e){ if(!e.ctrlKey) return; item_container.getItemsVisibled().forEach(function(item){ item.url_info.setValue("select",true); }); e.preventDefault(); }; return function(e){ var f = dic[e.key]; if(f) f(e); }; })(),true); })(); var right = (function(){ var div = DocumentCreateElement("div"); ElementSetStyle(div,"position:absolute; left:0px; top:0px; width:100px; overflow-y:scroll;"); document.body.appendChild(div); var right = div.offsetWidth - (div.clientWidth + div.clientLeft); DomNodeRemove(div); return right; })(); _element_list_head.style.right = (right) + "px"; _element_list_body.addEventListener("scroll",function(e){ _element_list_head.scrollLeft = _element_list_body.scrollLeft; },true); _element_info = DocumentCreateElement("div"); ElementAddStyle(_element_info,"height:50px; left:10px; right:230px; bottom:10px; position:absolute; box-sizing:border-box;"); _element_window.appendChild(_element_info); _element_download = DocumentCreateElement("div"); ElementAddStyle(_element_download,"display:flex; flex-wrap: nowrap;height:50px; width:200px; right:10px; bottom:10px; position:absolute; box-sizing:border-box;"); _element_window.appendChild(_element_download); _info_wait = new UI_Info(); _info_wait.attach(0,"text"); _info_wait.attach(1,"progress"); _info_header = new UI_Info(); _info_header.attach(0,"text"); _info_header.attach(1,"progress"); _info_archive = new UI_Info(); _info_archive.attach(0,"progress"); _info_archive.attach(1,"progress"); _info_sequential = new UI_Info(); _info_sequential.attach(0,"text"); _info_sequential.attach(1,"progress"); _button_archive = new UI_DownloadButton(); _button_archive.setTooltip(_i18n.getMessage("download_board_button_archive")); _button_archive.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iNTEuOTk5OTk2IgpoZWlnaHQ9IjQzIgp2aWV3Qm94PSIwIDAgMTMuNzU4MzMyIDExLjM3NzA4NCIKdmVyc2lvbj0iMS4xIgppZD0iIgp4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCnhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZGVmcwppZD0iIiAvPgo8ZwppZD0iIgp0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4zNDk5OTc2LC0xLjA1ODMzMzQpIj4KPGNpcmNsZQpzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjc2NzU0NTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgppZD0iIgpjeD0iOC40NjY2NjQzIgpjeT0iMy4xNzUwMDAyIgpyPSIyLjExNjY2NjgiIC8+CjxjaXJjbGUKc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC43Njc1NDU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKaWQ9IiIKY3g9IjE3Ljk5MTY2MyIKY3k9IjMuMTc1MDAwMiIKcj0iMi4xMTY2NjY4IiAvPgo8Y2lyY2xlCnN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuNzY3NTQ1O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmlkPSIiCmN4PSIxMy4yMjkxNjciCmN5PSIzLjE3NTAwMDIiCnI9IjIuMTE2NjY2OCIgLz4KPHBhdGgKc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC41MjkxNjc7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKZD0ibSAxMC44NDc5MTYsNS44MjA4MzM0IGggNC43NjI1MDEgViA5Ljc4OTU4NCBoIDIuOTEwNDE2IEwgMTMuMjI5MTY3LDEyLjQzNTQxNyA3LjkzNzQ5OTYsOS43ODk1ODQgaCAyLjkxMDQxNjQgeiIKaWQ9IiIgLz4KPC9nPgo8L3N2Zz4K"); _button_archive.setText("ZIP"); _button_archive.onclick = function(){ _dlbd.archive(); }; _button_download = new UI_DownloadButton(); _button_download.setTooltip(_i18n.getMessage("download_board_button_sequential")); _button_download.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iNzYiCmhlaWdodD0iNDMiCnZpZXdCb3g9IjAgMCAyMC4xMDgzMzMgMTEuMzc3MDg0Igp2ZXJzaW9uPSIxLjEiCmlkPSIiCnhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxkZWZzCmlkPSIiIC8+CjxnCmlkPSIiCnRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjE3NDk5OTUsLTEuMDU4MzMzNCkiPgo8Y2lyY2xlCnN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuNzY3NTQ1O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmlkPSIiCmN4PSI1LjgyMDgzMjciCmN5PSIzLjE3NTAwMDIiCnI9IjIuMTE2NjY2OCIgLz4KPGNpcmNsZQpzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjc2NzU0NTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgppZD0iIgpjeD0iMjAuNjM3NDk5IgpjeT0iMy4xNzUwMDAyIgpyPSIyLjExNjY2NjgiIC8+CjxjaXJjbGUKc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC43Njc1NDU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKaWQ9IiIKY3g9IjEzLjIyOTE2NyIKY3k9IjMuMTc1MDAwMiIKcj0iMi4xMTY2NjY4IiAvPgo8cGF0aApzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjUyOTE2NztzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJNIDEyLjE3MDgzMyw1LjgyMDgzMzQgSCAxNC4yODc1IFYgOS43ODk1ODQgaCAxLjU4NzUgbCAtMi42NDU4MzMsMi42NDU4MzMgLTIuNjQ1ODM0LC0yLjY0NTgzMyBoIDEuNTg3NSB6IgppZD0iIiAvPgo8cGF0aApzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjUyOTE2NztzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJtIDE5LjU3OTE2Niw1LjgyMDgzMzQgaCAyLjExNjY2NyB2IDMuOTY4NzUwNSBoIDEuNTg3NSBMIDIwLjYzNzUsMTIuNDM1NDE3IDE3Ljk5MTY2Niw5Ljc4OTU4MzkgaCAxLjU4NzUgeiIKaWQ9IiIgLz4KPHBhdGgKc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC41MjkxNjc7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKZD0iTSA0Ljc2MjQ5OTYsNS44MjA4MzM0IEggNi44NzkxNjY5IFYgOS43ODk1ODQgSCA4LjQ2NjY2NzMgTCA1LjgyMDgzNCwxMi40MzU0MTcgMy4xNzQ5OTk2LDkuNzg5NTg0IGggMS41ODc1IHoiCmlkPSIiIC8+CjwvZz4KPC9zdmc+"); _button_download.setText("DOWNLOAD"); _button_download.onclick = function(){ var items = item_container.getItemsEnabled(); downloadSequential(items); }; _button_header_cancel = new UI_DownloadButton(); _button_header_cancel.setTooltip(_i18n.getMessage("download_board_button_header_cancel")); _button_header_cancel.setImageURL(svg_cancel); _button_header_cancel.setText("CANCEL"); _button_header_cancel.onclick = function(){ header_downloader.abort(); }; _button_archive_cancel = new UI_DownloadButton(); _button_archive_cancel.setTooltip(_i18n.getMessage("download_board_button_archive_cancel")); _button_archive_cancel.setImageURL(svg_cancel); _button_archive_cancel.setText("CANCEL"); _button_archive_cancel.onclick = function(){ archive_creator.abort(); updateDownloadButton(); }; _button_archive_abort = new UI_DownloadButton(); _button_archive_abort.setTooltip(_i18n.getMessage("download_board_button_archive_skip")); _button_archive_abort.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iNjEiCmhlaWdodD0iMzYiCnZpZXdCb3g9IjAgMCAxNi4xMzk1NDkgOS41MjQ5OTkyIgp2ZXJzaW9uPSIxLjEiCmlkPSJzdmc4MzgxIgp4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCnhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZGVmcwppZD0iIiAvPgo8ZwppZD0iIgp0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNS4yOTE2NjYxLC0xLjg1MjA4MzUpIj4KPHBhdGgKc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6I2ZmMDAwMDtzdHJva2Utd2lkdGg6MS41ODc1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJtIDExLjM3NzA4MywyLjY0NTgzMzYgMy45Njg3NSwzLjk2ODc1IC0zLjk2ODc1LDMuOTY4NzQ5NCIKaWQ9IiIgLz4KPHBhdGgKc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6I2ZmMDAwMDtzdHJva2Utd2lkdGg6MS41ODc1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJtIDYuMDg1NDE2MywyLjY0NTgzMzYgMy45Njg3NTA3LDMuOTY4NzUgLTMuOTY4NzUwNywzLjk2ODc0OTQiCmlkPSIiIC8+CjxwYXRoCnN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiNmZjAwMDA7c3Ryb2tlLXdpZHRoOjEuNTg3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztzdHJva2UtZGFzaGFycmF5Om5vbmU7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKZD0ibSAxNi42Njg3NDksMi42NDU4MzM2IDMuOTY4NzUsMy45Njg3NSAtMy45Njg3NSwzLjk2ODc0OTQiCmlkPSIiIC8+CjwvZz4KPC9zdmc+"); _button_archive_abort.setText("SKIP"); _button_archive_abort.onclick = function(){ archive_creator.abortLoader(); }; _button_download_cancel = new UI_DownloadButton(); _button_download_cancel.setTooltip(_i18n.getMessage("download_board_button_sequential_cancel")); _button_download_cancel.setImageURL(svg_cancel); _button_download_cancel.setText("CANCEL"); _button_download_cancel.onclick = function(){ sequential_downloader.cancel(); }; _button_download_pause = new UI_DownloadButton(); _button_download_pause.setTooltip(_i18n.getMessage("download_board_button_sequential_pause")); _button_download_pause.setImageURL("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iMzAiCmhlaWdodD0iMzAiCnZpZXdCb3g9IjAgMCA3LjkzNzQ5NTQgNy45Mzc1MDA3Igp2ZXJzaW9uPSIxLjEiCmlkPSIiCnhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxkZWZzCmlkPSIiIC8+CjxnCmlkPSIiCnRyYW5zZm9ybT0idHJhbnNsYXRlKC05LjI2MDQxOTEsLTIuNjQ1ODMzNCkiPgo8cGF0aApzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojZmYwMDAwO3N0cm9rZS13aWR0aDoyLjY0NTgzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjE5LjM7c3Ryb2tlLWRhc2hhcnJheTpub25lO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmQ9Ik0gMTUuODc1LDIuNjQ1ODMzMyBWIDEwLjU4MzMzMyBNIDEwLjU4MzMzNCwyLjY0NTgzMzMgdiA3LjkzNzQ5OTciCmlkPSIiIC8+CjwvZz4KPC9zdmc+"); _button_download_pause.setText("PAUSE"); _button_download_pause.onclick = function(){ sequential_downloader.pause(); }; updateDownloadButton(); // スタイル var style_sheet; // Firefox で動作しない //if(_shadow_root.adoptedStyleSheets){ if(0){ style_sheet = new CSSStyleSheet(); _shadow_root.adoptedStyleSheets = [style_sheet]; }else{ _element_style = DocumentCreateElement("style"); _shadow_root.appendChild(_element_style); style_sheet = ElementGetStyleSheet(_element_style); } (function(){ var rules = CSSStyleSheetGetCSSRuleList(style_sheet); var index = 0; [ { selector:".dlbd", style:"font-family:Consolas,'Courier New',monospace;" },{ selector:".background", style:"background:rgba(0,0,0,0.3333);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2147483647;" },{ selector:".window", style:"background:#f8f8f8;border:1px #000 solid;border-radius:10px;bottom:50px;left:50px;margin:auto;max-height:800px;max-width:1000px;min-height:200px;min-width:200px;position:fixed;right:50px;top:50px;z-index:2147483647;" },{ selector:".toolbar", style:"background:#fff;border:0 red solid;height:30px;left:10px;position:absolute;right:10px;top:10px;" },{ selector:".download_board_list_head", style:"background:#888; color:#fff; cursor:pointer; display:block; font-size:0; height:24px; left:0; right:0; overflow:hidden; position:absolute; top:0; white-space:nowrap;" },{ selector:".download_board_list_body", style:"bottom:0; height:auto; left:0; overflow:scroll; position:absolute; right:0; top:24px;" },{ selector:".download_board_list_items", style:"outline:none;position:absolute;" },{ selector:".download_board_list_draw", style:"position:absolute;pointer-events:none;" },{ selector:".column", style:"background-color:#646464; background-position:right center; background-repeat:no-repeat; border-right:1px solid #ccc; box-sizing:border-box; display:inline-block; font-size:16px; height:24px; inset:0; overflow:hidden; padding-left:4px; padding-right:4px; padding-top:4px; position:relative; text-align:center; text-overflow:ellipsis; user-select:none; vertical-align:top; white-space:nowrap; line-height:1;" },{ selector:".column:hover", style:"background-color:#4281F4;" },{ selector:".ascend", style:"background-image:url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2Zwp3aWR0aD0iMTAiCmhlaWdodD0iMjAiCnZpZXdCb3g9IjAgMCAyLjY0NTgzMzIgNS4yOTE2NjY1Igp2ZXJzaW9uPSIxLjEiCmlkPSIiCnhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxkZWZzCmlkPSIiIC8+CjxnCmlkPSIiPgo8cGF0aApzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eTowLjgwNDc0OTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi42NDU4MztzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmQ9Ik0gMC41MjkxNjY2NCwyLjkxMDQxNjUgMS4zMjI5MTY2LDUuMjkxNjY2NCAyLjExNjY2NjUsMi45MTA0MTY1IFoiCmlkPSIiIC8+CjxwYXRoCmlkPSIiCnN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjAuMjtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi42NDU4MztzdHJva2UtbWl0ZXJsaW1pdDoxOS4zO3BhaW50LW9yZGVyOm1hcmtlcnMgZmlsbCBzdHJva2UiCmQ9Ik0gMC41MjkxNjY2NSwyLjM4MTI0OTcgMS4zMjI5MTY3LDAgMi4xMTY2NjY2LDIuMzgxMjQ5NyBaIiAvPgo8L2c+Cjwvc3ZnPgo=\"); padding-right:10px;" },{ selector:".descend", style:"background-image:url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2Zwp3aWR0aD0iMTAiCmhlaWdodD0iMjAiCnZpZXdCb3g9IjAgMCAyLjY0NTgzMzIgNS4yOTE2NjY1Igp2ZXJzaW9uPSIxLjEiCmlkPSIiCnhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxkZWZzCmlkPSIiIC8+CjxnCmlkPSIiPgo8cGF0aApzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eTowLjI7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNjQ1ODM7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJNIDAuNTI5MTY2NjQsMi45MTA0MTY1IDEuMzIyOTE2Niw1LjI5MTY2NjQgMi4xMTY2NjY1LDIuOTEwNDE2NSBaIgppZD0iIiAvPgo8cGF0aAppZD0iIgpzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eTowLjg7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNjQ1ODM7c3Ryb2tlLW1pdGVybGltaXQ6MTkuMztwYWludC1vcmRlcjptYXJrZXJzIGZpbGwgc3Ryb2tlIgpkPSJNIDAuNTI5MTY2NjUsMi4zODEyNDk3IDEuMzIyOTE2NywwIDIuMTE2NjY2NiwyLjM4MTI0OTcgWiIgLz4KPC9nPgo8L3N2Zz4K\"); padding-right:10px;" },{ selector:".item", style:"font-size:0; white-space:nowrap; display:table-row;" },{ selector:".item:nth-child(2n+1)", style:"background-color: rgb(255, 255, 255);" },{ selector:".item:nth-child(2n)", style:"background-color: rgb(250, 250, 250);" },{ selector:".item:hover", style:"background-color:rgba(192,255,160,1.0);" },{ selector:".select:nth-child(2n+1)", style:"background-color: rgb(225, 245, 255);" },{ selector:".select:nth-child(2n)", style:"background-color: rgb(220, 240, 250);" },{ selector:".select:hover", style:"background-color:rgba(192,255,160,1.0);" },{ selector:".cell_container", style:"border-bottom:1px solid #eee;border-right:1px solid #aaa;box-sizing:border-box;display:inline-block;font-size:16px;height:24px;line-height:1.0;margin:0;position:relative;vertical-align:top;" },{ selector:".cell", style:"bottom:0;left:0;position:relative;right:0;top:0;" },{ selector:".cell_label", style:"display:block; overflow:hidden; padding:4px; text-overflow:ellipsis; white-space:nowrap;" },{ selector:".cell_state", style:"text-align:center;" },{ selector:".cell_select", style:"width:16px;height:16px;top:4px;left:4px;margin:0;" },{ selector:".cell_icon", style:"width:16px; height:16px; top:4px; left:4px;" },{ selector:".cell_name", style:"text-align:left;" },{ selector:".cell_ext", style:"text-align:center;" },{ selector:".cell_type", style:"text-align:center;" },{ selector:".cell_status", style:"text-align:center;" },{ selector:".cell_progress", style:"bottom:1px;top:1px;width:0;position:absolute;" },{ selector:".cell_loaded", style:"text-align:right;" },{ selector:".cell_total", style:"text-align:right;" },{ selector:".cell_url", style:"text-align:left;text-decoration:initial;" },{ selector:".cell_lastModified", style:"text-align:center;" },{ selector:".cell_id", style:"text-align:center;" },{ selector:".meter_play", style:'animation:meter_play 1.0s linear infinite normal forwards running;background-image:url("data:image/svg+xml;base64,PHN2Zwp3aWR0aD0iMjQiCmhlaWdodD0iMjQiCnZpZXdCb3g9IjAgMCA2LjM0OTk5OTkgNi4zNDk5OTk5Igp2ZXJzaW9uPSIxLjEiCmlkPSJzdmczODEiCnhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxkZWZzCmlkPSIiIC8+CjxnCmlkPSIiPgo8cGF0aApzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjAzO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MztzdHJva2UtZGFzaGFycmF5Om5vbmUiCmQ9Ik0gNi4zNDk5OTk5LDMuMTc1IDMuMTc1LDAgSCAwIEwgMy4xNzUsMy4xNzUgMCw2LjM0OTk5OTkgaCAzLjE3NSB6IgppZD0iIiAvPgo8L2c+Cjwvc3ZnPg==");' },{ selector:"@keyframes meter_play", style:"0%{background-position:center left 0px;}100%{background-position:center left 24px;}" } ].forEach(function(param){ CSSStyleSheetInsertRule(style_sheet,param.selector,param.style,index); index ++; }); column_container.getColumnList().forEach(function(column){ CSSStyleSheetInsertRule(style_sheet,".width_" + (column.name) ,"width:0px;",index); column.setWidthStyle(rules[index]); index ++; }); })(); url_info_dictionary.getUrlInfoAll().forEach(function(url_info){ createItem(url_info); }); var event_handler_attach = url_info_dictionary.event_dispatcher.createEventHandler("attach"); event_handler_attach.setFunction(function(e){ var url_info = e.urlInfo; createItem(url_info); if(!download_history_monitor) return; var ditm = download_history_monitor.getIDs(url_info.url)[0]; if(!ditm) return; var item = ditm.item; url_info.setValue("state",ditm.state); url_info.setValue("icon",ditm.fileIconURL); url_info.setMimeTypeByFetch(item.mime); url_info.setValue("loaded",item.bytesReceived); url_info.setValue("total",item.totalBytes); }); var event_handler_modify = url_info_dictionary.event_dispatcher.createEventHandler("modify"); event_handler_modify.setFunction(function(e){ var id = e.urlInfo.getId(); var item = item_container.items[id]; if(!item) return; item.setValue(e.key,e.value); item.updateVisible(); if(e.key == sort_type){ item.updateSort(); } }); fade_main_window = new Fade(); fade_main_window.speed = (1/60)/0.15; fade_main_window.onattach = function(v){ setVisible(true); }; fade_main_window.onremove = function(v){ setVisible(false); }; fade_main_window.onupdate = function(v){ var a = v.toFixed(8); _element_background.style.opacity = a; _element_window.style.opacity = a; var f = (v * 4).toFixed(8); _element_background.style.backdropFilter = "blur(" + f + "px)"; }; window.addEventListener('beforeunload',function(e){ var working = (function(){ if(archive_creator){ if(archive_creator.executing) return true; } if(header_downloader) return true; if(sequential_downloader) return true; return false; })(); if(working){ var msg = "downloading... Leave?" e.returnValue = msg; return msg; } }); _dlbd.waitAnalyze(); } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _initialized = false; var _i18n; var _shadow_root; var _shadow_host; var _element_style; var _element_dlbd; var _element_background; var _element_window; var _element_toolbar; var _element_search; var _element_list; var _element_list_head; var _element_list_body; var _element_list_items; var _element_list_draw; var _element_info; var _element_download; var _select_filter; var _button_resize; var _button_archive; var _button_download; var _button_header_cancel; var _button_download_cancel; var _button_download_pause; var _button_archive_cancel; var _button_archive_abort; var _info_wait; var _info_header; var _info_archive; var _info_sequential; var filter_type = "all"; var sort_type = "id"; var resize_state; var column_container; var item_container; var fade_main_window; var hide_scrollbar; var wait_analyze; var header_downloader; var sequential_downloader; var archive_creator; var download_history_monitor; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ item_container = new ItemContainer(); })(); } // -------------------------------------------------------------------------------- // ヘッダーダウンロード管理 // -------------------------------------------------------------------------------- function HeaderDownloader(){ var _this = this; _this.release = function(){ event_dispatcher.dispatchEvent("release",null); map.clear(); }; _this.abort = function(){ event_dispatcher.dispatchEvent("abort",null); }; _this.attachUrlInfo = function(url_info){ if(url_info.isFixedMimeType()) return; if(map.has(url_info)) return; map.set(url_info,url_info); result.total += 1; if(loading){ dispatch_progress(); load(url_info); } }; _this.start = function(){ if(loading) return; loading = true; dispatch_progress(); map.forEach(function(v){ load(v); }); if(map.size <= 0){ dispatch_complete(); } }; _this.onprogress = function(){}; _this.oncomplete = function(){}; function dispatch_progress(){ var f = _this.onprogress; if(f) f(result); }; function dispatch_complete(){ var f = _this.oncomplete; if(f) f(result); }; function load(url_info){ var loader = null; var event_handler_abort = null; var event_handler_release = null; var h = DownloaderState.HEADER; url_info.setValue("state",h.WAITING); function release(){ map.delete(url_info); if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } if(loader){ loader.release(); loader = null; } } function complete(){ result.loaded += 1; dispatch_progress(); if(result.loaded >= result.total){ dispatch_complete(); } release(); } function success(){ result.success += 1; url_info.setValue("state",h.LOADED); complete(); } function failure(reason){ result.error += 1; url_info.setValue("state",h.FAILED); url_info.setValue("reason",reason); complete(); } event_handler_abort = event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(function(event){ loader.abort(); }); event_handler_release = event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(event){ release(); }); loader = new Loader(); loader.onload = function(str){ success(); }; loader.onerror = function(reason){ failure(reason); }; loader.setURL(url_info.getURL()); loader.loadResponseHeader(); }; var loading = false; var map = new Map(); var event_dispatcher = new EventDispatcher(); var result = { loaded:0, total:0, error:0, success:0 }; } // -------------------------------------------------------------------------------- // 順次ダウンロード管理 // -------------------------------------------------------------------------------- function SequentialDownloader(){ var _this = this; _this.release = function(){ event_dispatcher.dispatchEvent("release",null); map.clear(); }; _this.cancel = function(){ event_dispatcher.dispatchEvent("cancel",null); }; _this.pause = function(){ event_dispatcher.dispatchEvent("pause",null); }; _this.attachUrlInfo = function(url_info){ if(map.has(url_info)) return; var item = {url_info:url_info}; map.set(url_info,item); result.total += 1; if(loading){ dispatch_progress(); load(item); } }; _this.getDownloader = function(url_info){ var item = map.get(url_info); if(!item) return null; return item.downloader; }; _this.start = function(){ if(loading) return; loading = true; dispatch_progress(); map.forEach(function(v){ load(v); }); if(map.size <= 0){ dispatch_complete(); } }; _this.onprogress = function(){}; _this.oncomplete = function(){}; function dispatch_progress(){ var f = _this.onprogress; if(f) f(result); }; function dispatch_complete(){ var f = _this.oncomplete; if(f) f(result); }; function load(item){ var url_info = item.url_info; var downloader = null; var event_handler_cancel = null; var event_handler_pause = null; var event_handler_release = null; var h = DownloaderState.DOWNLOAD; url_info.setValue("state",h.WAITING); function release(){ map.delete(url_info); if(event_handler_cancel){ event_handler_cancel.release(); event_handler_cancel = null; } if(event_handler_pause){ event_handler_pause.release(); event_handler_pause = null; } if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } if(downloader){ downloader.release(); item.downloader = downloader = null; } } function complete(){ result.loaded += 1; dispatch_progress(); if(result.loaded >= result.total){ dispatch_complete(); } release(); } function success(){ result.success += 1; complete(); } function failure(reason){ result.error += 1; url_info.setValue("reason",reason); complete(); } event_handler_cancel = event_dispatcher.createEventHandler("cancel"); event_handler_cancel.setFunction(function(event){ downloader.cancel(); }); event_handler_pause = event_dispatcher.createEventHandler("pause"); event_handler_pause.setFunction(function(event){ downloader.pause(); }); event_handler_release = event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(event){ release(); }); item.downloader = downloader = new Downloader(); downloader.setURL(url_info.getURL()); downloader.setSaveAs(false); downloader.setSilent(false); downloader.setAllowSameRequest(true); downloader.onprogress = function(response){ var loaded = response.bytesLoaded; var total = response.bytesTotal; url_info.setValue("loaded",loaded); url_info.setValue("total",total); }; downloader.onstatechange = function(response){ url_info.setValue("state",response.state); }; downloader.oncomplete = function(response){ if(response.result){ success(); }else{ failure(response.errorText); } }; downloader.start(); }; var loading = false; var map = new Map(); var event_dispatcher = new EventDispatcher(); var result = { loaded:0, total:0, error:0, success:0 }; } // -------------------------------------------------------------------------------- // 一括ダウンロードしてZIPを作成 // -------------------------------------------------------------------------------- var ArchiveCreaterState = { LOADING : 0, CALCULATING : 1, WRITING : 2, DOWNLOADING : 3, DOWNLOAD_FAILURE : 5, DOWNLOAD_SUCCESS : 6, WAITING : 8, FAILED : 7 }; var ArchiveCreater = (function(){ var Item = function(parent){ this.parent = parent; }; Item.prototype = { release : function(){ if(this.released) return; this.released = true; this.dispose(); }, abort : function(){ this.abortLoader(); if(this.file_reader){ this.file_reader.abort(); this.file_reader = null; } }, abortLoader : function(){ if(this.loader){ this.loader.abort(); this.loader = null; } }, dispose : function(){ if(this.loader){ this.loader.release(); this.loader = null; } delete this.blobFile; delete this.blobFilename; delete this.blobLocalFileHeader; delete this.blobCentralDirectoryHeader; }, setUrlInfo : function(url_info){ this.url_info = url_info; }, setState : function(state){ this.state = state; this.url_info.setValue("state",state); var f = this.onstatechange; if(f) f(state); }, loadFile : function(callback){ var _this = this; var p = this.parent; var a = DownloaderState.ARCHIVE; _this.setState(a.WAITING); function complete(){ _this.loader = null; callback(); } function success(xhr){ if(p.released) return; _this.blobFile = xhr.response; _this.setState(a.LOADED); complete(); } function failure(reason){ if(p.released) return; _this.failed = true; p.progress.error++; _this.setState(a.FAILED); _this.url_info.setValue("reason",reason); complete(); } var loader = this.loader = new Loader(); loader.onload = success; loader.onerror = failure; loader.onprogress = function(r){ if(p.released) return; _this.url_info.setValue("loaded",r.bytesLoaded); _this.url_info.setValue("total",r.bytesTotal); _this.setState(a.LOADING); }; loader.setResponseType("blob"); loader.setURL(this.url_info.url); loader.load(); }, calculate : function(callback){ var _this = this; var p = this.parent; var a = DownloaderState.ARCHIVE; _this.setState(a.CALCULATING); function complete(){ _this.file_reader = null; callback(); } function success(hash){ _this.crc32 = hash; _this.setState(a.CALCULATED); complete(); } function failure(reason){ _this.failed = true; p.progress.error++; _this.setState(a.FAILED); complete(); } var blob = this.blobFile; if(!blob){ failure(""); return; } var crc32 = new CRC32(); var pos = 0; var read_size = 1024 * 1024 * 1; var total = blob.size; var f = function (){ var file_reader = _this.file_reader = new FileReader(); file_reader.onloadend = function(){ if(p.released) return; if(file_reader.error){ failure(file_reader.error); return; } var hash = crc32.getFromArrayBuffer(file_reader.result); pos += read_size; if(pos > total) pos = total; _this.url_info.setValue("loaded",pos); if(pos < total){ f(); return; } success(hash); }; file_reader.readAsArrayBuffer(blob.slice(pos,pos+read_size)); }; f(); }, filename : function(callback){ var _this = this; var p = this.parent; var a = DownloaderState.ARCHIVE; this.setState(a.WRITING); function complete(){ callback(); } function success(blob){ if(p.released) return; _this.blobFilename = blob; callback(); } function failure(reason){ if(p.released) return; _this.failed = true; p.progress.error++; _this.setState(a.FAILED); callback(); } function determine_filename(url){ var optional = { ext:_this.url_info.getValue("ext"), type:"archive" }; var file_name_obj = ProjectDownloadSaveFile_Determining({url:url},optional); if(file_name_obj.error){ failure(file_name_obj.error); return; } try{ var blob = new Blob([file_name_obj.filename],{type:"text/plain"}); success(blob); }catch(e){ failure(e.message); } } var data_parser = DataURL_Parser(this.url_info.getURL()); if(data_parser){ // 短いアドレスを生成 var short_url = new ShortURLCreater(); short_url.onsuccess = function(){ if(p.released) return; determine_filename(short_url.shortURL); }; short_url.onerror = failure; short_url.setUrlInfo(_this.url_info); short_url.setBlob(_this.blobFile); short_url.start(); return; } determine_filename(this.url_info.getURL()); }, localFileHeader : function(callback){ var file_size = this.blobFile.size; var name_size = this.blobFilename.size; var is64 = this.is64; var extra_size = (is64 ? 20 : 0); var a = new Array(); // Local file header var data_view = new DataView(new ArrayBuffer(30)); var p = 0; var e = true; // シグネチャ data_view.setUint32(p, 0x04034b50, e); p += 4; // バージョン data_view.setUint16(p, (is64 ? 45 : 10), e); p += 2; // オプション (UTF-8) data_view.setUint16(p, this.option, e); p += 2; // 圧縮アルゴリズム data_view.setUint16(p, 0, e); p += 2; // タイムスタンプ(時刻) data_view.setUint16(p, this.msdostime.time, e); p += 2; // タイムスタンプ(日付) data_view.setUint16(p, this.msdostime.date, e); p += 2; // CRC32 data_view.setUint32(p, this.crc32, e); p += 4; // ファイルサイズ data_view.setUint32(p, (is64 ? 0xFFFFFFFF : file_size), e); p += 4; // 圧縮サイズ data_view.setUint32(p, (is64 ? 0xFFFFFFFF : file_size), e); p += 4; // ファイル名のサイズ data_view.setUint16(p, name_size, e); p += 2; // 拡張フィールドサイズ data_view.setUint16(p, extra_size, e); p += 2; a.push(data_view); // ファイル名 (UTF-8) a.push(this.blobFilename); if(is64){ // ZIP64 Extended Information Extra Field var data_view = new DataView(new ArrayBuffer(extra_size)); var p = 0; var e = true; // 拡張フィールドタイプ data_view.setUint16(p, 1, e); p += 2; // このブロックのサイズ-4 data_view.setUint16(p, extra_size - 4, e); p += 2; // ファイルサイズ DataView_setUint64(data_view, p, file_size, e); p += 8; // 圧縮サイズ DataView_setUint64(data_view, p, file_size, e); p += 8; a.push(data_view); } try{ this.blobLocalFileHeader = new Blob(a); }catch(e){ this.setState(DownloaderState.ARCHIVE.FAILED); } callback(); }, centralDirectoryHeader : function(callback){ var file_size = this.blobFile.size; var name_size = this.blobFilename.size; var is64 = this.is64; var extra_size = (is64 ? 28 : 0); var comment_size = 0; var a = new Array(); // Central directory header var data_view = new DataView(new ArrayBuffer(46)); var p = 0; var e = true; // シグネチャ data_view.setUint32(p, 0x02014b50, e); p += 4; // バージョン data_view.setUint16(p, (is64 ? 31 : 10), e); p += 2; // 解凍に必要な最小バージョン data_view.setUint16(p, (is64 ? 45 : 0), e); p += 2; // オプション (UTF-8) data_view.setUint16(p, this.option, e); p += 2; // 圧縮アルゴリズム data_view.setUint16(p, 0, e); p += 2; // タイムスタンプ(時刻) data_view.setUint16(p, this.msdostime.time, e); p += 2; // タイムスタンプ(日付) data_view.setUint16(p, this.msdostime.date, e); p += 2; // CRC32 data_view.setUint32(p, this.crc32, e); p += 4; // ファイルサイズ data_view.setUint32(p, (is64 ? 0xffffffff : file_size), e); p += 4; // 圧縮サイズ data_view.setUint32(p, (is64 ? 0xffffffff : file_size), e); p += 4; // ファイル名のサイズ data_view.setUint16(p, name_size, e); p += 2; // 拡張フィールドサイズ data_view.setUint16(p, extra_size, e); p += 2; // コメントサイズ data_view.setUint16(p, comment_size, e); p += 2; // ファイルヘッダのディスク位置 data_view.setUint16(p, 0, e); p += 2; // 内部ファイル属性 data_view.setUint16(p, 0, e); p += 2; // 外部ファイル属性 data_view.setUint32(p, 0, e); p += 4; // Local file header 開始オフセット(先頭から) data_view.setUint32(p, (is64 ? 0xffffffff : this.offset), e); p += 4; a.push(data_view); // ファイル名 (UTF-8) a.push(this.blobFilename); if(is64){ // ZIP64 Extended Information Extra Field var data_view = new DataView(new ArrayBuffer(extra_size)); var p = 0; var e = true; // 拡張フィールドタイプ data_view.setUint16(p, 1, e); p += 2; // このブロックのサイズ-4 data_view.setUint16(p, extra_size - 4, e); p += 2; // ファイルサイズ DataView_setUint64(data_view, p, file_size, e); p += 8; // 圧縮サイズ DataView_setUint64(data_view, p, file_size, e); p += 8; // 開始オフセット DataView_setUint64(data_view, p, this.offset, e); p += 8; a.push(data_view); } try{ this.blobCentralDirectoryHeader = new Blob(a); this.setState(DownloaderState.ARCHIVE.COMPLETED); }catch(e){ this.setState(DownloaderState.ARCHIVE.FAILED); } callback(); }, onstatechange : function(){}, released : false, state : 0, loader : null, file_reader : null, blobFile : null, blobFilename : null, blobLocalFileHeader : null, blobCentralDirectoryHeader : null, crc32 : null, offset : 0, option : 0x0800, msdostime : { data: 0, time: 0 }, is64 : false, failed : false }; var ItemExecuter = (function(){ var ItemExecuter = function(parent){ this.parent = parent; }; ItemExecuter.prototype = { release : function(){ this.released = true; }, onprogress : function(){}, oncomplete : function(){}, forEach : function(callback){ var _this = this; var items = get_items.call(this); this.max = items.length; dispatch.call(this,"progress"); execute_queue.attachLastForInterrupt(function f(){ if(_this.released) return; if(_this.pos >= _this.max){ dispatch.call(_this,"complete"); return; } callback(items[_this.pos],function(){ if(_this.released) return; _this.pos ++; dispatch.call(_this,"progress"); execute_queue.attachFirst(f,null); }); },null); }, allSettled : function(callback){ var _this = this; var items = get_items.call(this); this.max = items.length; dispatch.call(this,"progress"); this.pos = 0; var i; var num = _this.max; if(num == 0){ dispatch.call(_this,"complete"); return; } for(i=0;i= _this.max){ dispatch.call(_this,"complete"); } }); } }, pos : 0, max : 0, error : 0 }; function get_items(){ var p = this.parent; var a = new Array(); var items = p.items; var i; var num = items.length; for(i=0;i 0xffffffff) return true; if(o.max > 0xffff) return true; return false; })()){ is64 = true; } callback(); }; o.onprogress = function(){ var p = _this.progress; p.loaded = o.pos; p.total = o.max; p.rate = (function(){ if(!o.max) return 1.0; return (o.pos / o.max); })(); p.progress_rate = (3/5) + p.rate * (1/5); dispatch_progress.call(_this); }; o.forEach(function(item,callback){ var file_size = item.blobFile.size; var name_size = item.blobFilename.size; item.offset = offset; if((function(){ if(file_size > 0xffffffff) return true; if(item.offset > 0xffffffff) return true; return false; })()){ item.is64 = true; } var extra_size1 = (item.is64 ? 20 : 0); var extra_size2 = (item.is64 ? 28 : 0); var comment_size = 0; var header1_size = (30 + name_size + extra_size1) + file_size; var header2_size = (46 + name_size + extra_size2 + comment_size); offset += header1_size; cdfh_size += header2_size; // MS-DOS time format var time = item.url_info.getValue("lastModified"); if(Number.isFinite(time)){ var date = new Date(time); item.msdostime = { time : ((date.getHours() & 0x1f) << 11) | ((date.getMinutes() & 0x3f) << 5) | (Math.round(date.getSeconds() / 2) & 0x1f), date : (((date.getFullYear() - 1980) & 0x7f) << 9) | (((date.getMonth() + 1) & 0x0f) << 5) | ( date.getDate() & 0x1f) }; } callback(); }); }); // Local file header 生成 this.exec_methods.push(function(callback){ var o = _this.item_executer = new ItemExecuter(_this); o.oncomplete = function(){ callback(); }; o.forEach(function(item,callback){ item.localFileHeader(callback); }); }); // Central directory header 生成 this.exec_methods.push(function(callback){ var o = _this.item_executer = new ItemExecuter(_this); o.oncomplete = function(){ callback(); }; o.forEach(function(item,callback){ item.centralDirectoryHeader(callback); }); }); // End of Central Directory 生成 this.exec_methods.push(function(callback){ var ary0 = new Array(); var ary1 = new Array(); var ary2 = new Array(); var o = _this.item_executer = new ItemExecuter(_this); o.oncomplete = function(){ var file_num = o.max; if(is64){ // Zip64 End of Central Directory record var data_view = new DataView(new ArrayBuffer(56)); var p = 0; var e = true; // シグネチャ data_view.setUint32(p, 0x06064b50, e); p += 4; // このレコードのサイズ-12 DataView_setUint64(data_view, p, 56 - 12, e); p += 8; // バージョン data_view.setUint16(p, 31, e); p += 2; // 解凍に必要な最小バージョン data_view.setUint16(p, 45, e); p += 2; // このディスクの番号 data_view.setUint32(p, 0, e); p += 4; // 中央ディレクトリが開始するディスク data_view.setUint32(p, 0, e); p += 4; // このディスク上のファイル総数 DataView_setUint64(data_view, p, file_num, e); p += 8; // ファイル総数 DataView_setUint64(data_view, p, file_num, e); p += 8; // Central directory 総サイズ DataView_setUint64(data_view, p, cdfh_size, e); p += 8; // File header 開始オフセット DataView_setUint64(data_view, p, cdfh_pos, e); p += 8; ary2.push(data_view); // Zip64 End of Central Directory locator var data_view = new DataView(new ArrayBuffer(20)); var p = 0; var e = true; // シグネチャ data_view.setUint32(p, 0x07064b50, e); p += 4; // EOCD64 が始まるディスク番号 data_view.setUint32(p, 0, e); p += 4; // EOCD64 のオフセット DataView_setUint64(data_view, p, eocd_pos, e); p += 8; // ディスクの総数 data_view.setUint32(p, 1, e); p += 4; ary2.push(data_view); } // End of central dir record var data_view = new DataView(new ArrayBuffer(22)); var p = 0; var e = true; // シグネチャ data_view.setUint32(p, 0x06054b50, e); p += 4; // 同ディスク位置 data_view.setUint16(p, 0, e); p += 2; // ファイル開始ディスク位置 data_view.setUint16(p, 0, e); p += 2; // 同ディスク内ファイル総数 data_view.setUint16(p, file_num, e); p += 2; // ファイル総数 data_view.setUint16(p, file_num, e); p += 2; // Central directory 総サイズ data_view.setUint32(p, (is64 ? 0xFFFFFFFF : cdfh_size), e); p += 4; // File header 開始オフセット data_view.setUint32(p, (is64 ? 0xFFFFFFFF : cdfh_pos), e); p += 4; // コメントサイズ data_view.setUint16(p, 0, e); p += 2; ary2.push(data_view); try{ var lofh = new Blob(ary0); var cdfh = new Blob(ary1); var eocd = new Blob(ary2); _this.blob = new Blob([lofh,cdfh,eocd],{type:"application/zip"}); lofh = cdfh = eocd = ary0 = ary1 = ary2 = null; callback(); }catch(e){ _this.executing = false; dispatch_statechange.call(_this,ArchiveCreaterState.FAILED); dispatch_error.call(_this,e.message); } }; o.forEach(function(item,callback){ ary0.push(item.blobLocalFileHeader); ary0.push(item.blobFile); ary1.push(item.blobCentralDirectoryHeader); item.dispose(); callback(); }); }); // ダウンロード開始 this.exec_methods.push(function(callback){ function complete(response){ _this.executing = false; _this.progress.progress_rate = 1.0; dispatch_progress.call(_this); if(response.result){ dispatch_statechange.call(_this,ArchiveCreaterState.DOWNLOAD_SUCCESS); }else{ if(_this.blob){ _this.blobURL = BlobURLCreate(_this.blob); } dispatch_statechange.call(_this,ArchiveCreaterState.DOWNLOAD_FAILURE); } dispatch_complete.call(_this,response); } if(!_this.fileName){ _this.fileName = "PageExpand_" + (new Date()).getTime() + ".zip"; } dispatch_statechange.call(_this,ArchiveCreaterState.DOWNLOADING); if((function(){ // Firefox は BlobURL のバックグラウンド送信コストが重すぎるので使用しない if(UserAgentGetFirefox()) return false; return true; })()){ var downloader = _this.downloader = new Downloader(); downloader.onprogress = function(r){ var p = _this.progress; var rate = (function(){ if(!r.bytesTotal) return 1.0; return (r.bytesLoaded / r.bytesTotal); })(); p.progress_rate = (4/5) + rate * (1/5); dispatch_progress.call(_this); }; downloader.oncomplete = complete; downloader.setFile(_this.blob); downloader.setFileName(_this.fileName); downloader.setSaveAs(true); downloader.setSilent(false); downloader.setAllowSameRequest(true); downloader.start(); }else{ complete({result:false}); } }); }, onprogress : function(){}, onstatechange : function(){}, oncomplete : function(){}, onerror : function(){}, released : false, executing : false, state : ArchiveCreaterState.WAITING, blobURL : null, fileName : "", downloader : null, item_executer : null }; function dispatch_progress(){ var f = this.onprogress; if(f) f(this.progress); } function dispatch_statechange(state){ this.state = state; var f = this.onstatechange; if(f) f(state); } function dispatch_complete(e){ var f = this.oncomplete; if(f) f(e); } function dispatch_error(reason){ var f = this.onerror; if(f) f(reason); } return ArchiveCreater; })(); // -------------------------------------------------------------------------------- // ステート定数に変換する // -------------------------------------------------------------------------------- function DownloadItem_get_DownloaderState(item){ var d = DownloaderState.DOWNLOAD; if(item.state == "complete"){ if(item.exists){ return d.COMPLETED.EXISTS; }else{ return d.COMPLETED.DELETED; } } // レジュームは state paused に依存しない if(item.canResume){ return d.PAUSING.CAN_RESUMED; }else{ if(item.paused){ return d.PAUSING.CANNOT_RESUME; } } if(item.state == "in_progress"){ return d.LOADING; } return d.FAILED; } // -------------------------------------------------------------------------------- // ステータス値を取得 // -------------------------------------------------------------------------------- var DownloadItem_get_status = (function(){ var list = new Object(); list["SERVER_BAD_CONTENT"] = 404; list["SERVER_FORBIDDEN"] = 403; list["SERVER_UNAUTHORIZED"] = 402; list["SERVER_FAILED"] = 400; return function (item){ if(item.state == "interrupted"){ var status = list[item.error]; if(status !== undefined){ return status; }else{ return 0; } } return 200; } })(); // -------------------------------------------------------------------------------- // Firefox 仕様を Chrome に統一する // -------------------------------------------------------------------------------- var DownloadItem_consolidate = (function(){ return function (item){ if(item.totalBytes < 0) item.totalBytes = 0; if(item.state == "complete") item.bytesReceived = item.totalBytes; } })(); // -------------------------------------------------------------------------------- // 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; } var analyzed = (function(){ var node_info = node_info_dictionary.getNodeInfo(node); if(!node_info) return false; return node_info.getAnalyzed(); })(); if(analyzed) 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; } // Content Editable if(node.isContentEditable){ 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(!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; var list = new Array(); // -------------------------------------------------------------------------------- // 要素からアドレスを取得 // -------------------------------------------------------------------------------- switch(tag_name){ case "AUDIO": list.push({url:element.src,type:"audio"}); break; case "VIDEO": list.push({url:element.src,type:"video"}); break; case "IFRAME": case "EMBED": case "OBJECT": list.push({url:element.src}); break; case "A": list.push({url:element.href}); break; } // -------------------------------------------------------------------------------- // IMG 要素 // -------------------------------------------------------------------------------- if(tag_name == "IMG"){ var parser = SrcSet_Parser(element); var i; var num = parser.length; for(i=0;i 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 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(); } // コールバック関数を実行 var request = { element:element, url:url, content_type:content_type, is_overridden_url:AnalyzeWorkGetOverrodeUrl(work) }; project.executeScriptAllowPopupImage(request,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); } // コールバック関数を実行 var request = { element:element, url:url, content_type:content_type, is_overridden_url:AnalyzeWorkGetOverrodeUrl(work) }; project.executeScriptAllowInlineSound(request,response_allow); } // -------------------------------------------------------------------------------- // インライン AudioElement // -------------------------------------------------------------------------------- function ElementExpandInlineAudioElement(param){ var work = param.work; var modify = param.modify; var element = AnalyzeWorkGetDomNode(work); var url = AnalyzeWorkGetExpandUrl(work); url = project.fixURL_PassiveContent(url); 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 audio = null; var audio_analyze_work = null; var audio_url = url; var url_info = url_info_dictionary.addURL(audio_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){ url_info.removeAlone("sound"); 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(url_info.getAlone("sound")){ audio_url = null; releaseAudioElement(); complete(); return; } // アドレスを登録 url_info.attachAlone("sound"); } // イベントハンドラを作成 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(audio_url)); // オーディオエレメントのリムーブ監視 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= 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= 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(); } // -------------------------------------------------------------------------------- // インラインフレームの展開 // -------------------------------------------------------------------------------- function ElementExpandInlineIframe(param){ var work = param.work; var modify = param.modify; var element = AnalyzeWorkGetDomNode(work); var url = AnalyzeWorkGetExpandUrl(work); url = project.fixURL_ActiveContent(url); 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 iframe = null; var iframe_analyze_work = null; var iframe_url = url; var url_info = url_info_dictionary.addURL(iframe_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){ url_info.removeAlone("iframe"); 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(url_info.getAlone("iframe")){ iframe_url = null; releaseIframe(); complete(); return; } // アドレスを登録 url_info.attachAlone("iframe"); } // イベントハンドラを作成 event_handler = event_dispatcher.createEventHandler("release"); event_handler.setFunction(releaseIframe); // テキストの読み込み loader = new Loader(); loader.onload = function(headers){ complete(); // インラインフレームを生成 iframe = DocumentCreateElement("iframe"); iframe.frameBorder = "0"; iframe.src = iframe_url; // スタイルをセット ElementSetStyle(iframe,project.getStyleSheetExpandIframeInline(iframe_url)); // 解析ワーク作成 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.loadResponseHeader(); } // コールバック関数を実行 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 thumbnail_url = project.fixURL_PassiveContent(element.src); // ポップアップイメージ var loader = new Loader(); loader.setURL(thumbnail_url); loader.onload = function(image){ 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(thumbnail_url); 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); }; loader.loadImage(); }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 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(); StyleDeclarationRemoveProperty(_element_current.style,"will-change"); 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; var _image_dragger; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (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); // 解析済み var node_info = node_info_dictionary.addNode(_element_current); node_info.setAnalyzed(true); // 解析ワーク作成 _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(); }); // ドラッガー _image_dragger = new ImageDragger(_image); })(); } // -------------------------------------------------------------------------------- // ポップアップイメージコンテナ // -------------------------------------------------------------------------------- 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){ popup_image = popup_image || _this; var list = popup_image._prev; if(list == popup_image) return null; if(list == _this) return null; return list; }; // -------------------------------------------------------------------------------- // 1つ後のポップアップイメージを取得 // -------------------------------------------------------------------------------- _this.getNext = function(popup_image){ popup_image = popup_image || _this; 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"; if(_hide_scrollbar){ _hide_scrollbar.release(); _hide_scrollbar = null; } }; // -------------------------------------------------------------------------------- // 開放 1(内部用) // -------------------------------------------------------------------------------- function release_1 (){ removeImage(); DomNodeRemove(_element_viewer); DomNodeRemove(_shadow_host); 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(); } // スクロールを無効化 if(MouseEventGetChangedButtons(e) & 0x04){ if(e.preventDefault){ e.preventDefault(); }else{ return false; } } } // -------------------------------------------------------------------------------- // マウスダウンイベント(内部用) // -------------------------------------------------------------------------------- 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 = 2; 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 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 getPopupImageSize(){ if(_popup_image){ var image = _popup_image.getImage(); return ImageGetNaturalSize(image); } return {width:128,height:128}; } // -------------------------------------------------------------------------------- // 画像更新(内部用) // -------------------------------------------------------------------------------- function updateImage(){ 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 image_size = getPopupImageSize(); var style = _element_image.style; style.width = (image_size.width) + "px"; style.height = (image_size.height) + "px"; if(_popup_image){ var image = _popup_image.getImage(); _element_image.src = image.src; } // 解析済み var node_info = node_info_dictionary.addNode(_element_image); node_info.setAnalyzed(true); // 解析ワーク作成 _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_size = getPopupImageSize(); 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 * _image_zoom; var background_h = (client_h * 2) + actual_h * _image_zoom; _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 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 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(); } if(_popup_image){ setMessage((popup_image_container.getIndex(_popup_image) + 1) + " / " + popup_image_container.getCount()); }else{ setMessage("none"); } } // -------------------------------------------------------------------------------- // スケールモード移動(内部用) // -------------------------------------------------------------------------------- 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 _shadow_host; 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 _hide_scrollbar; 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; _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; // スクロールバーを非表示 _hide_scrollbar = new DocumentHideScrollbar(document_root); _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(){ if(!_popup_image) return; setMessage("Wait..."); var image = _popup_image.getImage(); var downloader = new Downloader(); downloader.setURL(_popup_image.getOriginalURL()); downloader.setSaveAs(false); downloader.setSilent(false); downloader.setAllowSameRequest(true); downloader.onprogress = function(response){ var percent = 0.0; var loaded = response.bytesLoaded; var total = response.bytesTotal; if(total) percent = Math.floor(loaded / total * 100); setMessage("Loading... " + percent + "% " + loaded + "Byte"); }; downloader.oncomplete = function(response){ if(response.result){ setMessage("Download success"); }else{ setMessage("Download failure ( " + response.error + " )"); } }; 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(); if(!_popup_image) return; 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); _shadow_host = DocumentCreateElement("div"); _element_root.appendChild(_shadow_host); var shadow_root; if(_shadow_host.attachShadow){ shadow_root = _shadow_host.attachShadow({mode:"closed"}); }else{ shadow_root = _shadow_host; } shadow_root.appendChild(_element_viewer); addEvent(); _element_transform = DocumentCreateElement("div"); ElementSetStyle(_element_transform,CSSTextGetInitialDivElement()); ElementAddStyle(_element_transform,"cursor:inherit;"); _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; opacity:0.25; 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; opacity:0.25; 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; opacity:0.25; 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(); (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= 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; // -------------------------------------------------------------------------------- // イメージドラッガー // -------------------------------------------------------------------------------- function ImageDragger(image){ var _this = this; // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _this.release = function(){ removeEvent(); releaseImageDropper(); }; // -------------------------------------------------------------------------------- // 元のアドレスをセット // -------------------------------------------------------------------------------- _this.setOriginalURL = function(url){ _original_url = url; }; // -------------------------------------------------------------------------------- // ドラッグ開始 // -------------------------------------------------------------------------------- function releaseImageDropper(e){ if(dropper){ dropper.release(); dropper = null; } if(time_handle !== null){ clearTimeout(time_handle); time_handle = null; } } // -------------------------------------------------------------------------------- // ドラッグ開始 // -------------------------------------------------------------------------------- function dragStart(e){ input_mouse.setMouseEvent(e); releaseImageDropper(); if(_original_url){ try{ var data_transfer = e.dataTransfer; data_transfer.setData("url" , _original_url); data_transfer.setData("text" , _original_url); }catch(e){ } } time_handle = setTimeout(function(){ time_handle = null; dropper = new ImageDropper(); },1); } // -------------------------------------------------------------------------------- // ドラッグ終了 // -------------------------------------------------------------------------------- function dragEnd(e){ if(e.dataTransfer.dropEffect == "none"){ releaseImageDropper(); } } // -------------------------------------------------------------------------------- // イベントを追加(内部用) // -------------------------------------------------------------------------------- function addEvent(){ removeEvent(); if(image.addEventListener){ image.addEventListener("dragstart",dragStart,false); image.addEventListener("dragend",dragEnd,false); }else if(image.attachEvent){ image.attachEvent("ondragstart",mouseMove); image.attachEvent("ondragend",dragEnd); } } // -------------------------------------------------------------------------------- // イベントを破棄(内部用) // -------------------------------------------------------------------------------- function removeEvent(){ if(image.removeEventListener){ image.removeEventListener("dragstart",dragStart,false); image.removeEventListener("dragend",dragEnd,false); }else if(image.detachEvent){ image.detachEvent("ondragstart",dragStart); image.detachEvent("ondragend",dragEnd); } } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var dropper = null; var time_handle = null; var _original_url = null; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ addEvent(); })(); } // -------------------------------------------------------------------------------- // イメージドロッパー // -------------------------------------------------------------------------------- function ImageDropper(){ var _this = this; // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _this.release = function(){ release_0(); release_1(); }; // -------------------------------------------------------------------------------- // 自殺(内部用) // -------------------------------------------------------------------------------- function suicide(){ release_0(); (function(){ var task = task_container.createTask(); task.setDestructorFunc(function(){ task = null; }); task.setExecuteFunc(function(){ _fade_alpha -= 0.2; if(_fade_alpha < 0.0){ _fade_alpha = 0.0; task.release(); release_1(); return; } _window.style.opacity = _fade_alpha; }); task.execute(0xffffffff); })(); } // -------------------------------------------------------------------------------- // 開放 0(内部用) // -------------------------------------------------------------------------------- function release_0 (){ removeEvent(); if(_event_handler_release){ _event_handler_release.release(); _event_handler_release = null; } // マウスイベント無効化 _window.style.pointerEvents = "none"; if(_parent_task){ _parent_task.releaseChild(); } }; // -------------------------------------------------------------------------------- // 開放 1(内部用) // -------------------------------------------------------------------------------- function release_1 (){ DomNodeRemove(_shadow_host); // リムーブ監視を破棄 if(_observer_remove){ _observer_remove.release(); _observer_remove = null; } // 解析辞書除外 if(_analyze_work_shadow_host){ analyze_work_dictionary.removeAnalyzeWork(_analyze_work_shadow_host); _analyze_work_shadow_host = null; } // タスク破棄 if(_parent_task){ _parent_task.releaseChild(); _parent_task.release(); _parent_task = null; } }; // -------------------------------------------------------------------------------- // イベントを追加(内部用) // -------------------------------------------------------------------------------- function addEvent(){ removeEvent(); if(_droperea_download.addEventListener){ _droperea_download.addEventListener("dragenter",dragEnter,false); _droperea_download.addEventListener("dragleave",dragLeave,false); _droperea_download.addEventListener("dragover",dragOver,false); _droperea_download.addEventListener("drop",dropDownload,false); }else if(_droperea_download.attachEvent){ _droperea_download.attachEvent("ondragenter",dragEnter); _droperea_download.attachEvent("ondragleave",dragLeave); _droperea_download.attachEvent("ondragover",dragOver); _droperea_download.attachEvent("ondrop",dropDownload); } } // -------------------------------------------------------------------------------- // イベントを破棄(内部用) // -------------------------------------------------------------------------------- function removeEvent(){ if(_droperea_download.removeEventListener){ _droperea_download.removeEventListener("dragenter",dragEnter,false); _droperea_download.removeEventListener("dragleave",dragLeave,false); _droperea_download.removeEventListener("dragover",dragOver,false); _droperea_download.removeEventListener("drop",dropDownload,false); }else if(_droperea_download.detachEvent){ _droperea_download.detachEvent("ondragenter",dragEnter); _droperea_download.detachEvent("ondragleave",dragLeave); _droperea_download.detachEvent("ondragover",dragOver); _droperea_download.detachEvent("ondrop",dropDownload); } } // -------------------------------------------------------------------------------- // ドラッグイベント(内部用) // -------------------------------------------------------------------------------- function dragOver(e){ dragEnter(e); if(e.preventDefault){ e.preventDefault(); }else{ return false; } } function dragEnter(e){ enterDropArea(e.currentTarget); } function dragLeave(e){ leaveDropArea(e.currentTarget); } function enterDropArea(element){ var style = element.style; style.backgroundImage = "linear-gradient(to top, #f0f4ff, #c8cff0)"; style.boxShadow = "0px 0px 6px #6070d0"; } function leaveDropArea(element){ var style = element.style; style.backgroundImage = "linear-gradient(to bottom, #f8f8f8, #e8e8e8)"; style.boxShadow = "0px 0px 2px #808080"; } // -------------------------------------------------------------------------------- // ドロップイベント(内部用) // -------------------------------------------------------------------------------- function dropDownload(e){ dragLeave(e); var url = e.dataTransfer.getData("url"); var ui_progress = new UI_Progress(_svg_download); var downloader = new Downloader(); downloader.setURL(url); downloader.setSaveAs(false); downloader.setSilent(false); downloader.setAllowSameRequest(true); downloader.onprogress = function(response){ var percent = 0.0; var loaded = response.bytesLoaded; var total = response.bytesTotal; if(total) percent = loaded / total; ui_progress.setValue(percent); _droperea_download.title = "Loading... " + Math.floor(percent * 100) + "% " + loaded + "Byte"; }; downloader.oncomplete = function(response){ var path = document.createElementNS("http://www.w3.org/2000/svg", "path"); DomNode_InsertLastChild(_svg_download , path); if(response.error){ path.setAttribute( "fill" , "rgba(255,128,128,0.75)" ); path.setAttribute( "d" , "M78,16.099c-0.174,0.404-0.346,0.75-0.519,1.037c-0.174,0.289-0.376,0.599-0.607,0.908" + "c-3.543,4.736-7.181,9.417-10.564,13.982c-3.384,4.565-9.663,11.308-9.786,13.975c-0.041,0.892,1.771,3.257,2.723,4.927" + "c0.95,1.669,1.967,3.428,3.047,5.271c1.081,1.844,2.24,3.786,3.479,5.832c1.237,2.046,2.641,4.252,4.017,6.57" + "c0.35,0.589,0.655,1.195,0.929,1.771c0.274,0.576,0.469,1.138,0.584,1.685c-0.397-0.225-0.595-0.337-0.992-0.562" + "c0.173,0.57,0.257,0.855,0.43,1.426c-0.346,0.035-0.519,0.053-0.864,0.088c0.207,0.847,0.312,1.271,0.519,2.118" + "c-0.951-0.778-1.425-1.167-2.375-1.945c0.276,1.176,0.415,1.763,0.691,2.938c-0.536-0.294-0.805-0.442-1.341-0.736" + "c-0.241,0.813-0.361,1.219-0.603,2.031c-0.984-0.985-1.479-1.477-2.463-2.462c0.207,1.072,0.311,1.608,0.518,2.681" + "c-0.535-0.501-0.804-0.755-1.34-1.256c-0.104,0.207-0.157,0.313-0.261,0.52c-0.276-0.312-0.415-0.466-0.691-0.777" + "c-0.035,0.415-0.049,0.622-0.084,1.037c-0.489-0.49-0.886-0.914-1.188-1.275c-0.302-0.36-0.584-0.763-0.845-1.189" + "c-1.913-3.129-3.823-6.202-5.595-9.184c-1.771-2.982-5.085-8.793-5.121-8.794c-0.361-0.007-2.664,4.35-3.931,6.481" + "c-1.268,2.133-2.544,4.338-3.825,6.613c-1.282,2.276-2.592,4.676-3.932,7.196c-1.338,2.521-2.758,5.265-4.256,8.23" + "c-0.116,0.23-0.222,0.444-0.323,0.646c-0.102,0.201-0.239,0.427-0.413,0.672c-0.172,0.244-0.382,0.502-0.626,0.775" + "c-0.244,0.272-0.555,0.6-0.929,0.974c-0.138-0.622-0.207-0.933-0.345-1.555c-0.881,0.881-1.322,1.321-2.204,2.202" + "c0.276-1.382,0.496-2.075,0.772-3.457C28.579,86.444,28,86.921,27,87.871c0-0.674,0-1.01,0-1.684" + "c-1,0.432-1.455,0.646-2.371,1.078c0.536-1.244,0.763-1.865,1.299-3.109c-0.985,0.743-1.498,1.113-2.482,1.856" + "c0.242-0.812,0.352-1.217,0.594-2.029c-0.536,0.104-0.81,0.155-1.345,0.259c0.501-1.02,0.75-1.528,1.251-2.548" + "c-0.777,0.483-1.167,0.727-1.944,1.21c0.085-0.345,0.194-0.706,0.323-1.08c0.129-0.375,0.335-0.756,0.54-1.123" + "c3.2-5.729,6.356-12.1,9.828-17.891s10.755-14.004,10.911-17.156c0.104-2.084-4.027-7.568-5.942-11.296" + "c-1.915-3.728-3.904-7.594-5.768-11.519c-0.175-0.368-0.339-0.755-0.497-1.144c-0.159-0.389-0.28-0.742-0.367-1.06" + "c0.45,0.104,0.674,0.155,1.124,0.259c-0.311-0.882-0.468-1.323-0.779-2.204c0.536,0.035,0.804,0.052,1.34,0.087" + "c-0.069-0.898-0.104-1.348-0.174-2.246c1.02,0.933,1.532,1.399,2.552,2.333c-0.432-1.487-0.626-2.229-1.058-3.716" + "C34.812,15.702,35,15.978,36,16.531c0-0.778,0-1.167,0-1.944c1,0.968,1.429,1.452,2.396,2.42" + "c-0.259-0.933-0.398-1.401-0.658-2.334c0.709,0.64,1.057,0.959,1.765,1.599c0.259-0.519,0.387-0.777,0.646-1.296" + "c0.432,0.577,0.784,1.109,1.057,1.599c0.273,0.49,0.627,1.075,0.971,1.728c1.632,3.105,3.076,6.26,4.473,9.012" + "c1.397,2.752,4.033,8.012,4.083,8.016c1.278,0.091,10.41-14.775,15.943-21.78c0.385-0.487,0.822-0.943,1.255-1.36" + "c0.432-0.417,0.964-0.756,1.598-1.016c-0.121,0.449-0.182,0.674-0.303,1.123c0.674-0.501,1.013-0.751,1.688-1.252" + "c-0.208,1.002-0.313,1.504-0.521,2.506c1.21-0.916,1.814-1.375,3.024-2.29c0.035,0.777,0.054,1.167,0.089,1.944" + "c0.951-0.328,1.426-0.493,2.377-0.821c-0.605,1.175-0.907,1.764-1.513,2.938c1.072-0.743,1.606-1.115,2.679-1.858" + "c-0.259,0.743-0.39,1.115-0.648,1.858c0.501-0.293,0.753-0.441,1.254-0.735c-0.501,0.899-0.753,1.348-1.254,2.247" + "C77.04,16.54,77.36,16.393,78,16.099z" ); _droperea_download.title = "Download failure ( " + response.error + " )"; }else{ path.setAttribute( "fill" , "rgba(96,255,96,0.75)" ); path.setAttribute( "d" , "M18.882,60.969c-0.601-0.636-1.068-1.181-1.386-1.635c-0.318-0.454-0.478-0.892-0.478-1.315" + "c0-0.545,0.266-1.093,0.795-1.638c0.53-0.545,1.211-1.029,2.045-1.453c0.832-0.424,1.74-0.767,2.725-1.024" + "c0.983-0.257,1.931-0.384,2.84-0.384c0.969,0,1.764,0.127,2.384,0.384c0.62,0.257,1.22,0.691,1.795,1.297" + "c2.332,2.453,4.444,4.959,6.336,7.518c1.893,2.56,5.564,7.927,5.564,7.927c0.546-0.063,3.572-9.229,5.45-13.604" + "c1.877-4.376,3.869-8.66,5.974-12.854c2.104-4.194,4.361-8.331,6.77-12.403c2.407-4.072,5.063-8.175,7.836-12.285" + "c1.031-1.529,2.551-2.681,4.564-3.407S76.691,15,79.841,15c0.938,0,1.694,0.136,2.27,0.408s0.865,0.637,0.865,1.091" + "c0,0.394-0.091,0.787-0.272,1.181s-0.461,0.85-0.818,1.363c-6.759,9.716-13.279,19.88-18.76,30.161" + "c-5.623,10.548-10.722,22.024-14.673,33.254c-0.288,0.817-0.939,1.481-2,1.906C45.393,84.788,43.834,85,41.774,85" + "c-0.969,0-1.786-0.03-2.451-0.091c-0.667-0.062-1.228-0.175-1.682-0.341c-0.454-0.166-0.834-0.371-1.136-0.613" + "c-0.304-0.242-0.558-0.552-0.771-0.908c-1.26-2.109-2.566-4.097-3.793-5.93c-1.227-1.831-2.5-3.612-3.816-5.338" + "c-1.317-1.726-2.725-3.467-4.224-5.223S20.729,62.922,18.882,60.969z" ); _droperea_download.title = "Download success"; } (function(){ var time = 60 * 3; var task = task_container.createTask(); task.setDestructorFunc(function(){ task = null; }); task.setExecuteFunc(function(){ time -= 1; if(time < 0){ suicide(); task.release(); return; } }); task.execute(0xffffffff); })(); }; downloader.start({order:"new"}); if(e.preventDefault){ e.preventDefault(); }else{ return false; } } // -------------------------------------------------------------------------------- // ブログレス(内部用) // -------------------------------------------------------------------------------- function UI_Progress(svg){ var _this = this; // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _this.release = function(){ DomNodeRemove(_path); }; // -------------------------------------------------------------------------------- // 値をセット // -------------------------------------------------------------------------------- _this.setValue = function(value){ update(value); }; // -------------------------------------------------------------------------------- // 更新(内部用) // -------------------------------------------------------------------------------- function update(v){ var px = 50; var py = 50; var r = 48; var deg1 = (-90); var deg3 = deg1 + (360 * v); var deg2 = (deg3 - deg1) * 0.5 + deg1; var rad1 = deg1 * Math.PI / 180; var rad2 = deg2 * Math.PI / 180; var rad3 = deg3 * Math.PI / 180; var x1 = Math.cos(rad1) * r + px; var y1 = Math.sin(rad1) * r + py; var x2 = Math.cos(rad2) * r + px; var y2 = Math.sin(rad2) * r + py; var x3 = Math.cos(rad3) * r + px; var y3 = Math.sin(rad3) * r + py; var cmd = new Array(); cmd.push("M"); cmd.push(px); cmd.push(py); cmd.push("L"); cmd.push(x1); cmd.push(y1); cmd.push("A"); cmd.push(r); cmd.push(r); cmd.push(deg1); cmd.push(0); cmd.push(1); cmd.push(x2); cmd.push(y2); cmd.push("A"); cmd.push(r); cmd.push(r); cmd.push(deg2); cmd.push(0); cmd.push(1); cmd.push(x3); cmd.push(y3); cmd.push("Z"); _path.setAttribute( "d" , cmd.join(" ") ); } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _path; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _path = document.createElementNS("http://www.w3.org/2000/svg", "path"); DomNode_InsertFirstChild(svg , _path); _path.setAttribute( "fill" , "rgba(0,128,255,0.1)" ); })(); } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _shadow_host; var _window; var _droperea_download; var _svg_download; var _parent_task; var _fade_alpha; var _observer_remove; var _analyze_work_shadow_host; var _event_handler_release; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _shadow_host = DocumentCreateElement("div"); // リムーブ監視 _observer_remove = new DomNodeObserverRemoveFromDocument(_shadow_host); _observer_remove.setFunction(_this.release); // 解析ワーク作成 _analyze_work_shadow_host = AnalyzeWorkCreate(_shadow_host); // 解析済み AnalyzeWorkSetInvalid(_analyze_work_shadow_host); // 解析辞書登録オプション var attach_options = new AnalyzeWorkDictionaryAttachOptions(); attach_options.SetOutsider(); analyze_work_dictionary.attachAnalyzeWork(_analyze_work_shadow_host,attach_options); document.body.appendChild(_shadow_host); var shadow_root; if(_shadow_host.attachShadow){ shadow_root = _shadow_host.attachShadow({mode:"closed"}); }else{ shadow_root = _shadow_host; } _window = DocumentCreateElement("div"); ElementSetStyle(_window,CSSTextGetInitialDivElement()); ElementAddStyle(_window,"background:#fcfcfc; color:#000; font-size:14px; line-height:1; position:fixed; padding:15px; z-index:2147483646; border-radius:10px; box-shadow:0px 0px 5px #c0c0c0; pointer-events:inherit;"); shadow_root.appendChild(_window); var style_droperea = "margin:0px; padding:0px; background:#ffc; font-size:12px; font-weight:bold; text-align:center; width:100px; height:100px; display:inline-block; pointer-events:inherit; border-radius:10px; overflow:hidden;"; _droperea_download = document.createElement("div"); ElementAddStyle(_droperea_download,style_droperea); enterDropArea(_droperea_download); _window.appendChild(_droperea_download); _svg_download = document.createElementNS("http://www.w3.org/2000/svg","svg"); _svg_download.innerHTML = ''; _droperea_download.appendChild(_svg_download); addEvent(); var client_rect = ElementGetBoundingClientRect(_window); var mouse_pos = input_mouse.getPositionClient(); var w = client_rect.right - client_rect.left; var h = client_rect.bottom - client_rect.top; var x = mouse_pos.x - w * 0.5; var y = mouse_pos.y - h * 0.5; var offset = window_manager.getPositionFromRoot(); x -= offset.x; y -= offset.y; var style = _window.style; style.left = (x) + "px"; style.top = (y) + "px"; // 親タスク _parent_task = task_container.createTask(); _parent_task.setDestructorFunc(function(){ _parent_task = null; }); (function(){ // フェードインタスク _fade_alpha = 0.0; var task = task_container.createTask(_parent_task); task.setDestructorFunc(function(){ task = null; }); task.setExecuteFunc(function(){ _fade_alpha += 0.2; if(_fade_alpha > 1.0){ _fade_alpha = 1.0; task.release(); } _window.style.opacity = _fade_alpha; }); task.execute(0xffffffff); })(); (function(){ var task = task_container.createTask(_parent_task); task.setDestructorFunc(function(){ task = null; }); task.setExecuteFunc(function(){ var mouse_pos = input_mouse.getPositionClient(); var offset = window_manager.getPositionFromRoot(); mouse_pos.x -= offset.x; mouse_pos.y -= offset.y; if(!ElementHitTestPosition(_window,mouse_pos,true)){ task.release(); suicide(); } }); task.execute(0xffffffff); })(); // 開放イベント _event_handler_release = page_expand_event_dispatcher.createEventHandler("release"); _event_handler_release.setFunction(function(){ _this.release(); }); })(); } // -------------------------------------------------------------------------------- // メディアプレイヤー拡張 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((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); DomNodeRemove(_shadow_host); }; // -------------------------------------------------------------------------------- // 幅を変更 // -------------------------------------------------------------------------------- _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 _shadow_host; 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(){ _shadow_host = DocumentCreateElement("div"); parent.appendChild(_shadow_host); if(_shadow_host.attachShadow){ parent = _shadow_host.attachShadow({mode:"closed"}); }else{ parent = _shadow_host; } 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; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- if(!(language)) language = ""; language = language.toLowerCase(); if(!(_dictionary)){ _dictionary = InternationalMessage.locales[language]; } if(!(_dictionary)){ var m = language.match(new RegExp("[^-]+"),""); if(m) _dictionary = InternationalMessage.locales[m[0]]; } if(!(_dictionary)){ _dictionary = InternationalMessage.locales["en"]; } } // -------------------------------------------------------------------------------- // ロケールデータ // -------------------------------------------------------------------------------- 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_load_cache_for_media: { message: "キャッシュモード(メディア用)" }, menu_setting_download_load_cache_for_media_hint: { message: "通常は変更の必要はありません。fetch API を経由し、かつメディア系の読み込み時に作用します。" }, menu_setting_expand_image_load_cache_for_media_combo_box_item_default: { message: "デフォルトの最適な動作" }, menu_setting_expand_image_load_cache_for_media_combo_box_item_no_store: { message: "キャッシュを使用せず、必ずリクエストする" }, menu_setting_expand_image_load_cache_for_media_combo_box_item_force_cache: { message: "キャッシュが残ってる限り、二度とリクエストしない(一生古いデータのまま)" }, menu_setting_download_download: { message: "ダウンロード設定" }, menu_setting_download_download_thread_max: { message: "最大同時ダウンロード数" }, menu_setting_download_download_save_file: { message: "保存先の設定" }, menu_setting_download_download_save_file_combo_box_item_simple: { message: "簡易設定" }, menu_setting_download_download_save_file_combo_box_item_detail: { message: "詳細設定" }, menu_setting_download_download_save_file_simple: { message: "保存先を選択" }, menu_setting_download_download_save_file_detail: { message: "保存先を編集" }, menu_setting_download_download_save_file_variable: { 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_download_batch_download: { 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_mixed_passive_content_container: { message: "Mixed Passive Content のセキュリティ" }, menu_setting_urlmap_mixed_passive_content_unsafe: { message: "http:// のままリクエスト" }, menu_setting_urlmap_mixed_passive_content_safe: { message: "https:// に変換してリクエスト(失敗なら表示しない)" }, menu_setting_urlmap_mixed_passive_content_hint: { message: "画像や動画などのコンテンツが赤枠付きで表示されている場合、暗号化されておらず、信頼性が低く、中間者攻撃で改ざん可能であることを意味します。" }, menu_setting_urlmap_mixed_active_content_container: { message: "Mixed Active Content のセキュリティ" }, menu_setting_urlmap_mixed_active_content_unsafe: { message: "http:// のままリクエスト" }, menu_setting_urlmap_mixed_active_content_safe: { message: "https:// に変換してリクエスト(失敗なら表示しない)" }, menu_setting_urlmap_mixed_active_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_size: { message: "サムネイルの表示サイズ" }, menu_setting_expand_image_thumbnail_size_min: { message: "最小許容限界(ピクセル値)" }, menu_setting_expand_image_thumbnail_size_scale: { message: "基本拡大率(パーセント)" }, menu_setting_expand_image_thumbnail_size_max: { 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_blob_url: { message: "Blob URL に変換(すべて)" }, menu_setting_expand_image_load_decode: { message: "イメージのデコード設定" }, menu_setting_expand_image_load_decode_combo_box_item_auto: { message: "表示される瞬間から開始" }, menu_setting_expand_image_load_decode_combo_box_item_pre_decode: { message: "すべて事前にデコードする" }, 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_element_src_type: { message: "ソースタイプ" }, menu_setting_expand_sound_inline_element_src_type_combo_box_item_url: { message: "URL 形式 (ストリーミング再生)" }, menu_setting_expand_sound_inline_element_src_type_combo_box_item_blob_url: { message: "Blob URL に変換(すべて読み込む)" }, 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_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_size: { message: "ビデオの表示サイズ" }, menu_setting_expand_video_inline_width_max: { message: "幅の最大許容限界(ピクセル値)" }, menu_setting_expand_video_inline_height_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_element_src_type: { message: "ソースタイプ" }, menu_setting_expand_video_inline_element_src_type_combo_box_item_url: { message: "URL 形式 (ストリーミング再生)" }, menu_setting_expand_video_inline_element_src_type_combo_box_item_blob_url: { message: "Blob URL に変換(すべて読み込む)" }, 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_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_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_text_element_inline_unsafe: { 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_inline_unsafe: { message: "イメージのサムネイル表示(混在コンテンツ)" }, menu_setting_style_sheet_expand_image_element_popup: { message: "イメージのポップアップ表示" }, menu_setting_style_sheet_expand_image_element_popup_unsafe: { 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_element_inline_audio_unsafe: { message: "オーディオのインライン表示(混在コンテンツ)" }, menu_setting_style_sheet_expand_sound_soundcloud: { message: "soundcloud.com の設定" }, 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_element_inline_video_unsafe: { 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_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_iframe: { message: "インラインフレーム展開のスタイル" }, menu_setting_style_sheet_expand_iframe_element: { message: "HTMLIFrameElement の設定" }, menu_setting_style_sheet_expand_iframe_element_inline: { message: "インラインフレームのインライン表示" }, menu_setting_style_sheet_expand_iframe_element_inline_unsafe: { 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_credit_info_translator: { 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_script_obj_editer_edit_script: { message: "スクリプトを編集する" }, menu_script_obj_editer_delete_script: { message: "スクリプトを削除する(デフォルトに戻す)" }, menu_scriptarea_hint: { message: "配列に格納して匿名関数を記述します。信頼の無い人物が作成したスクリプトを、絶対に書き込まないで下さい。悪意のあるスクリプトが含まれる恐れがあります。" }, menu_scriptarea_unsupport: { 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_pageexpand_open_image_viewer: { message: "イメージビューワを開く" }, context_menu_pageexpand_open_download_board_application: { message: "ダウンロードボードを開く(アプリ)" }, context_menu_pageexpand_open_download_board_inline: { message: "ダウンロードボードを開く" }, context_menu_batch_download_media: { message: "一括ダウンロード(メディア)" }, context_menu_pageexpand_open_bbs_board: { message: "掲示板ボードを開く" }, context_menu_pageexpand_open_bbs_board_run_confirm: { 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_start: { message: "PageExpand の開始" }, context_menu_pageexpand_execute_fastest: { message: "PageExpand の最速実行" }, context_menu_pageexpand_abort: { message: "PageExpand の中止" }, context_menu_pageexpand_debug: { message: "PageExpand デバッグ" }, download_board_button_edit: { message: "ダウンロードURLを一括で編集します。\nアイテムのインポート/エクスポートとしても機能します。" }, download_board_button_erase: { message: "選択中のアイテムをリストから除外します。" }, download_board_button_deselect: { message: "すべてのアイテムを非選択状態にします。" }, download_board_button_restore: { message: "ウィンドウのサイズを元に戻します" }, download_board_button_maximum: { message: "ウィンドウのサイズを最大化します" }, download_board_button_close: { message: "ダウンロードボードを非表示にします。\nダウンロード作業は続行されます。\n終了するにはこのページを閉じるか、右下の中止ボタンを押します。" }, download_board_button_header: { message: "不足している情報をサーバーに問い合わせます。\n拡張子が無いアドレスのコンテンツタイプを知りたい場合に使用します。\n必ずしも正しい情報が得られるとは限りません。" }, download_board_button_header_cancel: { message: "すべてのロードを中止します。" }, download_board_button_archive: { message: "選択中のアイテムを一括でダウンロードして、1つのZIPファイルを生成します。" }, download_board_button_archive_cancel: { message: "すべての作業を中止します。" }, download_board_button_archive_skip: { message: "ロードを中止します。\nダウンロードが完了しているファイルだけを使って、ZIPファイルを生成を試みます。" }, download_board_button_sequential: { message: "選択中のアイテムを順次ダウンロードします。" }, download_board_button_sequential_cancel: { message: "すべてのダウンロードを中止します。" }, download_board_button_sequential_pause: { message: "すべてのダウンロードを一時停止します。(APIが対応していない場合は中止)\n一時停止のアイテムが多すぎると、ダウンロードのスタックが発生することに注意して下さい。\nスタックを解決するには一時停止中のダウンロードアイテムを手動で編集して数を減らします。\nスタックが貯まりすぎて手に負えなくなった場合は、ブラウザを再起動して下さい。" }, download_board_select_filter: { message: "ファイルの種類を選択..." }, download_board_option_filter_all: { message: "すべて" }, download_board_option_filter_image: { message: "画像" }, download_board_option_filter_audio: { message: "音楽" }, download_board_option_filter_video: { message: "動画" }, download_board_option_filter_media: { message: "メディア" }, download_board_option_filter_archive: { message: "書庫" }, download_board_option_filter_text: { message: "テキスト" }, download_board_option_filter_application: { message: "アプリ" }, download_board_option_filter_unknown: { message: "不明" }, download_board_option_filter_select: { message: "選択中のファイル" }, downloader_state_header_waiting: { message: "順番待ちです。\n他のロードが終わるのを待っています。" }, downloader_state_header_failed: { message: "HEAD method request は失敗しました。" }, downloader_state_header_loaded: { message: "HEAD method request は成功しました。" }, downloader_state_archive_waiting: { message: "順番待ちです。\n他のロードが終わるのを待っています。" }, downloader_state_archive_failed: { message: "失敗しました。このアイテムはアーカイブから除外されます。" }, downloader_state_archive_loading: { message: "ロード中です。" }, downloader_state_archive_loaded: { message: "ロードが完了しました。" }, downloader_state_archive_calculating: { message: "ハッシュの計算中です。" }, downloader_state_archive_calculated: { message: "ハッシュの計算が完了しました。" }, downloader_state_archive_writing: { message: "アーカイブを出力しています。" }, downloader_state_archive_completed: { message: "このアイテムの工程は終了しました。" }, downloader_state_download_wait: { message: "順番待ちです。\n他のダウンロードが終わるのを待っています。" }, downloader_state_download_failed: { message: "ダウンロードが失敗しました。" }, downloader_state_download_erased: { message: "履歴が消去されました。" }, downloader_state_download_creating: { message: "ダウンロードを発注しました。ブラウザが開始するのを待っています。\nこの状態のまま固まっている場合、ダウンロードのスタックが発生している可能性があります。\nスタックを解消するには、ブラウザのダウンロードマネージャーを開いて直接編集します。\n手に負えなくなった場合はブラウザを再起動して下さい。" }, downloader_state_download_loading: { message: "ダウンロード中です。\nアイテムをダブルクリックすると一時停止します。(APIが未対応なら中止)" }, downloader_state_download_pausing_can_resumed: { message: "ダウンロードが一時停止されています。ダウンロードを開始すると途中から再開されます。\nこのアイテムをダブルクリックすると、ダウンロードが再開されます。" }, downloader_state_download_pausing_cannot_resume: { message: "ダウンロードが一時停止されていますが、再開することは不可能です。" }, downloader_state_download_completed_deleted: { message: "ダウンロードしたファイルは、移動もしくは削除されました。" }, downloader_state_download_completed_unknown: { message: "HTML5ベースのダウンロード処理を行いました。\n進捗を取得する方法が無いため成功したかは不明です。\n連続してダウンロードを行うには、「サイトの権限」から「自動ダウンロード」の許可が必要です。" }, downloader_state_download_completed_exists: { message: "ダウンロードが完了し、ファイルが現存しています。\nこのアイテムをダブルクリックすると、フォルダを開きます。" } }, 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_load_cache_for_media: { message: "Cache MODE (for Media)" }, menu_setting_download_load_cache_for_media_hint: { message: "Normally, you do not need to change. Use \"fetch API\" and works when \"loading media\"." }, menu_setting_expand_image_load_cache_for_media_combo_box_item_default: { message: "default (best)" }, menu_setting_expand_image_load_cache_for_media_combo_box_item_no_store: { message: "don't use cache." }, menu_setting_expand_image_load_cache_for_media_combo_box_item_force_cache: { message: "If cache exists, don't request. (forever old data)" }, menu_setting_download_download: { message: "Download Setting" }, menu_setting_download_download_thread_max: { message: "Maximum number of simultaneous downloads" }, menu_setting_download_download_save_file: { message: "Save File Name" }, menu_setting_download_download_save_file_combo_box_item_simple: { message: "simple" }, menu_setting_download_download_save_file_combo_box_item_detail: { message: "detail" }, menu_setting_download_download_save_file_simple: { message: "Select File Name" }, menu_setting_download_download_save_file_detail: { message: "Edit File Name" }, menu_setting_download_download_save_file_variable: { message: "Variable List" }, 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_download_batch_download: { message: "Batch Download Setting" }, 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_mixed_passive_content_container: { message: "Mixed Passive Content Security" }, menu_setting_urlmap_mixed_passive_content_unsafe: { message: "\"http://\" as is" }, menu_setting_urlmap_mixed_passive_content_safe: { message: "Convert to \"https://\" (Do not display if failed)" }, menu_setting_urlmap_mixed_passive_content_hint: { message: "If content such as images and videos is displayed with a red border, It means that it is unencrypted, untrustworthy, and can be tampered with by man-in-the-middle attacks." }, menu_setting_urlmap_mixed_active_content_container: { message: "Mixed Active Content Security" }, menu_setting_urlmap_mixed_active_content_unsafe: { message: "\"http://\" as is" }, menu_setting_urlmap_mixed_active_content_safe: { message: "Convert to \"https://\" (Do not display if failed)" }, menu_setting_urlmap_mixed_active_content_hint: { message: "Browser is block \"mixed active content\" by default. To actually display, you need to unblock \"Insecure content\" from the permission settings. (dangerous)" }, 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_size: { message: "Thumbnail Size" }, menu_setting_expand_image_thumbnail_size_min: { message: "Minimum allowed size (pixel)" }, menu_setting_expand_image_thumbnail_size_scale: { message: "Scale (Percent)" }, menu_setting_expand_image_thumbnail_size_max: { message: "Maximum allowed size (pixel)" }, 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 (except mixed content)" }, menu_setting_expand_image_load_src_type_combo_box_item_blob_url: { message: "Blob URL (all)" }, menu_setting_expand_image_load_decode: { message: "Decode Image Setting" }, menu_setting_expand_image_load_decode_combo_box_item_auto: { message: "Browser default" }, menu_setting_expand_image_load_decode_combo_box_item_pre_decode: { message: "Pre-decode the 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_element_src_type: { message: "Audio Source Format" }, menu_setting_expand_sound_inline_element_src_type_combo_box_item_url: { message: "URL (streaming)" }, menu_setting_expand_sound_inline_element_src_type_combo_box_item_blob_url: { message: "Blob URL (full)" }, 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_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_size: { message: "Inline Video Size" }, menu_setting_expand_video_inline_width_max: { message: "Maximum allowed width (pixel)" }, menu_setting_expand_video_inline_height_max: { message: "Maximum allowed height (pixel)" }, 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_element_src_type: { message: "Video Source Format" }, menu_setting_expand_video_inline_element_src_type_combo_box_item_url: { message: "URL (streaming)" }, menu_setting_expand_video_inline_element_src_type_combo_box_item_blob_url: { message: "Blob URL (full)" }, 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_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_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_text_element_inline_unsafe: { message: "Text Inline Display (unsafe)" }, 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_inline_unsafe: { message: "Image Thumbnail Display (unsafe)" }, menu_setting_style_sheet_expand_image_element_popup: { message: "Image Popup Display" }, menu_setting_style_sheet_expand_image_element_popup_unsafe: { message: "Image Popup Display (unsafe)" }, 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_element_inline_audio_unsafe: { message: "Audo Inline Display (unsafe)" }, menu_setting_style_sheet_expand_sound_soundcloud: { message: "soundcloud.com Setting" }, 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_element_inline_video_unsafe: { message: "Video Inline Display (unsafe)" }, 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_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_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_style_sheet_expand_iframe_element_inline_unsafe: { message: "Iframe Inline Display (unsafe)" }, 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 Setting" }, menu_credit: { message: "Credit" }, menu_credit_info_version: { message: "Version" }, menu_credit_info_copyright: { message: "Copyright" }, menu_credit_info_translator: { message: "Translator" }, 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_script_obj_editer_edit_script: { message: "Edit Script" }, menu_script_obj_editer_delete_script: { message: "Delete Script (return to default)" }, menu_scriptarea_hint: { message: "To describe the anonymous function to array. Please note so that it does not contain malicious code." }, menu_scriptarea_unsupport: { message: "UserScript doesn't work now. 😥" }, 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_pageexpand_open_image_viewer: { message: "Open Image Viewer" }, context_menu_pageexpand_open_download_board_application: { message: "Open Download Board (App)" }, context_menu_pageexpand_open_download_board_inline: { message: "Open Download Board" }, context_menu_batch_download_media: { message: "Batch Download (Media)" }, context_menu_pageexpand_open_bbs_board: { message: "Open BBS Board" }, context_menu_pageexpand_open_bbs_board_run_confirm: { message: "Do you want to run the BBS Board in this page?" }, 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_start: { message: "Start PageExpand" }, context_menu_pageexpand_execute_fastest: { message: "Execute PageExpand (fastest)" }, context_menu_pageexpand_abort: { message: "Abort PageExpand" }, context_menu_pageexpand_debug: { message: "PageExpand Debug" }, download_board_button_edit: { message: "Edit download URLs.\nAlso works as an import/export." }, download_board_button_erase: { message: "Removes the selected item from the list." }, download_board_button_deselect: { message: "Deselect all items." }, download_board_button_restore: { message: "Restore size the window." }, download_board_button_maximum: { message: "Maximize size the window." }, download_board_button_close: { message: "DownloadBoard will be hidden.\ndownload process will continue.\nTo finish, close this page or press the cancel button on the bottom right." }, download_board_button_header: { message: "Ask the server for the missing information.\nIt is used when you want to get the ContentType of a URL that does not have an ext.\nYou don't always get the correct information." }, download_board_button_header_cancel: { message: "Abort all loads." }, download_board_button_archive: { message: "Load the selected items and generate one ZIP file." }, download_board_button_archive_cancel: { message: "Abort all work." }, download_board_button_archive_skip: { message: "Skip loading.\nGenerate a ZIP using the loaded files." }, download_board_button_sequential: { message: "Download the selected items in order." }, download_board_button_sequential_cancel: { message: "Abort all downloads." }, download_board_button_sequential_pause: { message: "Pause all downloads. (Abort if API does not support)\nNote that too many items in pause will cause download stacks.\nTo resolve stucks, manually edit the paused download items to reduce the number.\nIf the stack builds up too much, restart your browser." }, download_board_select_filter: { message: "Select file type..." }, download_board_option_filter_all: { message: "All" }, download_board_option_filter_image: { message: "Image" }, download_board_option_filter_audio: { message: "Audio" }, download_board_option_filter_video: { message: "Video" }, download_board_option_filter_media: { message: "Media" }, download_board_option_filter_archive: { message: "Archive" }, download_board_option_filter_text: { message: "Text" }, download_board_option_filter_application: { message: "Application" }, download_board_option_filter_unknown: { message: "Unknown" }, download_board_option_filter_select: { message: "Selected item" }, downloader_state_header_waiting: { message: "Waiting my turn.\nWaiting for another load to finish." }, downloader_state_header_failed: { message: "HEAD method request was failed." }, downloader_state_header_loaded: { message: "HEAD method request was successful." }, downloader_state_archive_waiting: { message: "Waiting my turn.\nWaiting for another load to finish." }, downloader_state_archive_failed: { message: "I failed. This item will be excluded from the archive." }, downloader_state_archive_loading: { message: "Loading now." }, downloader_state_archive_loaded: { message: "Loading completed." }, downloader_state_archive_calculating: { message: "Calculating hash." }, downloader_state_archive_calculated: { message: "Hash calculation completed." }, downloader_state_archive_writing: { message: "Writing binary." }, downloader_state_archive_completed: { message: "Process completed." }, downloader_state_download_wait: { message: "Waiting my turn.\nWaiting for another download to finish." }, downloader_state_download_failed: { message: "Download failed." }, downloader_state_download_erased: { message: "History has been erased." }, downloader_state_download_creating: { message: "Ordered a download. Waiting for the browser to start the download.\nIf this state does not change, the download may be stuck.\nTo clear download stack, Open your browser's download manager and edit directly.\nIf runaway, please restart your browser." }, downloader_state_download_loading: { message: "Downloading now.\nDouble-click this item to pause. (Cancel if API is not supported)" }, downloader_state_download_pausing_can_resumed: { message: "Download is paused. Once you start the download, it will resume from where it left off.\nDouble-click this item to resume." }, downloader_state_download_pausing_cannot_resume: { message: "Download is paused, but it is impossible to resume." }, downloader_state_download_completed_deleted: { message: "The downloaded file has been moved or deleted." }, downloader_state_download_completed_unknown: { message: "Ordered a HTML5 download.\nIt is unknown whether it was successful.\nTo download continuously, you need permission for \"Automatic downloads\"." }, downloader_state_download_completed_exists: { message: "Download completed, file exists.\nDouble-click this item to open the folder." } }, zh: { extension_name: { message: "PageExpand" }, extension_description: { message: "下载所有图片、图片缩放、扩展缩略图以及音频和视频、展开短网址、从文本生成链接、覆盖引用站点、扩展BBS,等等..." }, 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: "从同步存储加载数据,应用到 PageExpand 设置。" }, 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_load_cache_for_media: { message: "Cache MODE (for Media)" }, menu_setting_download_load_cache_for_media_hint: { message: "Normally, you do not need to change. Use \"fetch API\" and works when \"loading media\"." }, menu_setting_expand_image_load_cache_for_media_combo_box_item_default: { message: "default (best)" }, menu_setting_expand_image_load_cache_for_media_combo_box_item_no_store: { message: "don't use cache." }, menu_setting_expand_image_load_cache_for_media_combo_box_item_force_cache: { message: "If cache exists, don't request. (forever old data)" }, menu_setting_download_download: { message: "下载设置" }, menu_setting_download_download_thread_max: { message: "同时下载的最大数目" }, menu_setting_download_download_save_file: { message: "Save File Name" }, menu_setting_download_download_save_file_combo_box_item_simple: { message: "simple" }, menu_setting_download_download_save_file_combo_box_item_detail: { message: "detail" }, menu_setting_download_download_save_file_simple: { message: "Select File Name" }, menu_setting_download_download_save_file_detail: { message: "Edit File Name" }, menu_setting_download_download_save_file_variable: { message: "Variable List" }, 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_download_batch_download: { message: "Batch Download Setting" }, menu_setting_expand_bbs: { message: "BBS 设置" }, menu_setting_expand_bbs_list: { message: "BBS 设置列表" }, 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: "创建新的 BBS 设置" }, 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: "导出 BBS 设置" }, menu_setting_expand_bbs_export_dialog_export: { message: "导出" }, menu_setting_expand_bbs_export_dialog_export_hint: { message: "请复制文本区域的文本。" }, menu_setting_expand_bbs_import_dialog: { message: "导入 BBS 设置" }, 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: "当你选择列表中的项目时,可以编辑较低的控制。按照从上到下的顺序进行比较。可以选择多个,可以进行多选编辑。灰色是预设设置。不能删除预设的设置。" }, 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_mixed_passive_content_container: { message: "Mixed Passive Content Security" }, menu_setting_urlmap_mixed_passive_content_unsafe: { message: "\"http://\" as is" }, menu_setting_urlmap_mixed_passive_content_safe: { message: "Convert to \"https://\" (Do not display if failed)" }, menu_setting_urlmap_mixed_passive_content_hint: { message: "If content such as images and videos is displayed with a red border, It means that it is unencrypted, untrustworthy, and can be tampered with by man-in-the-middle attacks." }, menu_setting_urlmap_mixed_active_content_container: { message: "Mixed Active Content Security" }, menu_setting_urlmap_mixed_active_content_unsafe: { message: "\"http://\" as is" }, menu_setting_urlmap_mixed_active_content_safe: { message: "Convert to \"https://\" (Do not display if failed)" }, menu_setting_urlmap_mixed_active_content_hint: { message: "Browser is block \"mixed active content\" by default. To actually display, you need to unblock \"Insecure content\" from the permission settings. (dangerous)" }, 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: "反映到 HTML 锚点元素 href" }, menu_setting_replacement_to_link_enable_cache: { message: "缓存回调脚本的结果" }, menu_setting_replacement_to_link_filter_script: { message: "回调脚本" }, menu_setting_replacement_to_referer: { message: "替换 Referer 定义" }, 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: "基本 Referer" }, menu_setting_replacement_to_referer_filter_send_type_combo_box_item: { message: "基本 Referer 值" }, 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: "如果 URL 相同,不扩展。" }, menu_setting_expand_image_thumbnail_size: { message: "缩略图的大小" }, menu_setting_expand_image_thumbnail_size_min: { message: "Minimum allowed size (pixel)" }, menu_setting_expand_image_thumbnail_size_scale: { message: "比例 (%)" }, menu_setting_expand_image_thumbnail_size_max: { message: "Maximum allowed size (pixel)" }, 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: "Image Source Format" }, menu_setting_expand_image_load_src_type_combo_box_item_url: { message: "URL (except mixed content)" }, menu_setting_expand_image_load_src_type_combo_box_item_blob_url: { message: "Blob URL (all)" }, menu_setting_expand_image_load_decode: { message: "Decode Image Setting" }, menu_setting_expand_image_load_decode_combo_box_item_auto: { message: "Browser default" }, menu_setting_expand_image_load_decode_combo_box_item_pre_decode: { message: "Pre-decode the all" }, 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: "如果加载超过指定的 MBytes,释放旧的图片。" }, 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: "HTML 音频元素设置" }, menu_setting_expand_sound_inline_element_script_allow: { message: "HTML 音频元素显示的条件" }, menu_setting_expand_sound_inline_element_src_type: { message: "Audio Source Format" }, menu_setting_expand_sound_inline_element_src_type_combo_box_item_url: { message: "URL (streaming)" }, menu_setting_expand_sound_inline_element_src_type_combo_box_item_blob_url: { message: "Blob URL (full)" }, 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_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_size: { message: "Inline Video Size" }, menu_setting_expand_video_inline_width_max: { message: "Maximum allowed width (pixel)" }, menu_setting_expand_video_inline_height_max: { message: "Maximum allowed height (pixel)" }, menu_setting_expand_video_inline_script_allow: { message: "从链接显示内联的条件" }, menu_setting_expand_video_inline_script_insert: { message: "元素插入" }, menu_setting_expand_video_inline_element: { message: "HTML 视频元素设置" }, menu_setting_expand_video_inline_element_script_allow: { message: " HTML 视频元素显示的条件" }, menu_setting_expand_video_inline_element_src_type: { message: "Video Source Format" }, menu_setting_expand_video_inline_element_src_type_combo_box_item_url: { message: "URL (streaming)" }, menu_setting_expand_video_inline_element_src_type_combo_box_item_blob_url: { message: "Blob URL (full)" }, 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_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_iframe: { message: "扩展 Iframe 定义" }, 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: "HTML 内嵌框架元素插入" }, menu_setting_style_sheet: { message: "样式表定义" }, menu_setting_style_sheet_expand_text: { message: "扩展文本样式表" }, menu_setting_style_sheet_expand_text_element: { message: "HTML 文本区域元素设置" }, menu_setting_style_sheet_expand_text_element_inline: { message: "文本内联显示" }, menu_setting_style_sheet_expand_text_element_inline_unsafe: { message: "文本内联显示 (unsafe)" }, menu_setting_style_sheet_expand_image: { message: "扩展图片样式表" }, menu_setting_style_sheet_expand_image_element: { message: "HTML 图片元素设置" }, menu_setting_style_sheet_expand_image_element_inline: { message: "图片缩略图显示" }, menu_setting_style_sheet_expand_image_element_inline_unsafe: { message: "图片缩略图显示 (unsafe)" }, menu_setting_style_sheet_expand_image_element_popup: { message: "图片弹窗显示" }, menu_setting_style_sheet_expand_image_element_popup_unsafe: { message: "图片弹窗显示 (unsafe)" }, menu_setting_style_sheet_expand_sound: { message: "扩展声音样式表" }, menu_setting_style_sheet_expand_sound_element: { message: "HTML 音频元素设置" }, menu_setting_style_sheet_expand_sound_element_inline_audio: { message: "音频内联显示" }, menu_setting_style_sheet_expand_sound_element_inline_audio_unsafe: { message: "音频内联显示 (unsafe)" }, menu_setting_style_sheet_expand_sound_soundcloud: { message: "soundcloud.com 设置" }, 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: "HTML 视频元素设置" }, menu_setting_style_sheet_expand_video_element_inline_video: { message: "视频内联显示" }, menu_setting_style_sheet_expand_video_element_inline_video_unsafe: { message: "视频内联显示 (unsafe)" }, 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_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_iframe: { message: "扩展内嵌框架样式表" }, menu_setting_style_sheet_expand_iframe_element: { message: "HTML 内嵌框架样设置" }, menu_setting_style_sheet_expand_iframe_element_inline: { message: "内嵌框架样内联显示" }, menu_setting_style_sheet_expand_iframe_element_inline_unsafe: { message: "内嵌框架样内联显示 (unsafe)" }, 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_credit_info_translator: { 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: "当你选择列表中的项目时,可以编辑较低的控制。按照从上到下的顺序进行比较。可以选择多个,可以进行多选编辑。" }, 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: "确定" }, menu_button_yes: { message: "是" }, menu_button_no: { message: "取消" }, menu_script_obj_editer_edit_script: { message: "Edit Script" }, menu_script_obj_editer_delete_script: { message: "Delete Script (return to default)" }, menu_scriptarea_hint: { message: "用来描述到数组的匿名函数。请注意,它不包含恶意代码。" }, menu_scriptarea_unsupport: { message: "UserScript doesn't work now. 😥" }, menu_text_regexp_hint: { message: "正则表达式字符串。 [标记] g...重复。 i...不包含。 case-敏感。" }, 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_pageexpand_open_image_viewer: { message: "Open Image Viewer" }, context_menu_pageexpand_open_download_board_application: { message: "Open Download Board (App)" }, context_menu_pageexpand_open_download_board_inline: { message: "Open Download Board" }, context_menu_batch_download_media: { message: "Batch Download (Media)" }, context_menu_pageexpand_open_bbs_board: { message: "Open BBS Board" }, context_menu_pageexpand_open_bbs_board_run_confirm: { message: "Do you want to run the BBS Board in this page?" }, context_menu_pageexpand_config_current_page: { message: "PageExpand 设置当前页" }, context_menu_pageexpand_config_current_bbs: { message: "PageExpand 设置当前 BBS" }, context_menu_pageexpand_config_current_page_confirm: { message: "PageExpand 设置将仅在以下页面中运行。 \n(目的是防止被注入恶意脚本)\n\n你想打开以下页面吗?\n" }, context_menu_pageexpand_config_auto_run_confirm: { message: "你想要在此页面中运行 PageExpand 设置吗?\n(如果此页面被污染,那么恶意脚本将被注入!)" }, context_menu_pageexpand_start: { message: "开始 PageExpand" }, context_menu_pageexpand_execute_fastest: { message: "执行 PageExpand (最快)" }, context_menu_pageexpand_abort: { message: "关于 PageExpand" }, context_menu_pageexpand_debug: { message: "PageExpand 调试" }, download_board_button_edit: { message: "Edit download URLs.\nAlso works as an import/export." }, download_board_button_erase: { message: "Removes the selected item from the list." }, download_board_button_deselect: { message: "Deselect all items." }, download_board_button_restore: { message: "Restore size the window." }, download_board_button_maximum: { message: "Maximize size the window." }, download_board_button_close: { message: "DownloadBoard will be hidden.\ndownload process will continue.\nTo finish, close this page or press the cancel button on the bottom right." }, download_board_button_header: { message: "Ask the server for the missing information.\nIt is used when you want to get the ContentType of a URL that does not have an ext.\nYou don't always get the correct information." }, download_board_button_header_cancel: { message: "Abort all loads." }, download_board_button_archive: { message: "Load the selected items and generate one ZIP file." }, download_board_button_archive_cancel: { message: "Abort all work." }, download_board_button_archive_skip: { message: "Skip loading.\nGenerate a ZIP using the loaded files." }, download_board_button_sequential: { message: "Download the selected items in order." }, download_board_button_sequential_cancel: { message: "Abort all downloads." }, download_board_button_sequential_pause: { message: "Pause all downloads. (Abort if API does not support)\nNote that too many items in pause will cause download stacks.\nTo resolve stucks, manually edit the paused download items to reduce the number.\nIf the stack builds up too much, restart your browser." }, download_board_select_filter: { message: "Select file type..." }, download_board_option_filter_all: { message: "All" }, download_board_option_filter_image: { message: "Image" }, download_board_option_filter_audio: { message: "Audio" }, download_board_option_filter_video: { message: "Video" }, download_board_option_filter_media: { message: "Media" }, download_board_option_filter_archive: { message: "Archive" }, download_board_option_filter_text: { message: "Text" }, download_board_option_filter_application: { message: "Application" }, download_board_option_filter_unknown: { message: "Unknown" }, download_board_option_filter_select: { message: "Selected item" }, downloader_state_header_waiting: { message: "Waiting my turn.\nWaiting for another load to finish." }, downloader_state_header_failed: { message: "HEAD method request was failed." }, downloader_state_header_loaded: { message: "HEAD method request was successful." }, downloader_state_archive_waiting: { message: "Waiting my turn.\nWaiting for another load to finish." }, downloader_state_archive_failed: { message: "I failed. This item will be excluded from the archive." }, downloader_state_archive_loading: { message: "Loading now." }, downloader_state_archive_loaded: { message: "Loading completed." }, downloader_state_archive_calculating: { message: "Calculating hash." }, downloader_state_archive_calculated: { message: "Hash calculation completed." }, downloader_state_archive_writing: { message: "Writing binary." }, downloader_state_archive_completed: { message: "Process completed." }, downloader_state_download_wait: { message: "Waiting my turn.\nWaiting for another download to finish." }, downloader_state_download_failed: { message: "Download failed." }, downloader_state_download_erased: { message: "History has been erased." }, downloader_state_download_creating: { message: "Ordered a download. Waiting for the browser to start the download.\nIf this state does not change, the download may be stuck.\nTo clear download stack, Open your browser's download manager and edit directly.\nIf runaway, please restart your browser." }, downloader_state_download_loading: { message: "Downloading now.\nDouble-click this item to pause. (Cancel if API is not supported)" }, downloader_state_download_pausing_can_resumed: { message: "Download is paused. Once you start the download, it will resume from where it left off.\nDouble-click this item to resume." }, downloader_state_download_pausing_cannot_resume: { message: "Download is paused, but it is impossible to resume." }, downloader_state_download_completed_deleted: { message: "The downloaded file has been moved or deleted." }, downloader_state_download_completed_unknown: { message: "Ordered a HTML5 download.\nIt is unknown whether it was successful.\nTo download continuously, you need permission for \"Automatic downloads\"." }, downloader_state_download_completed_exists: { message: "Download completed, file exists.\nDouble-click this item to open the folder." } } }; // -------------------------------------------------------------------------------- // タイマー // -------------------------------------------------------------------------------- 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(function (){ 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; _this.delay = Number(delay) || 0; _this.currentCount = 0; if(Number.isFinite(repeatCount)){ _this.repeatCount = Number(repeatCount); }else{ _this.repeatCount = null; } _this.running = false; } // -------------------------------------------------------------------------------- // 実行 // -------------------------------------------------------------------------------- var ExecuteMethods = (function(){ function execute(){ var _this = this; if(_this.released) return; var f = _this.methods[0]; if(!f) return; _this.executing = true; f.call(_this.self,function(v){ if(_this.released) return; _this.executing = false; _this.methods.shift(); execute.call(_this); }); } var ExecuteMethods = function(self){ this.methods = new Array(); this.self = self; }; ExecuteMethods.prototype = { release : function(){ if(this.released) return; this.released = true; this.methods.length = 0; }, unshift : function(f){ this.methods.unshift(f); if(this.executing) return; execute.call(this); }, push : function(f){ this.methods.push(f); if(this.executing) return; execute.call(this); }, executing : false, released : false }; return ExecuteMethods; })(); // -------------------------------------------------------------------------------- // UrlInfo辞書 // -------------------------------------------------------------------------------- function UrlInfoDictionary(){ var _this = this; // -------------------------------------------------------------------------------- // UrlInfo // -------------------------------------------------------------------------------- function UrlInfo(url){ this.url = url; this.id = _unique_id; this.alone = new Object(); this.values = new Object(); _unique_id += 1; _url_count += 1; } UrlInfo.prototype = { release : function(){ if(!this.url) return; delete _dictionary[UrlInfo_url_to_key(this.url)]; delete this.url; this.releaseBlobURL(); _url_count -= 1; }, getId : function(){ return this.id; }, getURL : function(){ return this.url; }, analyzeRedirect : function(){ var _this = this; if(this.analyze_redirect) return null; if(this.redirect !== undefined) return null; var _analyze_element = this.analyze_redirect = new Object(); // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _analyze_element.release = function(){ if(_analyze_element.released) return; _analyze_element.released = true; _analyze_element.event_dispatcher.release(); delete _this.analyze_redirect; }; // -------------------------------------------------------------------------------- // 調査成功 // -------------------------------------------------------------------------------- _analyze_element.success = function(redirect){ _this.redirect = redirect; _analyze_element.event_dispatcher.dispatchEvent("success",null); _analyze_element.release(); }; // -------------------------------------------------------------------------------- // 調査失敗 // -------------------------------------------------------------------------------- _analyze_element.failure = function(e){ _this.redirect = null; _analyze_element.event_dispatcher.dispatchEvent("failure",e); _analyze_element.release(); }; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _analyze_element.released = false; _analyze_element.event_dispatcher = new EventDispatcher(); })(); return _analyze_element; }, getRedirect : function(callback){ var _this = this; var event_handler_success = null; var event_handler_failure = null; function complete(){ if(event_handler_success){ event_handler_success.release(); event_handler_success = null; } if(event_handler_failure){ event_handler_failure.release(); event_handler_failure = null; } callback(_this.redirect); } var analyze_element = _this.analyze_redirect; if((function (){ if(!analyze_element) return true; if(_this.redirect !== undefined) return true; return false; })()){ complete(); return; } var event_dispatcher = analyze_element.event_dispatcher; event_handler_success = event_dispatcher.createEventHandler("success"); event_handler_success.setFunction(function(event){ complete(); }); event_handler_failure = event_dispatcher.createEventHandler("failure"); event_handler_failure.setFunction(function(event){ complete(); }); }, analyzeBlobURL : function(){ var _this = this; if(this.analyze_blob_url) return null; if(this.blob_url !== undefined) return null; var _analyze_element = this.analyze_blob_url = new Object(); // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _analyze_element.release = function(){ if(_analyze_element.released) return; _analyze_element.released = true; _analyze_element.event_dispatcher.release(); delete _this.analyze_blob_url; }; // -------------------------------------------------------------------------------- // 調査成功 // -------------------------------------------------------------------------------- _analyze_element.success = function(blob_url){ _this.blob_url = blob_url; _analyze_element.event_dispatcher.dispatchEvent("success",null); _analyze_element.release(); }; // -------------------------------------------------------------------------------- // 調査失敗 // -------------------------------------------------------------------------------- _analyze_element.failure = function(e){ _this.blob_url = ""; _analyze_element.event_dispatcher.dispatchEvent("failure",e); _analyze_element.release(); }; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _analyze_element.released = false; _analyze_element.event_dispatcher = new EventDispatcher(); })(); return _analyze_element; }, getBlobURL : function(callback){ var _this = this; var event_handler_success = null; var event_handler_failure = null; function complete(){ if(event_handler_success){ event_handler_success.release(); event_handler_success = null; } if(event_handler_failure){ event_handler_failure.release(); event_handler_failure = null; } callback(_this.blob_url); } var analyze_element = _this.analyze_blob_url; if((function (){ if(!analyze_element) return true; if(_this.blob_url !== undefined) return true; return false; })()){ complete(); return; } var event_dispatcher = analyze_element.event_dispatcher; event_handler_success = event_dispatcher.createEventHandler("success"); event_handler_success.setFunction(function(event){ complete(); }); event_handler_failure = event_dispatcher.createEventHandler("failure"); event_handler_failure.setFunction(function(event){ complete(); }); }, releaseBlobURL : function(){ if(this.blob_url){ BlobURLRevoke(this.blob_url); delete this.blob_url; } }, getCached : function(callback){ var _this = this; var event_handler_success = null; var event_handler_failure = null; function complete(){ if(event_handler_success){ event_handler_success.release(); event_handler_success = null; } if(event_handler_failure){ event_handler_failure.release(); event_handler_failure = null; } callback(_this.cached,null); } var analyze_element = _this.analyze_cached; if((!analyze_element) && (_this.cached === undefined)){ _this.analyze_cached = (function(){ var analyze_element = new Object(); // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- analyze_element.release = function(){ if(analyze_element.released) return; analyze_element.released = true; analyze_element.event_dispatcher.release(); delete _this.analyze_cached; }; // -------------------------------------------------------------------------------- // 調査成功 // -------------------------------------------------------------------------------- analyze_element.success = function(){ _this.cached = {ok:true}; analyze_element.event_dispatcher.dispatchEvent("success",null); analyze_element.release(); }; // -------------------------------------------------------------------------------- // 調査失敗 // -------------------------------------------------------------------------------- analyze_element.failure = function(e){ _this.cached = {ok:false}; analyze_element.event_dispatcher.dispatchEvent("failure",e); analyze_element.release(); }; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ analyze_element.released = false; analyze_element.event_dispatcher = new EventDispatcher(); })(); return analyze_element; })(); callback(_this.cached,_this.analyze_cached); return; } if((function (){ if(!analyze_element) return true; if(_this.cached !== undefined) return true; return false; })()){ complete(); return; } var event_dispatcher = analyze_element.event_dispatcher; event_handler_success = event_dispatcher.createEventHandler("success"); event_handler_success.setFunction(function(event){ complete(); }); event_handler_failure = event_dispatcher.createEventHandler("failure"); event_handler_failure.setFunction(function(event){ complete(); }); }, setMimeTypeByElement : function(v){ if(this.level > 1) return; this.level = 1; this.setValue("type",v); this.setValue("level",this.level); }, setMimeTypeByExt : function(v){ if(this.level > 2) return; this.level = 2; var mimetype = MIMEType_From_Ext(v); if(mimetype) this.setValue("type",mimetype); this.setValue("ext",v); this.setValue("level",this.level); }, setMimeTypeByFetch : function(v){ if(this.level > 3) return; this.level = 3; this.setValue("type",v); var ext_old = this.getValue("ext") || ""; var ext_new = MIMEType_To_Ext(v); if((function(){ if(!ext_new) return false; if(MIMEType_is_Same(ext_old,ext_new)) return false; return true; })()){ this.setValue("ext",ext_new); } this.setValue("level",this.level); }, isFixedMimeType : function(){ return Boolean(this.level >= 3); }, getValue : function(k){ return this.values[k]; }, setValue : function(k,v){ if(this.values[k] !== v){ this.values[k] = v; if(!this.private){ _this.event_dispatcher.dispatchEvent("modify",{urlInfo:this,key:k,value:v}); } } }, attachAlone : function(v){ this.alone[v] = true; }, removeAlone : function(v){ delete this.alone[v]; }, getAlone : function(v){ return Boolean(this.alone[v]); }, url : "", id : 0, level : 0, analyze_redirect : null, analyze_blob_url : null, analyze_cached : null, redirect : undefined, blob_url : undefined, cached : undefined, private : false }; // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _this.release = function(){ var key; for(key in _dictionary){ _dictionary[key].release(); } _dictionary = null; }; // -------------------------------------------------------------------------------- // URLを登録 // -------------------------------------------------------------------------------- _this.addURL = function(url,optional){ optional = optional || {}; var key = UrlInfo_url_to_key(url); var url_info = _dictionary[key]; if(!url_info){ _dictionary[key] = url_info = new UrlInfo(url); if(optional.private){ url_info.private = true; }else{ _this.event_dispatcher.dispatchEvent("attach",{urlInfo:url_info}); } (function(){ var data_parser = DataURL_Parser(url); if(data_parser){ var mimetype; if(data_parser.format == "base64"){ var total = Base64_get_ByteLength(url.slice(data_parser.data_offset)); url_info.setValue("total",total); }else{ mimetype = "text/plain"; } mimetype = data_parser.mimetype || mimetype; if(mimetype){ url_info.setMimeTypeByFetch(mimetype); } url_info.setValue("status",200); return; } var url_parser = URL_Parser(url); url_info.setValue("name",url_parser.filename); if(url_parser.ext){ url_info.setMimeTypeByExt(url_parser.ext); } })(); } return url_info; }; // -------------------------------------------------------------------------------- // UrlInfo を取得 // -------------------------------------------------------------------------------- _this.getUrlInfo = function(url){ return _dictionary[UrlInfo_url_to_key(url)] || null; }; // -------------------------------------------------------------------------------- // すべて取得 // -------------------------------------------------------------------------------- _this.getUrlInfoAll = function(){ var a = new Array(); var key; for(key in _dictionary){ a.push(_dictionary[key]); } return a; }; // -------------------------------------------------------------------------------- // リダイレクト先を取得 // -------------------------------------------------------------------------------- _this.getRedirectURL = function(current_url,callback){ var redirected = false; var item = _this.getUrlInfo(current_url); var complete = function(){ callback({ redirected:redirected, url_info:item }); }; if(!item){ complete(); return; } var i = 0; var f = function(){ item.getRedirect(function(next){ if(next){ redirected = true; item = next; i++; if(i < _repeat_max){ f(); return; } } complete(); }); }; f(); }; // -------------------------------------------------------------------------------- // 個数を取得 // -------------------------------------------------------------------------------- _this.getCount = function(){ return _url_count; }; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _dictionary; var _unique_id; var _url_count; var _repeat_max; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- _dictionary = new Object(); _unique_id = 0; _url_count = 0; _repeat_max = 16; _this.event_dispatcher = new EventDispatcher(); } // -------------------------------------------------------------------------------- // ハッシュ // -------------------------------------------------------------------------------- function UrlInfo_url_to_key(url){ try{ return (new URL(url)).href; }catch(e){} return url; } // -------------------------------------------------------------------------------- // NodeInfo辞書 // -------------------------------------------------------------------------------- function NodeInfoDictionary(){ var _this = this; // -------------------------------------------------------------------------------- // NodeInfo // -------------------------------------------------------------------------------- function NodeInfo(node){ this.node = node; } NodeInfo.prototype = { release : function(){ if(!this.node) return; _dictionary.delete(this.node); delete this.node; }, getNode : function(){ return this.node; }, getAnalyzed : function(){ return this.analyzed; }, setAnalyzed : function(v){ this.analyzed = v; }, node : null, analyzed : false, }; // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _this.release = function(){ _dictionary = null; }; // -------------------------------------------------------------------------------- // DOMノードを登録 // -------------------------------------------------------------------------------- _this.addNode = function(node){ var node_info = _dictionary.get(node); if(!node_info){ node_info = new NodeInfo(node); _dictionary.set(node,node_info); } return node_info; }; // -------------------------------------------------------------------------------- // NodeInfo を取得 // -------------------------------------------------------------------------------- _this.getNodeInfo = function(node){ return _dictionary.get(node) || null; }; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _dictionary; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- _dictionary = new WeakMap(); } // -------------------------------------------------------------------------------- // 実行キュー // -------------------------------------------------------------------------------- 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 !== null){ clearTimeout(_time_handle); _time_handle = null; } }; // -------------------------------------------------------------------------------- // 最前列に処理を追加 // -------------------------------------------------------------------------------- _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 !== null) return; _time_handle = setTimeout(function (){ execute(); } , _time_sleep); } // -------------------------------------------------------------------------------- // 実行(内部用) // -------------------------------------------------------------------------------- function execute (){ _time_handle = setTimeout(function (){ execute(); } , _time_sleep); 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){ if(_time_handle !== null){ clearTimeout(_time_handle); _time_handle = null; } return; } }while (_getTime() - time <= _time_occupancy); } // -------------------------------------------------------------------------------- // キューの数を取得 // -------------------------------------------------------------------------------- _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 = null; _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(){ if(_released) return; _released = true; var queue = _this.queue; while(queue != queue._next){ element_release(queue._next); } var i; var num = _rules.length; for(i=0;i= rule._thread_max); rule._thread_count -= 1; if(!full) return; if(!rule._cooltime) return; // クールダウン Rule_clear_timer(rule); rule._time_handler = setTimeout(function(){ Rule_clear_timer(rule); dequeue(); },rule._cooltime); } function Rule_clear_timer(rule){ if(rule._time_handler !== null){ clearTimeout(rule._time_handler); rule._time_handler = null; } } function Rule_can_generated(rule){ if(rule._thread_count >= rule._thread_max) return false; if(Rule_is_freezing(rule)) return false; return true; } function Rule_is_freezing(rule){ return Boolean(rule._time_handler !== null); } // -------------------------------------------------------------------------------- // 要素のロード開始(内部用) // -------------------------------------------------------------------------------- function element_loadstart(element){ if(element._loading) return; element._loading = true; element_remove(element); _thread_count += 1; Rule_loadstart(element._rule); element.onstart(); } // -------------------------------------------------------------------------------- // 要素のロード終了(内部用) // -------------------------------------------------------------------------------- function element_loadend(element){ if(!(element._loading)) return; element._loading = false; _thread_count -= 1; Rule_loadend(element._rule); } // -------------------------------------------------------------------------------- // 要素を外す(内部用) // -------------------------------------------------------------------------------- function element_remove(element){ var _prev = element._prev; var _next = element._next; _prev._next = _next; _next._prev = _prev; element._prev = element; element._next = element; element._waiting = false; } // -------------------------------------------------------------------------------- // 要素を中止(内部用) // -------------------------------------------------------------------------------- function element_abort(element){ if((element._loading) || (element._waiting)){ var f = element.onabort; if(f) f(); } element_remove(element); element_loadend(element); } // -------------------------------------------------------------------------------- // 要素を破棄(内部用) // -------------------------------------------------------------------------------- function element_release(element){ if(element._released) return; element._released = true; element_remove(element); element_loadend(element); delete _elements[element._unique]; _queue_count -= 1; } // -------------------------------------------------------------------------------- // デキュー(内部用) // -------------------------------------------------------------------------------- function dequeue(){ if(_released) return; var left = _this.queue; var element = left._next; while(true){ if(element == _this.queue) break; if(_thread_count >= _thread_max) break; if(Rule_can_generated(element._rule)){ element_loadstart(element); element = left._next; }else{ left = element; element = element._next; } } } // -------------------------------------------------------------------------------- // 要素を取得 // -------------------------------------------------------------------------------- _this.getElementById = function(id){ return _elements[id]; }; // -------------------------------------------------------------------------------- // キューの数を取得 // -------------------------------------------------------------------------------- _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; var _released; var _unique; var _elements; var _rules; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _queue_count = 0; _thread_count = 0; _this.setMaxThread(10); _error_count = 0; _released = false; _unique = 1; _elements = new Object(); _rules = new Array(); var queue = new Object(); queue._prev = queue; queue._next = queue; _this.queue = queue; // デフォルトのルール var rule = _this.createRule(); rule.setCoolTime(100); rule.setMaxThread(0x7FFFFFFF); _rules.push(rule); })(); } // -------------------------------------------------------------------------------- // ローダー // -------------------------------------------------------------------------------- var Loader = (function(){ // -------------------------------------------------------------------------------- // 定数 // -------------------------------------------------------------------------------- var QUEUE_ATTACH_TYPE = {FIRST:0,LAST:1}; var XHR_TYPE = {BY_ORIGIN:0,ONLY_BACKGROUND:1}; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- function init_request(){ var o = this.request; for(var k in o){ delete o[k]; }; o.headers = new Object(); o.method = "GET"; o.url = ""; o.data = null; o.timeout = project.getLoadTimeout(); o.overrideMimeType = ""; o.responseType = "text"; } function init_response(o){ var o = this.response; for(var k in o){ delete o[k]; }; o.readyState = 0; o.status = 0; o.headers = new ResponseHeadersParser(""); o.responseURL = ""; o.redirected = false; o.response = null; o.responseText = ""; o.errorText = ""; o.ok = false; } function init_progress(o){ var o = this.progress; for(var k in o){ delete o[k]; }; o.bytesLoaded = 0; o.bytesTotal = 0; } function init_verify_check(){ var url_parser = this.url_parser = URL_Parser(this.request.url); if(!url_parser.protocol.match(/^(http|https|ftp|data|blob):/)){ this.response.errorText = "protocol is not supported."; return false; } this.url_info = url_info_dictionary.addURL(this.request.url); if(project.checkAccessBlock(this.request.url)){ this.response.errorText = "Access Block"; if(project.getEnableOutputLog()){ ConsoleLog({type:"AccessBlock",current_url:WindowGetOwnerURL(window),url:this.request.url,call:"Loader"}); } return false; } return true; } // -------------------------------------------------------------------------------- // 発火 // -------------------------------------------------------------------------------- function dispatch_onprogress(){ var f = this.onprogress; if(f) f(this.progress); } function dispatch_onload(v){ var f = this.onload; if(f) f(v); } function dispatch_onerror(){ loader_queue.addCountError(); var f = this.onerror; if(f) f(this.response.errorText); } // -------------------------------------------------------------------------------- // fetch(コンテントで実行) // -------------------------------------------------------------------------------- function request_content_fetch(callback){ try{ var _this = this; var released = false; var event_handler_release; var event_handler_abort; var timeout_handle = null; var fetch_abort = null; var request = _this.request; var response = _this.response; var progress = _this.progress; var abort = function(){ try{ release_timeout(); fetch_abort.abort(); }catch(e){ } }; var release_timeout = function(){ if(timeout_handle !== null){ clearTimeout(timeout_handle); timeout_handle = null; } }; var release = function(){ if(released) return; released = true; abort(); release_timeout(); if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } }; event_handler_release = _this._event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ release(); }); event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(function(){ release(); }); var complete = function(){ release(); callback({state:"complete"}); }; var success = function(){ if(released) return; response.readyState = 4; complete(); }; var failure = function(msg){ if(released) return; response.ok = false; response.status = 0; response.readyState = 4; response.errorText = msg; complete(); }; var rejected = function(e){ failure(e.message); }; if((function(){ if(!window.fetch) return true; if(!window.ReadableStream) return true; return false; })()){ throw new Error("not supported"); } fetch_abort = new AbortController(); if(request.timeout){ timeout_handle = setTimeout(function(){ timeout_handle = null; abort(); },request.timeout); } var fetch_option = new Object(); fetch_option.signal = fetch_abort.signal; fetch_option.method = request.method; fetch_option.headers = (function(){ var o = new Headers(); var i = request.headers; for(var n in i){ o.append(n,i[n]); } return o; })(); fetch_option.body = request.data; if(request.cache) fetch_option.cache = request.cache; if(request.redirect) fetch_option.redirect = request.redirect; var fetch_promise = fetch(request.url,fetch_option); fetch_promise.then( function(r){ fetch_response = r; response.ok = r.ok; response.readyState = 3; response.status = r.status; var response_headers = r.headers; var headers = new Array(); response_headers.forEach(function(v,k){ headers.push(k + ": " + v); }); response.headers = new ResponseHeadersParser(headers.join("\r\n")); response.responseURL = r.url; response.redirected = r.redirected; if(!r.body){ success(); return; } var reader = r.body.getReader(); var reader_reading; var reader_success; switch(request.responseType){ case "blob": (function (){ var blob_list = new Array(); reader_reading = function(value){ blob_list.push(new Blob([value])); }; reader_success = function(){ var options = { type:response_headers.get("Content-Type") }; response.response = new Blob(blob_list,options); success(); }; })(); break; case "arraybufferlist": (function (){ var ary_buffer_list = new Array(); reader_reading = function(value){ ary_buffer_list.push(value); }; reader_success = function(){ response.response = ary_buffer_list; success(); }; })(); break; case "arraybuffer": case "dataurischeme": case "binarystring": (function (){ var blob_list = new Array(); reader_reading = function(value){ blob_list.push(new Blob([value])); }; reader_success = function(){ var file_reader = new FileReader(); file_reader.onloadend = function(e){ if(released) return; if(file_reader.error){ failure(file_reader.error); }else{ if(request.responseType == "arraybuffer"){ response.response = file_reader.result; }else{ response.responseText = file_reader.result; } success(); } }; var options = { type:response_headers.get("Content-Type") }; var blob = new Blob(blob_list,options); switch(request.responseType){ case "arraybuffer": file_reader.readAsArrayBuffer(blob); break; case "dataurischeme": file_reader.readAsDataURL(blob); break; case "binarystring": file_reader.readAsBinaryString(blob); break; } }; })(); break; default: (function (){ var charset = "utf-8"; var mime_type = request.overrideMimeType || ""; var m = mime_type.match(new RegExp("text/plain; charset=([0-9a-zA-Z-_]+)")); if(m) charset = m[1]; var text_decoder = new TextDecoder(charset); var decode_options = {stream:true}; var str_list = new Array(); reader_reading = function(value){ var ary_u8 = new Uint8Array(value); str_list.push(text_decoder.decode(ary_u8,decode_options)); }; reader_success = function(){ response.responseText = str_list.join(""); success(); }; })(); break; } var loaded = 0; var total = parseInt(response_headers.get("Content-Length")) || 0; var pull = function (){ var p = reader.read(); p.then(function(result){ if(result.done){ progress.bytesTotal = total = loaded; dispatch_onprogress.call(_this); reader.releaseLock(); reader_success(); return; } loaded += result.value.byteLength; progress.bytesLoaded = loaded || 0; progress.bytesTotal = total || 0; dispatch_onprogress.call(_this); reader_reading(result.value); pull(); },rejected); }; pull(); }, rejected ); }catch(e){ response.errorText = e.message; release(); callback({state:"unsupported"}); } } // -------------------------------------------------------------------------------- // xhr(コンテントで実行) // -------------------------------------------------------------------------------- function request_content_xhr(callback){ try{ var _this = this; var released = false; var event_handler_release; var event_handler_abort; var xhr; var request = _this.request; var response = _this.response; var progress = _this.progress; var abort = function(){ try{ xhr.abort(); }catch(e){ } }; var release = function(){ if(released) return; released = true; abort(); try{ xhr.onloadend = null; xhr.onreadystatechange = null; xhr.onprogress = null; }catch(e){ } if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } xhr = null; }; event_handler_release = _this._event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ release(); }); event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(function(){ release(); }); var complete = function(){ release(); callback({state:"complete"}); }; var success = function(){ if(released) return; complete(); }; var failure = function(msg){ if(released) return; response.ok = false; response.status = 0; response.readyState = 4; response.errorText = msg; complete(); }; xhr = new XMLHttpRequest(); xhr.onloadend = function(r){ response.ok = Boolean((200 <= xhr.status && xhr.status < 300) || xhr.status == 304); response.status = xhr.status; response.headers = new ResponseHeadersParser(xhr.getAllResponseHeaders()); response.responseURL = xhr.responseURL; response.redirected = Boolean((xhr.responseURL) && (request.url != xhr.responseURL)); switch(request.responseType){ case "blob": (function (){ response.response = xhr.response; success(); })(); break; case "arraybuffer": (function (){ response.response = xhr.response; success(); })(); break; case "arraybufferlist": (function (){ var blob = xhr.response; if(!blob){ success(); return; } var ary_buffer_list = new Array(); var pos = 0; var read_size = 1024 * 1024 * 16; var total = blob.size; var f = function (){ var file_reader = new FileReader(); file_reader.onloadend = function(){ if(released) return; if(file_reader.error){ failure(file_reader.error); return; } ary_buffer_list.push(file_reader.result); pos += read_size; if(pos < total){ f(); return; } response.response = ary_buffer_list; success(); }; file_reader.readAsArrayBuffer(blob.slice(pos,pos+read_size)); }; f(); })(); break; case "dataurischeme": case "binarystring": (function (){ var blob = xhr.response; if(!blob){ success(); return; } var file_reader = new FileReader(); file_reader.onloadend = function(e){ if(released) return; if(file_reader.error){ failure(file_reader.error); }else{ response.responseText = file_reader.result; success(); } }; switch(request.responseType){ case "dataurischeme": file_reader.readAsDataURL(blob); break; case "binarystring": file_reader.readAsBinaryString(blob); break; } })(); break; default: (function (){ response.responseText = xhr.responseText; success(); })(); break; } }; xhr.onprogress = function(e){ progress.bytesLoaded = e.loaded || 0; progress.bytesTotal = e.total || 0; dispatch_onprogress.call(_this); }; xhr.open(request.method,request.url,true); var headers = request.headers; for(var name in headers){ xhr.setRequestHeader(name,headers[name]); } if(request.overrideMimeType){ if(xhr.overrideMimeType) xhr.overrideMimeType(request.overrideMimeType); } if(request.timeout){ xhr.timeout = request.timeout; } if(request.responseType){ switch(request.responseType){ case "arraybufferlist": case "dataurischeme": case "binarystring": xhr.responseType = "blob"; break; default: xhr.responseType = request.responseType; break; } } xhr.send(request.data); }catch(e){ response.errorText = e.message; release(); callback({state:"unsupported"}); } } // -------------------------------------------------------------------------------- // GM_xmlhttpRequest // -------------------------------------------------------------------------------- function request_gm_xhr(callback){ try{ var _this = this; var released = false; var event_handler_release; var event_handler_abort; var onreadystatechange_func; var onloadheader_func; var onload_func; var gmxhr; var request = _this.request; var response = _this.response; var progress = _this.progress; var abort = function(){ try{ gmxhr.abort(); }catch(e){ } }; var release = function(){ if(released) return; released = true; abort(); onreadystatechange_func = null; onloadheader_func = null; onload_func = null; if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } gmxhr = null; }; event_handler_release = _this._event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ release(); }); event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(function(){ release(); }); var complete = function(){ release(); callback({state:"complete"}); }; var success = function(){ if(released) return; complete(); }; var failure = function(msg){ if(released) return; response.ok = false; response.status = 0; response.readyState = 4; response.errorText = msg; complete(); }; var gmxhr_request = new Object(); gmxhr_request.onprogress = function(e){ progress.bytesLoaded = e.loaded || 0; progress.bytesTotal = e.total || 0; dispatch_onprogress.call(_this); }; gmxhr_request.onload = function(r){ if(onload_func) onload_func(r); }; gmxhr_request.onerror = function(r){ failure(r); }; gmxhr_request.onreadystatechange = function(r){ if(onreadystatechange_func) onreadystatechange_func(r); }; onreadystatechange_func = function(r){ if(r.readyState == 2){ if(onloadheader_func) onloadheader_func(r); } if(r.readyState == 4){ if(onload_func) onload_func(r); } }; onloadheader_func = function(r){ response.ok = Boolean((200 <= r.status && r.status < 300) || r.status == 304) response.status = r.status; response.readyState = r.readyState; response.headers = new ResponseHeadersParser(r.responseHeaders); response.responseURL = r.finalUrl; response.redirected = Boolean((r.finalUrl) && (request.url != r.finalUrl)); }; onload_func = function(r){ onload_func = null; if(onloadheader_func) onloadheader_func(r); switch(request.responseType){ case "blob": (function (){ response.response = r.response; success(); })(); break; case "arraybuffer": (function (){ response.response = r.response; success(); })(); break; case "arraybufferlist": (function (){ var blob = r.response; if(!blob){ success(); return; } var ary_buffer_list = new Array(); var pos = 0; var read_size = 1024 * 1024 * 16; var total = blob.size; var f = function (){ var file_reader = new FileReader(); file_reader.onloadend = function(){ if(released) return; if(file_reader.error){ failure(file_reader.error); return; } ary_buffer_list.push(file_reader.result); pos += read_size; if(pos < total){ f(); return; } response.response = ary_buffer_list; success(); }; file_reader.readAsArrayBuffer(blob.slice(pos,pos+read_size)); }; f(); })(); break; case "dataurischeme": case "binarystring": (function (){ var blob = r.response; if(!blob){ success(); return; } var file_reader = new FileReader(); file_reader.onloadend = function(e){ if(released) return; if(file_reader.error){ failure(file_reader.error); }else{ response.responseText = file_reader.result; success(); } }; switch(request.responseType){ case "dataurischeme": file_reader.readAsDataURL(blob); break; case "binarystring": file_reader.readAsBinaryString(blob); break; } })(); break; default: (function (){ response.responseText = r.responseText; success(); })(); break; } }; gmxhr_request.method = request.method; gmxhr_request.url = request.url; gmxhr_request.headers = request.headers; if(request.overrideMimeType){ gmxhr_request.overrideMimeType = request.overrideMimeType; } if(request.timeout){ gmxhr_request.timeout = request.timeout; } if(request.responseType){ switch(request.responseType){ case "arraybufferlist": case "dataurischeme": case "binarystring": gmxhr_request.responseType = "blob"; break; default: gmxhr_request.responseType = request.responseType; break; } } if(request.data){ gmxhr_request.data = request.data; } try{ gmxhr = GM.xmlHttpRequest(gmxhr_request); return; }catch(e){ } try{ gmxhr = GM_xmlhttpRequest(gmxhr_request); return; }catch(e){ } throw {message:"GM_xmlhttpRequest is not supported"}; }catch(e){ response.errorText = e.message; release(); callback({state:"unsupported"}); } } // -------------------------------------------------------------------------------- // media // -------------------------------------------------------------------------------- function request_element(param,callback){ var _this = this; var released = false; var event_handler_release; var event_handler_abort; var time_handle = null; var queue_element = loader_queue.createElement(); var element; function release(){ if(released) return; released = true; if(element){ element.removeEventListener("load",onload_handle); element.removeEventListener("loadedmetadata",onload_handle); element.removeEventListener("error",failure); } if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } if(queue_element){ queue_element.complete(); queue_element.release(); queue_element = null; } if(time_handle !== null){ clearTimeout(time_handle); time_handle = null; } }; function success(){ if(released) return; release(); callback.call(_this,element); } function failure(){ if(released) return; release(); if(element) element.src = ""; element = null; callback.call(_this,null); } function onload_handle(){ if(released) return; if((function(){ if(element.tagName != "IMG") return false; if(!element.decode) return false; if(project.getDecodeLoadExpandImage() == "pre-decode") return true; return false; })()){ element.decoding = "async"; var promise = element.decode(); promise.then(success,success); // デコードに失敗しても画像は表示される return; } success(); } init_progress.call(_this); init_response.call(_this); if(!param.url){ failure(); return; } event_handler_release = _this._event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ release(); }); event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(function(){ failure(); }); queue_element.onstart = function(){ element = DocumentCreateElement(param.tagName); if(param.tagName == "IMG"){ }else{ element.controls = true; element.autoplay = false; element.preload = "metadata"; } element.addEventListener("load",onload_handle); element.addEventListener("loadedmetadata",onload_handle); element.addEventListener("error",failure); element.src = param.url; if(_this.request.timeout){ setTimeout(failure,_this.request.timeout); } }; queue_element.onabort = function(){ _this.abort(); }; var url_parser = URL_Parser(param.url); if(url_parser.protocol.match(/^(blob|data):/)){ _this._queue_attch_type = QUEUE_ATTACH_TYPE.FIRST; } switch(_this._queue_attch_type){ case QUEUE_ATTACH_TYPE.FIRST: queue_element.attachFirst(); break; default: queue_element.attachLast(); break; } } function load_element(param){ var _this = this; function complete(element){ if(element){ dispatch_onload.call(_this,element); }else{ dispatch_onerror.call(_this); } } _this.request.cache = project.getLoadCacheModeForMedia(); switch((function(){ var current_url_parser = URL_Parser(WindowGetOwnerURL(window)); if(_this.url_parser.protocol.match(/^(blob):/)) return "url"; if(_this.url_parser.protocol.match(/^(data):/)) return "blob_url"; if(current_url_parser.protocol.match(/^(https):/) && _this.url_parser.protocol.match(/^(http):/)) return "blob_url"; return param.src_type; })()){ default: case "url": (function(){ _this.url_info.getCached(function(result,analyze_element){ if(result){ if(!result.ok){ complete(null); return; } } request_element.call(_this,{tagName:param.tagName,url:_this.request.url},function(element){ complete(element); if(analyze_element){ if(element){ analyze_element.success(true); }else{ analyze_element.failure(); } } }); }); })(); break; case "blob_url": (function(){ var analyze_element = _this.url_info.analyzeBlobURL(); _this.url_info.getBlobURL(function(blob_url){ request_element.call(_this,{tagName:param.tagName,url:blob_url},complete); }); if(!analyze_element) return; _this.setResponseType("blob"); load.call(_this,function(){ var blob = _this.response.response; if(blob){ var blob_url = BlobURLCreate(blob); analyze_element.success(blob_url); }else{ analyze_element.failure(); } }); })(); break; } } // -------------------------------------------------------------------------------- // 読み込みを開始 // -------------------------------------------------------------------------------- function load(callback){ var _this = this; var event_handler_release; var event_handler_abort; var queue_element = loader_queue.createElement(); var load_methods = new Array(); var commands; var replied = false; function reply(){ if(replied) return; replied = true; var status = _this.response.status; _this.url_info.setValue("status",status); var total_old = _this.url_info.getValue("total"); var total_new = _this.progress.bytesTotal || Number(_this.response.headers.getResponseHeader("Content-Length")) || 0; if((function(){ if(!total_old) return true; if(!total_new) return false; return true; })()){ _this.url_info.setValue("total",total_new); } var time = _this.response.headers.getResponseHeader("Last-Modified"); if(time){ _this.url_info.setValue("lastModified",(new Date(time)).getTime()); } var content_type = _this.response.headers.getResponseHeader("Content-Type"); var m = content_type.match(/^([^;]+)/); if(m) content_type = m[1]; if(_this.response.status == 0){ }else{ _this.url_info.setMimeTypeByFetch(content_type); } callback.call(_this); } function release(){ if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } if(queue_element){ queue_element.complete(); queue_element.release(); queue_element = null; } command = {}; }; function success(){ release(); reply(); } function failure(){ var response = _this.response; response.ok = false; response.status = 0; release(); reply(); } function load_init(){ init_progress.call(_this); init_response.call(_this); } function load_exec(){ var f = load_methods[0]; if(!f){ failure(); return; } load_init(); f.call(_this,function(v){ var f = commands[v.state]; if(f) f(); }); } load_init(); event_handler_release = _this._event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ release(); }); event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(function(){ failure(); }); commands = { "complete" : function(){ success(); }, "retry" : function(){ load_exec(); }, "unsupported" : function(){ load_methods.shift(); load_exec(); } }; var current_url_parser = URL_Parser(WindowGetOwnerURL(window)); if((function(){ if(_this.url_parser.protocol.match(/blob|data/)) return false; if(this._xhr_type == XHR_TYPE.ONLY_BACKGROUND) return true; return Boolean(current_url_parser.origin != _this.url_parser.origin); })()){ load_methods.push(request_gm_xhr); }else{ load_methods.push(request_content_fetch); load_methods.push(request_content_xhr); } queue_element.onstart = function(){ load_exec(); }; queue_element.onabort = function(){ _this.abort(); }; switch(_this._queue_attch_type){ case QUEUE_ATTACH_TYPE.FIRST: queue_element.attachFirst(); break; default: queue_element.attachLast(); break; } } // -------------------------------------------------------------------------------- // コンストラクタ // -------------------------------------------------------------------------------- var Loader = function(){ this.request = new Object(); this.response = new Object(); this.progress = new Object(); init_request.call(this); init_response.call(this); init_progress.call(this); this._event_dispatcher = new EventDispatcher(); }; Loader.prototype = { // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- release : function(){ if(this._event_dispatcher){ this._event_dispatcher.dispatchEvent("release",null); this._event_dispatcher.release(); this._event_dispatcher = null; } }, // -------------------------------------------------------------------------------- // 中止 // -------------------------------------------------------------------------------- abort : function(){ this._event_dispatcher.dispatchEvent("abort",null); }, // -------------------------------------------------------------------------------- // イベント // -------------------------------------------------------------------------------- onload : function(){}, onerror : function(){}, onprogress : function(){}, // -------------------------------------------------------------------------------- // setter // -------------------------------------------------------------------------------- setRequestHeader : function(name,value){ this.request.headers[name] = value; }, overrideMimeType : function(type){ this.request.overrideMimeType = type; }, setTimeout : function(time){ this.request.timeout = time || 0; }, setMethod : function(method){ this.request.method = (method || "").toLowerCase(); }, setURL : function(url){ this.request.url = url; }, setResponseType : function(type){ this.request.responseType = (type || "").toLowerCase(); }, setSendData : function(data){ this.request.data = data; }, // -------------------------------------------------------------------------------- // 読み込みを開始(ヘッダのみ) // -------------------------------------------------------------------------------- loadResponseHeader : function(){ var _this = this; if(!init_verify_check.call(_this)){ dispatch_onerror.call(_this); return; } if(this.url_parser.protocol.match(/^(blob):/)){ }else{ this.setMethod("head"); } this.setResponseType("blob"); load.call(_this,function(){ var response = _this.response; if(response.ok){ dispatch_onload.call(_this,response.headers); }else{ dispatch_onerror.call(_this); } }); }, // -------------------------------------------------------------------------------- // 読み込みを開始(任意のタイプ) // -------------------------------------------------------------------------------- load : function(){ var _this = this; if(!init_verify_check.call(_this)){ dispatch_onerror.call(_this); return; } load.call(_this,function(){ var response = _this.response; if(response.ok){ dispatch_onload.call(_this,response); }else{ dispatch_onerror.call(_this); } }); }, // -------------------------------------------------------------------------------- // 読み込みを開始(テキスト形式) // -------------------------------------------------------------------------------- loadText : function(){ var _this = this; if(!init_verify_check.call(_this)){ dispatch_onerror.call(_this); return; } this.setResponseType("text"); _this._queue_attch_type = QUEUE_ATTACH_TYPE.FIRST; load.call(_this,function(){ var response = _this.response; if(response.ok){ dispatch_onload.call(_this,response.responseText); }else{ dispatch_onerror.call(_this); } }); }, // -------------------------------------------------------------------------------- // 読み込みを開始(DataUriScheme 形式) // -------------------------------------------------------------------------------- loadDataUriScheme : function(){ var _this = this; if(!init_verify_check.call(_this)){ dispatch_onerror.call(_this); return; } this.setResponseType("dataurischeme"); load.call(_this,function(){ var response = _this.response; if(response.ok){ dispatch_onload.call(_this,response.responseText); }else{ dispatch_onerror.call(_this); } }); }, // -------------------------------------------------------------------------------- // 読み込みを開始(IMG要素を生成) // -------------------------------------------------------------------------------- loadImage : function(){ if(!init_verify_check.call(this)){ dispatch_onerror.call(this); return; } var options = {tagName:"IMG"}; options.src_type = project.getSourceLoadExpandImage(); load_element.call(this,options); }, // -------------------------------------------------------------------------------- // 読み込みを開始(AUDIO要素を生成) // -------------------------------------------------------------------------------- loadAudio : function(){ if(!init_verify_check.call(this)){ dispatch_onerror.call(this); return; } if(!(window.HTMLAudioElement)){ this.response.errorText = "not support HTMLAudioElement"; dispatch_onerror.call(_this); return; } var options = {tagName:"AUDIO"}; options.src_type = project.getSourceAudioElement(); load_element.call(this,options); }, // -------------------------------------------------------------------------------- // 読み込みを開始(VIDEO要素を生成) // -------------------------------------------------------------------------------- loadVideo : function(){ if(!init_verify_check.call(this)){ dispatch_onerror.call(this); return; } if(!(window.HTMLVideoElement)){ this.response.errorText = "not support HTMLVideoElement"; dispatch_onerror.call(_this); return; } var options = {tagName:"VIDEO"}; options.src_type = project.getSourceVideoElement(); load_element.call(this,options); }, // -------------------------------------------------------------------------------- // 読み込みを開始(リダイレクト先を検出) // -------------------------------------------------------------------------------- loadFinalURL : function(){ var _this = this; if(!init_verify_check.call(_this)){ dispatch_onerror.call(_this); return; } var redirect_max = 16; var request_url = _this.request.url; var url_info = url_info_dictionary.addURL(_this.request.url); var analyze_element; _this.setTimeout(1000 * 10); _this.setResponseType("text"); _this._xhr_type = XHR_TYPE.ONLY_BACKGROUND; _this._queue_attch_type = QUEUE_ATTACH_TYPE.FIRST; function success(next_url){ url_info = url_info_dictionary.addURL(next_url); analyze_element.success(url_info); } function failure(){ analyze_element.failure(); } var redirect_status = {"300":1,"301":1,"302":1,"303":1,"307":1,"308":1}; function loadHeader(){ _this.setURL(url_info.getURL()); if(!init_verify_check.call(_this)){ failure(); return; } _this.setMethod("HEAD"); load.call(_this,function(){ var response = _this.response; var headers = response.headers; if(redirect_status[response.status]){ // Location ヘッダを取得 var url = headers.getResponseHeader("Location"); if(url){ success(url); return; } } // リダイレクトが発生した if(response.redirected){ success(response.responseURL); return; } if((function(){ if(!(response.ok)) return false; var total = parseInt(headers.getResponseHeader("Content-Length")) || 0; if(!total) return false; if(total > 1024 * 10) return false; var mimetype = headers.getResponseHeader("Content-Type"); if(!(mimetype.match(/^text[/]/))) return false; return true; })()){ loadBody(); return; } failure(); }); } function loadBody(){ _this.setMethod("GET"); load.call(_this,function(){ var response = _this.response; // メタタグのリダイレクトを調べる var redirect_url = null; var m = response.responseText.match(new RegExp("]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){ success(redirect_url); return; } failure(); }); } function analyze(){ analyze_element = url_info.analyzeRedirect(); url_info.getRedirect(function(next){ redirect_max -= 1; if((function(){ if(!next) return true; if(redirect_max <= 0) return true; return false; })()){ url_info_dictionary.getRedirectURL(request_url,function (result){ if(result.redirected){ dispatch_onload.call(_this,result.url_info.getURL()); }else{ dispatch_onerror.call(); } }); return; } url_info = next; analyze(); }); if(!analyze_element) return; // ヘッダの読み込み loadHeader(); } analyze(); }, request : {}, response : {}, progress : {}, url_parser : null, url_info : null, _queue_attch_type : QUEUE_ATTACH_TYPE.LAST, _xhr_type : XHR_TYPE.BY_ORIGIN }; return Loader; })(); // -------------------------------------------------------------------------------- // ダウンローダー // -------------------------------------------------------------------------------- var DownloaderState = { HEADER:{ WAITING:1, FAILED:2, LOADED:3 }, ARCHIVE:{ WAITING:11, FAILED:12, LOADING:13, LOADED:14, CALCULATING:15, CALCULATED:16, WRITING:17, COMPLETED:18 }, DOWNLOAD:{ WAITING:21, FAILED:22, ERASED:23, CREATING:24, COMPLETED:{ DELETED:25, UNKNOWN:29, EXISTS:30 }, PAUSING:{ CANNOT_RESUME:26, CAN_RESUMED:27 }, LOADING:28 } }; var Downloader = (function(){ // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- function init_request(){ var o = this.request; o.headers = new Object(), o.method = "GET"; o.url = ""; o.saveURL = null; o.data = null, o.filename = null; o.saveAs = false; o.silent = false; o.allowSameRequest = true; o.order = null; o.id = null; } function init_response(o){ var o = this.response; o.ok = false; o.status = 0; o.state = 0; o.mimetype = ""; o.errorText = ""; o.result = false; } function init_progress(o){ var o = this.progress; for(var k in o){ delete o[k]; }; o.bytesLoaded = 0; o.bytesTotal = 0; } function init_verify_check(){ var request = this.request; var response = this.response; this.url_info = url_info_dictionary.getUrlInfo(request.url); var mimetype = null; var blob = this._override_url_by_blob; if(blob){ request.url = this._blob_url = BlobURLCreate(blob); response.mimetype = mimetype = blob.type; } var url_parser = this.url_parser = URL_Parser(request.url); if(!url_parser.protocol.match(/^(http|https|data|blob):/)){ response.state = DownloaderState.DOWNLOAD.FAILED; response.errorText = "protocol is not supported."; dispatch_onstatechange.call(this); return false; } if(!this.url_info){ this.url_info = url_info_dictionary.addURL(request.url,{private:true}); } if(mimetype !== null){ this.url_info.setMimeTypeByFetch(mimetype); dispatch_onstatechange.call(this); } if(project.checkAccessBlock(request.url)){ response.state = DownloaderState.DOWNLOAD.FAILED; response.errorText = "Access Block"; dispatch_onstatechange.call(this); if(project.getEnableOutputLog()){ ConsoleLog({type:"AccessBlock",current_url:WindowGetOwnerURL(window),url:this.request.url,call:"Loader"}); } return false; } return true; } // -------------------------------------------------------------------------------- // 発火 // -------------------------------------------------------------------------------- function dispatch_onprogress(){ var f = this.onprogress; if(f) f(this.progress); } function dispatch_onstatechange(){ var f = this.onstatechange; if(f) f(this.response); } function dispatch_onload(){ var f = this.oncomplete; if(f) f(this.response); } function dispatch_onerror(){ downloader_queue.addCountError(); var f = this.oncomplete; if(f) f(this.response); } // -------------------------------------------------------------------------------- // 重複チェック // -------------------------------------------------------------------------------- function request_same_check(callback){ var request = this.request; var response = this.response; if(!(request.allowSameRequest)){ if(this.url_info.getAlone("download")){ response.result = false; response.errorText = "Request is duplicated."; callback({state:"complete"}); return; } this.url_info.attachAlone("download"); } callback({state:"next"}); } // -------------------------------------------------------------------------------- // Data URL から Blob // -------------------------------------------------------------------------------- function request_url_to_binary(callback){ var _this = this; var request = this.request; var response = this.response; var event_handler_abort; var exec_methods = new ExecuteMethods(_this); var short_url; var loader; var replied = false; function reply(a){ if(replied) return; replied = true; release(); callback(a); } function release(){ if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } if(exec_methods){ exec_methods.release(); exec_methods = null; } if(short_url){ short_url.release(); short_url = null; } if(loader){ loader.release(); loader = null; } } event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(function(){ reply({state:"complete"}); }); function load_blob(callback){ loader = new Loader(); loader.onload = function(r){ if(replied) return; loader = null; _this._override_url_by_blob = r.response; callback(); }; loader.onerror = function(r){ if(replied) return; var xhr = loader.response; response.result = false; response.ok = xhr.ok; response.status = xhr.status; response.state = DownloaderState.DOWNLOAD.FAILED; response.errorText = r; dispatch_onstatechange.call(_this); reply({state:"complete"}); }; loader.setResponseType("blob"); loader.setURL(request.url); loader.load(); } var data_parser = DataURL_Parser(request.url); if(data_parser){ exec_methods.push(load_blob); exec_methods.push(function(callback){ request.url = _this._blob_url = BlobURLCreate(_this._override_url_by_blob); // 短いアドレスを生成 short_url = new ShortURLCreater(); short_url.onsuccess = function(){ request.saveURL = short_url.shortURL; reply({state:"next"}); }; short_url.onerror = function(reason){ response.result = false; response.ok = false; response.status = 0; response.state = DownloaderState.DOWNLOAD.FAILED; response.errorText = reason; dispatch_onstatechange.call(_this); reply({state:"complete"}); }; short_url.setUrlInfo(_this.url_info); short_url.setBlob(_this._override_url_by_blob); short_url.start(); }); return; } if(request.url.search(new RegExp("^(blob):","i")) >= 0){ exec_methods.push(load_blob); exec_methods.push(function(callback){ reply({state:"next"}); }); return; } reply({state:"next"}); } // -------------------------------------------------------------------------------- // GM_download API // -------------------------------------------------------------------------------- function request_gm_download(callback){ var _this = this; if(!GM_downloadSupported()){ reply({state:"next"}); return; } var request = _this.request; var response = _this.response; var progress = _this.progress; var download = null; var event_handler_release; var event_handler_abort; var replied = false; function reply(a){ if(replied) return; replied = true; release(); callback(a); } function release(){ if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } download = null; } function abort(){ try{ download.abort(); }catch(e){ } response.state = DownloaderState.DOWNLOAD.FAILED; dispatch_onstatechange.call(_this); reply({state:"complete"}); } event_handler_release = _this._event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(release); event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(abort); var file_name = ProjectDownloadSaveFile_Sanitize(request.filename || project.getSaveFileDownload(request.saveURL || request.url)); // ファイル名が長すぎるとフリーズするので回避 if(file_name.length > 65535){ reply({state:"next"}); return; } // 拡張子付与 var ext = _this.url_info.getValue("ext"); if(ext){ var m = file_name.match(new RegExp("[.]([a-zA-Z0-9]*)$","i")); if(m){ file_name = file_name.slice(0,m.index); } file_name += "." + ext; } response.state = DownloaderState.DOWNLOAD.LOADING; dispatch_onstatechange.call(_this); var options = { url:request.url, saveAs:request.saveAs, name:file_name, headers:request.headers, onload:function(e){ response.result = true; response.ok = true; response.status = 200; response.state = DownloaderState.DOWNLOAD.COMPLETED.UNKNOWN; dispatch_onstatechange.call(_this); reply({state:"complete"}); }, onerror:function(e){ response.result = false; response.ok = false; response.status = 0; response.state = DownloaderState.DOWNLOAD.FAILED; dispatch_onstatechange.call(_this); response.errorText = e.error; reply({state:"complete"}); }, onprogress:function(e){ var total = e.total || 0; if(total < 0) total = 0; progress.bytesLoaded = e.loaded || 0; progress.bytesTotal = total; dispatch_onprogress.call(_this); } }; switch(project.getDownloadConflict()){ case "rename": default: options.conflictAction = "uniquify"; break; case "overwrite": options.conflictAction = "overwrite"; break; } // ダウンロード開始 download = GM_download(options); } // -------------------------------------------------------------------------------- // HTML5 Download // -------------------------------------------------------------------------------- function request_content_html5_download(callback){ var _this = this; var request = _this.request; var response = _this.response; var progress = _this.progress; var exec_methods = new ExecuteMethods(_this); var event_handler_release; var event_handler_abort; var loader; var anchor; var time_handle = null; var file_name = ""; var replied = false; function reply(a){ if(replied) return; replied = true; release(); callback(a); } function release_anchor(){ if(anchor){ DomNodeRemove(anchor); anchor.href = ""; anchor.download = ""; anchor = null; } } function release(){ release_anchor(); 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(exec_methods){ exec_methods.release(); exec_methods = null; } if(loader){ loader.release(); loader = null; } if(time_handle !== null){ clearTimeout(time_handle); time_handle = null; } } function abort(){ try{ loader.abort(); }catch(e){ } response.state = DownloaderState.DOWNLOAD.FAILED; dispatch_onstatechange.call(_this); reply({state:"complete"}); } event_handler_release = _this._event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(release); event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(abort); anchor = DocumentCreateElement("a"); if(anchor.download === undefined){ reply({state:"next"}); return; } var node_info = node_info_dictionary.addNode(anchor); node_info.setAnalyzed(true); exec_methods.push(function(callback){ if(_this._override_url_by_blob){ callback(); return; } response.state = DownloaderState.DOWNLOAD.LOADING; dispatch_onstatechange.call(_this); function load_complete(){ var xhr = loader.response; response.ok = xhr.status; response.status = xhr.status; } loader = new Loader(); loader.onprogress = function(e){ if(replied) return; progress.bytesLoaded = e.bytesLoaded; progress.bytesTotal = e.bytesTotal; dispatch_onprogress.call(_this); }; loader.onload = function(r){ if(replied) return; load_complete(); _this._override_url_by_blob = r.response; callback(); }; loader.onerror = function(error){ if(replied) return; load_complete(); response.result = false; response.state = DownloaderState.DOWNLOAD.FAILED; response.errorText = error; dispatch_onstatechange.call(_this); reply({state:"complete"}); }; loader.setMethod(request.method); loader.setURL(request.url); loader.setResponseType("blob"); loader.load(); }); exec_methods.push(function(callback){ progress.bytesTotal = progress.bytesLoaded = _this._override_url_by_blob.size; dispatch_onprogress.call(_this); var optional = { ext:_this.url_info.getValue("ext"), type:"download" }; var file_name_obj = ProjectDownloadSaveFile_Determining(request,optional); if(file_name_obj.error){ dispatch_state_failed(); failure(file_name_obj.error); return; } file_name = file_name_obj.filename; request.url = _this._blob_url = BlobURLCreate(_this._override_url_by_blob); callback(); }); exec_methods.push(function(callback){ anchor.target = "PageExpandDownload"; anchor.href = request.url; anchor.download = file_name; document.body.appendChild(anchor); anchor.click(); callback(); }); exec_methods.push(function(callback){ time_handle = setTimeout(function(){ if(replied) return; release_anchor(); response.result = true; response.state = DownloaderState.DOWNLOAD.COMPLETED.UNKNOWN; dispatch_onstatechange.call(_this); reply({state:"complete"}); },1000); }); } // -------------------------------------------------------------------------------- // 未対応 // -------------------------------------------------------------------------------- function request_not_supported(callback){ var response = this.response; response.result = false; response.ok = false; response.status = 0; response.state = DownloaderState.DOWNLOAD.FAILED; response.errorText = "Downloader is not supported."; dispatch_onstatechange.call(this); callback({state:"complete"}); } // -------------------------------------------------------------------------------- // 読み込みを開始 // -------------------------------------------------------------------------------- function load(callback){ var _this = this; var response = _this.response; var event_handler_release; var event_handler_abort; var queue_element; var load_methods = new Array(); var commands; var replied = false; function reply(){ if(replied) return; replied = true; var total = _this.progress.bytesTotal || 0; _this.url_info.setValue("total",total); /* var content_type = _this.response.mimetype; var m = content_type.match(/^([^;]+)/); if(m) content_type = m[1]; _this.url_info.setMimeTypeByFetch(content_type); */ callback.call(_this); } function release_event_abort(){ if(event_handler_abort){ event_handler_abort.release(); event_handler_abort = null; } }; function release(){ release_event_abort(); if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } if(queue_element){ queue_element.complete(); queue_element.release(); queue_element = null; } command = {}; }; function success(){ release(); reply(); } function failure(){ response.state = DownloaderState.DOWNLOAD.FAILED; dispatch_onstatechange.call(_this); release(); reply(); } function load_init(){ init_response.call(_this); init_progress.call(_this); _this.response.state = DownloaderState.DOWNLOAD.WAITING; dispatch_onstatechange.call(_this); release_event_abort(); } function load_exec(){ var f = load_methods[0]; if(!f){ failure(); return; } load_init(); f.call(_this,function(v){ var f = commands[v.state]; if(f) f(); }); } load_init(); event_handler_release = _this._event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(release); event_handler_abort = _this._event_dispatcher.createEventHandler("abort"); event_handler_abort.setFunction(function(){ failure(); }); commands = { "complete" : function(){ success(); }, "next" : function(){ load_methods.shift(); load_exec(); } }; load_methods.push(request_same_check); if(!this._override_url_by_blob){ load_methods.push(request_url_to_binary); } load_methods.push(request_gm_download); load_methods.push(request_content_html5_download); load_methods.push(request_not_supported); switch(_this.request.order){ case "pause": case "cancel": case "open": load_exec(); break; default: queue_element = downloader_queue.createElement(); queue_element.onstart = function(){ load_exec(); }; queue_element.onabort = function(){ _this.cancel(); }; queue_element.attachLast(); break; } } // -------------------------------------------------------------------------------- // コンストラクタ // -------------------------------------------------------------------------------- var Downloader = function(){ this.request = new Object(); this.response = new Object(); this.progress = new Object(); init_request.call(this); init_response.call(this); init_progress.call(this); this._event_dispatcher = new EventDispatcher(); }; Downloader.prototype = { // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- release : function(){ if(this._event_dispatcher){ this._event_dispatcher.dispatchEvent("release",null); this._event_dispatcher.release(); this._event_dispatcher = null; } if(this._blob_url){ BlobURLRevoke(this._blob_url); this._blob_url = null; } }, // -------------------------------------------------------------------------------- // 中止 // -------------------------------------------------------------------------------- cancel : function(){ this._event_dispatcher.dispatchEvent("cancel",null); this._event_dispatcher.dispatchEvent("abort",null); }, // -------------------------------------------------------------------------------- // 再開可能な一時停止(未対応なら中止) // -------------------------------------------------------------------------------- pause : function(){ this._event_dispatcher.dispatchEvent("pause",null); this._event_dispatcher.dispatchEvent("abort",null); }, // -------------------------------------------------------------------------------- // イベント // -------------------------------------------------------------------------------- oncomplete : function(){}, onprogress : function(){}, onstatechange : function(){}, // -------------------------------------------------------------------------------- // setter // -------------------------------------------------------------------------------- setURL : function(url){ this.request.url = url; }, setFile : function(blob){ this._override_url_by_blob = blob; }, setFileName : function(name){ this.request.filename = name; }, setSaveAs : function(use){ this.request.saveAs = use; }, setSilent : function(use){ this.request.silent = use; }, setAllowSameRequest : function(use){ this.request.allowSameRequest = use; }, setId : function(id){ this.request.id = id; }, // -------------------------------------------------------------------------------- // 読み込みを開始 // -------------------------------------------------------------------------------- start : function(options){ var _this = this; var o = options || {}; if(o.order) _this.request.order = o.order; if(!init_verify_check.call(_this)){ dispatch_onerror.call(_this); return; } load.call(_this,function(){ var response = _this.response; if(response.result){ dispatch_onload.call(_this); }else{ dispatch_onerror.call(_this); } }); }, request : {}, response : {}, progress : {}, _blob_url : null, _override_url_by_blob : null, url_parser : null, url_info : null }; return Downloader; })(); // -------------------------------------------------------------------------------- // タスクコンテナ // -------------------------------------------------------------------------------- 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 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; _event_handler._func = null; 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= 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 context_menu_func(e){ if(e.defaultPrevented === true) return; if(e.returnValue === false) return; _buttons &= ~0x02; } // -------------------------------------------------------------------------------- // 非アクティブ(内部用) // -------------------------------------------------------------------------------- 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("contextmenu",context_menu_func); window_obj.addEventListener("blur",blur_func); _mouse_input_func = function(e,r){ if((function(){ if(e.buttons === undefined) return false; if(!event_type_move[e.type]) return false; return true; })()){ _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; } if(e.clientX || e.clientY){ _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("oncontextmenu",context_menu_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); } if(e.clientX || e.clientY){ _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= 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 260) return {}; 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 Boolean(work.i_obs); } // -------------------------------------------------------------------------------- // アンカーオーバーライド状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearOverrodeAnchorElement(work){ ObjectDeleteProperty(work,"o_anc"); } function AnalyzeWorkSetOverrodeAnchorElement(work){ work.o_anc = true; } function AnalyzeWorkGetOverrodeAnchorElement(work){ return Boolean(work.o_anc); } // -------------------------------------------------------------------------------- // URL オーバーライド状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearOverrodeUrl(work){ ObjectDeleteProperty(work,"o_url"); } function AnalyzeWorkSetOverrodeUrl(work){ work.o_anc = true; } function AnalyzeWorkGetOverrodeUrl(work){ return Boolean(work.o_anc); } // -------------------------------------------------------------------------------- // 「エレメントの置換」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedReplacementToElement(work){ ObjectDeleteProperty(work,"a_rte"); } function AnalyzeWorkSetAnalyzedReplacementToElement(work){ work.a_rte = true; } function AnalyzeWorkGetAnalyzedReplacementToElement(work){ return Boolean(work.a_rte); } // -------------------------------------------------------------------------------- // 「テキストの置換」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedReplacementToText(work){ ObjectDeleteProperty(work,"a_rtt"); } function AnalyzeWorkSetAnalyzedReplacementToText(work){ work.a_rtt = true; } function AnalyzeWorkGetAnalyzedReplacementToText(work){ return Boolean(work.a_rtt); } // -------------------------------------------------------------------------------- // 「アンカーの置換」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedReplacementToAnchor(work){ ObjectDeleteProperty(work,"a_rta"); } function AnalyzeWorkSetAnalyzedReplacementToAnchor(work){ work.a_rta = true; } function AnalyzeWorkGetAnalyzedReplacementToAnchor(work){ return Boolean(work.a_rta); } // -------------------------------------------------------------------------------- // 「ハイパーリンクの置換」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedReplacementToLink(work){ ObjectDeleteProperty(work,"a_rtl"); } function AnalyzeWorkSetAnalyzedReplacementToLink(work){ work.a_rtl = true; } function AnalyzeWorkGetAnalyzedReplacementToLink(work){ return Boolean(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 Boolean(work.a_mlt); } // -------------------------------------------------------------------------------- // 「短縮 URL の展開」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedExpandShortUrl(work){ ObjectDeleteProperty(work,"a_esu"); } function AnalyzeWorkSetAnalyzedExpandShortUrl(work){ work.a_esu = true; } function AnalyzeWorkGetAnalyzedExpandShortUrl(work){ return Boolean(work.a_esu); } // -------------------------------------------------------------------------------- // 「テキストの展開」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedExpandInlineText(work){ ObjectDeleteProperty(work,"a_eit"); } function AnalyzeWorkSetAnalyzedExpandInlineText(work){ work.a_eit = true; } function AnalyzeWorkGetAnalyzedExpandInlineText(work){ return Boolean(work.a_eit); } // -------------------------------------------------------------------------------- // 「イメージのサムネイル展開」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedExpandThumbnailImage(work){ ObjectDeleteProperty(work,"a_eti"); } function AnalyzeWorkSetAnalyzedExpandThumbnailImage(work){ work.a_eti = true; } function AnalyzeWorkGetAnalyzedExpandThumbnailImage(work){ return Boolean(work.a_eti); } // -------------------------------------------------------------------------------- // 「イメージのポップアップ展開」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedExpandPopupImage(work){ ObjectDeleteProperty(work,"a_epi"); } function AnalyzeWorkSetAnalyzedExpandPopupImage(work){ work.a_epi = true; } function AnalyzeWorkGetAnalyzedExpandPopupImage(work){ return Boolean(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 Boolean(work.a_eis); } // -------------------------------------------------------------------------------- // 「ビデオのインライン展開」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedExpandInlineVideo(work){ ObjectDeleteProperty(work,"a_eiv"); } function AnalyzeWorkSetAnalyzedExpandInlineVideo(work){ work.a_eiv = true; } function AnalyzeWorkGetAnalyzedExpandInlineVideo(work){ return Boolean(work.a_eiv); } // -------------------------------------------------------------------------------- // 「インラインの展開」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedExpandInlineIframe(work){ ObjectDeleteProperty(work,"a_eif"); } function AnalyzeWorkSetAnalyzedExpandInlineIframe(work){ work.a_eif = true; } function AnalyzeWorkGetAnalyzedExpandInlineIframe(work){ return Boolean(work.a_eif); } // -------------------------------------------------------------------------------- // 「インラインフレーム内コンテンツ展開」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedExpandIframeContent(work){ ObjectDeleteProperty(work,"a_eic"); } function AnalyzeWorkSetAnalyzedExpandIframeContent(work){ work.a_eic = true; } function AnalyzeWorkGetAnalyzedExpandIframeContent(work){ return Boolean(work.a_eic); } // -------------------------------------------------------------------------------- // 「縮小画像のポップアップ」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedPopupReducedImage(work){ ObjectDeleteProperty(work,"a_pri"); } function AnalyzeWorkSetAnalyzedPopupReducedImage(work){ work.a_pri = true; } function AnalyzeWorkGetAnalyzedPopupReducedImage(work){ return Boolean(work.a_pri); } // -------------------------------------------------------------------------------- // 「インラインMediaPlayer」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedInlineMediaPlayer(work){ ObjectDeleteProperty(work,"a_imp"); } function AnalyzeWorkSetAnalyzedInlineMediaPlayer(work){ work.a_imp = true; } function AnalyzeWorkGetAnalyzedInlineMediaPlayer(work){ return Boolean(work.a_imp); } // -------------------------------------------------------------------------------- // 「掲示板拡張」の解析状況 // -------------------------------------------------------------------------------- function AnalyzeWorkClearAnalyzedExpandBbs(work){ ObjectDeleteProperty(work,"a_ebb"); } function AnalyzeWorkSetAnalyzedExpandBbs(work){ work.a_ebb = true; } function AnalyzeWorkGetAnalyzedExpandBbs(work){ return Boolean(work.a_ebb); } // -------------------------------------------------------------------------------- // 解析無効化 // -------------------------------------------------------------------------------- function AnalyzeWorkClearInvalid(work){ ObjectDeleteProperty(work,"a_inv"); } function AnalyzeWorkSetInvalid(work){ work.a_inv = true; } function AnalyzeWorkGetInvalid(work){ return Boolean(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(); // データを開放 removeDataAll(); // イベント発火 _event_dispatcher.dispatchEvent("release",null); } // -------------------------------------------------------------------------------- // リリースイベントを追加(内部用) // -------------------------------------------------------------------------------- function addEventRelease(){ removeEventRelease(); var i; var num = _elements_original.length; for(i=0;i= target_item.owner.getNumber()){ break; } target_item = target_item.dic_prev; } if(!_datalist[name]){ var ary_list = new Object(); ary_list.ary_prev = ary_list; ary_list.ary_next = ary_list; _datalist[name] = ary_list; } var data_item = Object(); data_item.data = data; data_item.owner = _response; data_item.container = same_container; var dic_prev = target_item; var dic_next = dic_prev.dic_next; dic_prev.dic_next = data_item; dic_next.dic_prev = data_item; data_item.dic_prev = dic_prev; data_item.dic_next = dic_next; var ary_prev = _datalist[name].ary_prev; var ary_next = ary_prev.ary_next; ary_prev.ary_next = data_item; ary_next.ary_prev = data_item; data_item.ary_prev = ary_prev; data_item.ary_next = ary_next; // カウンタ addCountData(same_container,1); } // -------------------------------------------------------------------------------- // データの登録を外す(内部用) // -------------------------------------------------------------------------------- function removeData(name){ var data_item = _datalist[name]; if(!data_item) return; while(data_item.ary_next != data_item){ removeDataItem(data_item.ary_next); } } // -------------------------------------------------------------------------------- // データの登録を外す(内部用) // -------------------------------------------------------------------------------- function removeDataItem(data_item){ addCountData(data_item.container,-1); var dic_prev = data_item.dic_prev; var dic_next = data_item.dic_next; dic_prev.dic_next = dic_next; dic_next.dic_prev = dic_prev; var ary_prev = data_item.ary_prev; var ary_next = data_item.ary_next; ary_prev.ary_next = ary_next; ary_next.ary_prev = ary_prev; } // -------------------------------------------------------------------------------- // すべてのデータを解放(内部用) // -------------------------------------------------------------------------------- function removeDataAll(){ for(var name in _datalist){ removeData(name); } } // -------------------------------------------------------------------------------- // データを取得 // -------------------------------------------------------------------------------- _response.getDataList = function(name){ var ary = []; var data_list = _datalist[name]; if(!data_list) return ary; var data_item = data_list.ary_next; while(data_item != data_list){ ary.push(data_item.data); data_item = data_item.ary_next; } return ary; }; // -------------------------------------------------------------------------------- // データを持っているか // -------------------------------------------------------------------------------- _response.hasData = function(name,data){ var data_list = _datalist[name]; if(!data_list) return false; var data_item = data_list.ary_next; while(data_item != data_list){ if(data_item.data === data) return true; data_item = data_item.ary_next; } return false; }; // -------------------------------------------------------------------------------- // データを追加 // -------------------------------------------------------------------------------- _response.attachData = function(name,data){ attachData(name,data); }; // -------------------------------------------------------------------------------- // 解析済みクリア // -------------------------------------------------------------------------------- _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= 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 _datalist; var _analyzed; var _released; var _elements_original; var _elements_original_work; var _elements_clone; var _follower_count; var _observer_remove; var _event_dispatcher; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _datalist = new Object(); _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); _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){ return _this.getResponsesFromData("id",id); }; // -------------------------------------------------------------------------------- // 名前からレスポンスを取得 // -------------------------------------------------------------------------------- _this.getResponsesFromName = function(name){ return _this.getResponsesFromData("name",name); }; // -------------------------------------------------------------------------------- // ホストからレスポンスを取得 // -------------------------------------------------------------------------------- _this.getResponsesFromHost = function(host){ return _this.getResponsesFromData("host",host); }; // -------------------------------------------------------------------------------- // データからレスポンスを取得 // -------------------------------------------------------------------------------- _this.getResponsesFromData = function(name,data){ var ary = new Array(); var same_container = getSameContainer(name,data); var data_list = same_container.list; var data_item = data_list.dic_next; while(data_item != data_list){ ary.push(data_item.owner); data_item = data_item.dic_next; } return ary; }; // -------------------------------------------------------------------------------- // ID カウント用のイベントハンドラを生成 // -------------------------------------------------------------------------------- _this.createEventHandlerForIdCounter = function(id){ return _this.createEventHandlerForDataCounter("id",id); }; // -------------------------------------------------------------------------------- // 名前カウント用のイベントハンドラを生成 // -------------------------------------------------------------------------------- _this.createEventHandlerForNameCounter = function(name){ return _this.createEventHandlerForDataCounter("name",name); }; // -------------------------------------------------------------------------------- // ホストカウント用のイベントハンドラを生成 // -------------------------------------------------------------------------------- _this.createEventHandlerForHostCounter = function(host){ return _this.createEventHandlerForDataCounter("host",host); }; // -------------------------------------------------------------------------------- // データカウント用のイベントハンドラを生成 // -------------------------------------------------------------------------------- _this.createEventHandlerForDataCounter = function(name,data){ var same_container = getSameContainer(name,data); return same_container.counter_event.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){ return _this.getCountData("id",id); }; // -------------------------------------------------------------------------------- // 名前カウント数取得 // -------------------------------------------------------------------------------- _this.getCountName = function(name){ return _this.getCountData("name",name); }; // -------------------------------------------------------------------------------- // ホストカウント数取得 // -------------------------------------------------------------------------------- _this.getCountHost = function(host){ return _this.getCountData("host",host); }; // -------------------------------------------------------------------------------- // データカウント数取得 // -------------------------------------------------------------------------------- _this.getCountData = function(name,data){ var same_container = getSameContainer(name,data); return same_container.count; }; // -------------------------------------------------------------------------------- // データカウント数加算(内部用) // -------------------------------------------------------------------------------- function addCountData(same_container,v){ same_container.count += v; // イベント発火 same_container.counter_event.dispatchEvent("update",same_container.count); } // -------------------------------------------------------------------------------- // データを取得(内部用) // -------------------------------------------------------------------------------- function getSameContainer(name,data){ var same_dic = _data_dictionary[name]; if(!same_dic){ same_dic = _data_dictionary[name] = new Object(); } var same_container = same_dic[data]; if(!same_container){ var dic_list = new Object(); dic_list.dic_prev = dic_list; dic_list.dic_next = dic_list; var event_dispatcher = new EventDispatcher(); same_container = same_dic[data] = { count:0, counter_event:event_dispatcher, list:dic_list }; } return same_container; } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _number_dictionary; var _data_dictionary; var _follower_counter_event_dictionary; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _number_dictionary = new Object(); _data_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 mouse_pos = input_mouse.getPositionClient(); var hit = ElementHitTestPosition(_element_hit_area,mouse_pos,false); if(!hit){ hit = Boolean(document.elementFromPoint( mouse_pos.x , mouse_pos.y ) == _element_hit_area); } if(!hit){ hit = _this.hittestWindow(mouse_pos); } if(!hit){ getChildren(function(dialog){ hit = dialog.hittestWindow(mouse_pos); return hit; }); } if(hit){ var client_size = DocumentGetClientSize(document); 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 BbsResponseDialogContains(node){ while(node){ var work = analyze_work_dictionary.getAnalyzeWork(node); if(work){ if(work.id & ANALYZE_WORK_DICTIONARY_ATTACH_OPTION_OUTSIDER){ return true; } } node = node.parentNode; } return false; } // -------------------------------------------------------------------------------- // 掲示板コントロール レスアンカー // -------------------------------------------------------------------------------- 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= 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"); _element.style.cursor = "pointer"; _element.title = "remove"; } 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= 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"); _element.style.cursor = "pointer"; _element.title = "remove"; } 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= 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"); _element.style.cursor = "pointer"; _element.title = "remove"; } 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= 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"); _element.style.cursor = "pointer"; _element.title = "remove"; } 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 _wait_time){ _task.setExecuteFunc(ReadMoreLoadInit); } } // -------------------------------------------------------------------------------- // 自動読み込み待機(内部用) // -------------------------------------------------------------------------------- function ReadMoreAutoLoadWaitInit(){ _task.setExecuteFunc(ReadMoreAutoLoadWaitExec); _task.execute(0xffffffff); } function ReadMoreAutoLoadWaitExec(){ var time_sub = _getTime() - _timer; var t = Math.ceil((_auto_time_now - time_sub) / 1000); if(t < 0) t = 0; ButtonSetValue("auto ... " + t); if(time_sub > _auto_time_now){ _task.setExecuteFunc(ReadMoreLoadInit); } } // -------------------------------------------------------------------------------- // 読み込み(内部用) // -------------------------------------------------------------------------------- function ReadMoreLoadInit(){ ButtonSetValue("loading..."); _task.setExecuteFunc(null); _this.onclick(function(response){ if(_auto_mode){ if(response.result){ if(response.add_count){ _auto_time_now = _auto_time_now * 0.5; _add_count += response.add_count; updateTitle(); attachObserverScroll(); }else{ var add = _auto_time_now * 0.5 if(add < 5000) add = 5000; _auto_time_now += add; } _auto_time_now = Math.ceil(_auto_time_now / 1000) * 1000; if(_auto_time_now > _auto_time_max) _auto_time_now = _auto_time_max; if(_auto_time_now < _auto_time_min) _auto_time_now = _auto_time_min; _timer = _getTime(); _task.setExecuteFunc(ReadMoreAutoLoadWaitInit); }else{ _this.init(); } }else{ _this.init(); } }); } // -------------------------------------------------------------------------------- // テキストを設定(内部用) // -------------------------------------------------------------------------------- function ButtonSetValue(v){ if(v == _button_value_old) return; _element.value = _button_value_old = v; } // -------------------------------------------------------------------------------- // タイトルを更新(内部用) // -------------------------------------------------------------------------------- function updateTitle(){ try{ var title = document.title; var m = title.match(new RegExp("\\([0-9]+\\) (.*)","i")); if(m){ if(_title_old != m[1]){ _title_old = m[1]; } }else{ _title_old = title; } if(_add_count){ document.title = "(" + _add_count + ") " + _title_old; }else{ document.title = _title_old; } }catch(e){ } } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _element; var _task; var _onclick; var _timer; var _wait_time; var _auto_time; var _auto_time_now; var _auto_time_min; var _auto_time_max; var _auto_mode; var _button_value_old; var _title_old; var _add_count; var _analyze_work; var _observer_remove; var _event_handler_abort; var _getTime; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _this.onclick = null; _timer = 0; _wait_time = 5 * 1000; _auto_time = 10 * 1000; _auto_time_min = 5 * 1000; _auto_time_max = 60 * 1000; _button_value_old = ""; _add_count = 0; _title_old = ""; // ボタン _element = DocumentCreateElement("input"); _element.type = "button"; ElementSetStyle(_element,CSSTextGetInitialButtonElement()); ElementAddStyle(_element,"width:100%; height:50px; margin:25px 0px; padding:0px;"); if(_element.addEventListener){ _element.addEventListener("mousedown",mouseDown); _element.addEventListener("click",mouseClick); }else if(_element.attachEvent){ _element.attachEvent("onmousedown",mouseDown); _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 = ""; 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.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); })(); })(); } // -------------------------------------------------------------------------------- // 掲示板コントロール DockingForm // -------------------------------------------------------------------------------- function BbsControlDockingForm(element,outsider){ var _this = this; // -------------------------------------------------------------------------------- // スタイルを設定 // -------------------------------------------------------------------------------- _this.setStyle = function(css_text){ _css_text_popup = css_text; }; // -------------------------------------------------------------------------------- // 要素を取得 // -------------------------------------------------------------------------------- _this.getElement = function(){ return _element; }; // -------------------------------------------------------------------------------- // リセット通知 // -------------------------------------------------------------------------------- _this.onreset = function(v){}; // -------------------------------------------------------------------------------- // 開放 // -------------------------------------------------------------------------------- _this.release = function(){ update("original"); if(_task){ _task.release(); _task = 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){ removeEvent(); if(outsider){ DomNodeRemove(_element); } _element = null; } DomNodeRemove(_element_border); }; // -------------------------------------------------------------------------------- // 返信用ポップアップ // -------------------------------------------------------------------------------- _this.popupForReply = function(element){ switch(_docking_type){ case "original": // ポップアップ update("popup"); // クライアントサイズ var client_size = DocumentGetClientSize(document); // バウンディングサイズ var hit_bounding_size; if(element){ if(DomNodeGetAttachedDocument(element)){ hit_bounding_size = ElementGetBoundingClientRect(element); } } 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(_element); 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; 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; } 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 }; // サイズ補正 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 style = _element.style; style.left = (pos.x) + "px"; style.top = (pos.y) + "px"; break; } }; // -------------------------------------------------------------------------------- // リセット通知(内部用) // -------------------------------------------------------------------------------- function dispatchReset(e){ if(_this.onreset) _this.onreset(); } // -------------------------------------------------------------------------------- // マウスダウン時に実行される関数(内部用) // -------------------------------------------------------------------------------- function mouseDown(e){ var target = (e.target || e.srcElement); if(_control_dic[target.tagName]) return; // マウス入力を更新 input_mouse.setMouseEvent(e); var rect = ElementGetBoundingClientRect(_element); _drag_ofs = { x:e.clientX - rect.left, y:e.clientY - rect.top }; // タスク起動 if(_task){ _task.release(); _task = null; } _task = task_container.createTask(); _task.setDestructorFunc(function(){ _task = null; }); _task.setExecuteFunc(DockingFormTaskInit); _task.execute(0xffffffff); // 戻す if(MouseEventGetChangedButtons(e) & 0x04){ update("original"); dispatchReset(); } if(e.preventDefault){ e.preventDefault(); }else{ return false; } } // -------------------------------------------------------------------------------- // 境界マウスダウン時に実行される関数(内部用) // -------------------------------------------------------------------------------- function mouseDownBorder(e){ // マウス入力を更新 input_mouse.setMouseEvent(e); // タスク起動 if(_task){ _task.release(); _task = null; } _task = task_container.createTask(); _task.setDestructorFunc(function(){ _task = null; }); _task.setExecuteFunc(function(){ var distance = 0; var mouse_pos = input_mouse.getPositionClient(); var client_size = DocumentGetClientSize(document); switch(_docking_type){ case "left": distance = mouse_pos.x; break; case "top": distance = mouse_pos.y; break; case "right": distance = client_size.width - mouse_pos.x; break; case "bottom": distance = client_size.height - mouse_pos.y; break; } moveBorder(distance); if(!(input_mouse.getButtonLeft())){ _task.release(); return; } }); _task.execute(0xffffffff); if(e.preventDefault){ e.preventDefault(); }else{ return false; } } // -------------------------------------------------------------------------------- // ダブルクリック(内部用) // -------------------------------------------------------------------------------- function mouseDoubleClick(e){ var target = (e.target || e.srcElement); if(_control_dic[target.tagName]) return; // マウス入力を更新 input_mouse.setMouseEvent(e); switch(_docking_type){ case "original": var rect = ElementGetBoundingClientRect(_element); _drag_ofs = { x:e.clientX - rect.left, y:e.clientY - rect.top }; update("popup"); var mouse_pos = ObjectCopy(input_mouse.getPositionClient()); var style = _element.style; var pos_x = mouse_pos.x - _drag_ofs.x; var pos_y = mouse_pos.y - _drag_ofs.y; style.left = (pos_x) + "px"; style.top = (pos_y) + "px"; break; case "popup": update("original"); dispatchReset(); break; default: if(_expand){ moveBorder(0); }else{ moveBorder(_expand_distance); } break; } } // -------------------------------------------------------------------------------- // イベントを外す(内部用) // -------------------------------------------------------------------------------- function removeEvent(){ if(_element.removeEventListener){ _element.removeEventListener("mousedown",mouseDown); _element.removeEventListener("dblclick",mouseDoubleClick); _element_border.removeEventListener("mousedown",mouseDownBorder); }else if(_element.detachEvent){ _element.detachEvent("onmousedown",mouseDown); _element.detachEvent("ondblclick",mouseDoubleClick); _element_border.detachEvent("onmousedown",mouseDownBorder); } } // -------------------------------------------------------------------------------- // タスク実行(内部用) // -------------------------------------------------------------------------------- function DockingFormTaskInit(task){ var work = task.getUserWork(); work.exec = DockingFormTaskDragWaitInit; _task.setExecuteFunc(DockingFormTaskExec); _task.execute(0xffffffff); } function DockingFormTaskExec(task){ var work = task.getUserWork(); if(work.exec) work.exec(task); if(!(input_mouse.getButtonLeft())){ task.release(); return; } } // -------------------------------------------------------------------------------- // ドラッグ待機(内部用) // -------------------------------------------------------------------------------- function DockingFormTaskDragWaitInit(task){ var work = task.getUserWork(); work.mouse_pos_start = input_mouse.getPositionClient(); work.exec = DockingFormTaskDragWaitExec; work.exec(task); } function DockingFormTaskDragWaitExec(task){ var work = task.getUserWork(); var mouse_pos = input_mouse.getPositionClient(); var x = mouse_pos.x - work.mouse_pos_start.x; var y = mouse_pos.y - work.mouse_pos_start.y; var l = Math.sqrt(x * x + y * y); if(l > 5){ work.exec = DockingFormTaskDragMoveInit; } } // -------------------------------------------------------------------------------- // ドラッグ移動(内部用) // -------------------------------------------------------------------------------- function DockingFormTaskDragMoveInit(task){ var work = task.getUserWork(); work.exec = DockingFormTaskDragMoveExec; work.exec(task); } function DockingFormTaskDragMoveExec(task){ var work = task.getUserWork(); var mouse_pos = ObjectCopy(input_mouse.getPositionClient()); var range = 10; var client_size = DocumentGetClientSize(document); if(mouse_pos.x < 0 + range){ update("left"); }else if(mouse_pos.y < 0 + range){ update("top"); }else if(mouse_pos.x > client_size.width - range){ update("right"); }else if(mouse_pos.y > client_size.height - range){ update("bottom"); }else{ update("popup"); } if(_docking_type == "popup"){ var style = _element.style; var pos_x = mouse_pos.x - _drag_ofs.x; var pos_y = mouse_pos.y - _drag_ofs.y; style.left = (pos_x) + "px"; style.top = (pos_y) + "px"; } } // -------------------------------------------------------------------------------- // 更新(内部用) // -------------------------------------------------------------------------------- function update(type){ if(_docking_type == type) return; var style_form = _element.style; var style_html = document.documentElement.style; var style_border = _element_border.style; // 戻す switch(_docking_type){ case "left": style_html.marginLeft = "0px"; break; case "top": style_html.marginTop = "0px"; break; case "right": style_html.marginRight = "0px"; break; case "bottom": style_html.paddingBottom = "0px"; break; } _docking_type = type; _docking_distance = 0; DomNodeRemove(_element_border); style_form.cssText = _css_text_popup; style_form.position = "fixed"; style_form.left = "0px"; style_form.top = "0px"; style_form.right = "auto"; style_form.bottom = "auto"; style_form.width = "auto"; style_form.height = "auto"; var rect = ElementGetBoundingClientRect(_element); var range = 2; if(_drag_ofs.x < range) _drag_ofs.x = range; if(_drag_ofs.y < range) _drag_ofs.y = range; if(_drag_ofs.x > rect.right - range) _drag_ofs.x = rect.right - range; if(_drag_ofs.y > rect.bottom - range) _drag_ofs.y = rect.bottom - range; var client_size = DocumentGetClientSize(document); var href_w = client_size.width * 0.5; var href_h = client_size.height * 0.5; var w = rect.right - rect.left; var h = rect.bottom - rect.top; if(w > href_w) w = href_w; if(h > href_h) h = href_h; switch(type){ case "original": style_form.cssText = _css_text_original; break; default: style_form.cssText = _css_text_popup; style_form.position = "fixed"; style_form.zIndex = 0x7FFFFFFF - 2; style_form.width = "auto"; style_form.height = "auto"; switch(type){ case "popup": break; default: style_form.overflow = "auto"; style_border.cssText = "position:fixed;"; style_border.zIndex = 0x7FFFFFFF - 2; document.body.appendChild(_element_border); break; } break; } style_form.cursor = "move"; switch(type){ case "left": style_form.left = "0px"; style_border.left = "0px"; break; case "right": style_form.right = "0px"; style_border.right = "0px"; break; case "top": style_form.top = "0px"; style_border.top = "0px"; break; case "bottom": style_form.bottom = "0px"; style_border.bottom = "0px"; break; } switch(_docking_type){ case "left": case "right": style_form.top = "0px"; style_form.bottom = "0px"; style_border.cursor = "col-resize"; style_border.top = "0px"; style_border.bottom = "0px"; style_border.width = "6px"; moveBorder(w); break; case "top": case "bottom": style_form.left = "0px"; style_form.right = "0px"; style_border.cursor = "row-resize"; style_border.left = "0px"; style_border.right = "0px"; style_border.height = "6px"; moveBorder(h); break; } } // -------------------------------------------------------------------------------- // 境界移動(内部用) // -------------------------------------------------------------------------------- function moveBorder(distance){ var style_form = _element.style; var style_html = document.documentElement.style; var style_border = _element_border.style; var size_obj = ComputedStyleGetSize(ElementGetComputedStyle(_element,"")); switch(_docking_type){ case "left": case "right": var w = distance - size_obj.paddingLeft - size_obj.paddingRight - size_obj.borderLeft - size_obj.borderRight; if(w < 0) w = 0; style_form.width = (w) + "px"; break; case "top": case "bottom": var h = distance - size_obj.paddingTop - size_obj.paddingBottom - size_obj.borderTop - size_obj.borderBottom; if(h < 0) h = 0; style_form.height = (h) + "px"; break; }; _expand = true; var rect = ElementGetBoundingClientRect(_element); switch(_docking_type){ case "left": case "right": var w = rect.right - rect.left; if(distance < w){ _expand = false; distance = w; } break; case "top": case "bottom": var h = rect.bottom - rect.top; if(distance < h){ _expand = false; distance = h; } break; }; var v = distance - 3; switch(_docking_type){ case "left": style_border.marginLeft = v + "px"; break; case "top": style_border.marginTop = v + "px"; break; case "right": style_border.marginRight = v + "px"; break; case "bottom": style_border.marginBottom = v + "px"; break; }; var v = distance + 10; var s = distance - _docking_distance; var scroll_pos = WindowGetScrollPosition(window); switch(_docking_type){ case "left": style_html.marginLeft = v + "px"; break; case "top": style_html.marginTop = v + "px"; break; case "right": style_html.marginRight = v + "px"; WindowSetScrollPositionX(window,scroll_pos.x + s); break; case "bottom": style_html.paddingBottom = v + "px"; WindowSetScrollPositionY(window,scroll_pos.y + s); break; }; _docking_distance = distance; if(_expand){ _expand_distance = distance; } } // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _element; var _element_border; var _css_text_popup; var _css_text_original; var _drag_ofs; var _docking_type; var _docking_distance; var _expand; var _expand_distance; var _control_dic; var _task; var _analyze_work; var _observer_remove; var _event_handler_abort; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ if(element){ _element = element; element = null; }else{ _element = DocumentCreateElement("div"); } _element_border = DocumentCreateElement("div"); _css_text_original = _element.style.cssText; _drag_ofs = {x:0.0,y:0.0}; _docking_type = ""; _docking_distance = 0; _expand = false; _expand_distance = 0; _control_dic = { "INPUT":true, "BUTTON":true, "TEXTAREA":true, "SELECT":true, "FIELDSET":true, "KEYGEN":true, "OBJECT":true, "EMBED":true, "CANVAS":true }; if(_element.addEventListener){ _element.addEventListener("mousedown",mouseDown); _element.addEventListener("dblclick",mouseDoubleClick); _element_border.addEventListener("mousedown",mouseDownBorder); }else if(_element.attachEvent){ _element.attachEvent("onmousedown",mouseDown); _element.attachEvent("ondblclick",mouseDoubleClick); _element_border.attachEvent("onmousedown",mouseDownBorder); } // 解析ワーク作成 _analyze_work = AnalyzeWorkCreate(_element); // 解析済み 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(); }); update("original"); })(); } // -------------------------------------------------------------------------------- // 掲示板コントロールの不要物検索 // -------------------------------------------------------------------------------- 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 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 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; } } // -------------------------------------------------------------------------------- // コンソールにログ出力 // -------------------------------------------------------------------------------- function ConsoleLog(obj){ try{ console.log(obj); }catch(e){} } // -------------------------------------------------------------------------------- // コンソールにエラー出力 // -------------------------------------------------------------------------------- function ConsoleError(obj){ try{ console.error(obj); }catch(e){} } // -------------------------------------------------------------------------------- // Promise 生成 // -------------------------------------------------------------------------------- function PromiseCreate(executor){ try{ return (new Promise(executor)); }catch(e){ } var completed = false; var result; var callback_resolve; var callback_reject; var argument_value; var argument_reason; var promise = new Object(); promise.then = function(resolve , reject){ callback_resolve = resolve; callback_reject = reject; receive(); }; var receive = function(){ if(!completed) return; if(result){ if(!callback_resolve) return; callback_resolve(argument_value); }else{ if(!callback_reject) return; callback_reject(argument_reason); } }; executor( function onFulfilled(value){ completed = true; result = true; argument_value = value; receive(); }, function onRejected(reason){ completed = true; result = false; argument_reason = reason; receive(); } ); return promise; } // -------------------------------------------------------------------------------- // 文字列から 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 + ")"); } // -------------------------------------------------------------------------------- // Base64 文字列のバイナリサイズを取得 // -------------------------------------------------------------------------------- function Base64_get_ByteLength(base64){ var num = base64.length; var e = Math.ceil(num / 4) * 3; switch(num % 4){ case 0: if(base64.charAt(num - 1) == '=') e -= 1; if(base64.charAt(num - 2) == '=') e -= 1; break; case 2: e -= 2; break; case 3: e -= 1; break; case 1: e = 0; break; } return e; } // -------------------------------------------------------------------------------- // 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; if(typeof(options) != "object") options = {}; var increment = options.increment || 1024; var onprogress = options.onprogress || null; var i = 0; var j = 0; function f(){ while(i < num){ b = ary_u8[i]; base64.push(dic[(b >> 2)]); n = (b & 0x03) << 4; i ++; if(i >= num) break; b = ary_u8[i]; base64.push(dic[n | (b >> 4)]); n = (b & 0x0f) << 2; i ++; if(i >= num) break; b = ary_u8[i]; base64.push(dic[n | (b >> 6)]); base64.push(dic[(b & 0x3f)]); i ++; j += 3; if(j > increment){ j = 0; if(onprogress){ onprogress({loaded:i,total:num}); } execute_queue.attachFirst(f,null); return; } } var m = num % 3; if(m){ base64.push(dic[n]); } if(m == 1){ base64.push("=="); }else if(m == 2){ base64.push("="); } callback(base64.join("")); } execute_queue.attachFirst(f,null); } // -------------------------------------------------------------------------------- // x-user-defined 文字列から Base64 文字列に変換する (非同期実行) // -------------------------------------------------------------------------------- function Base64_From_XUserDefined_Async(x_user_defined,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 num = x_user_defined.length; var n = 0; var b = 0; if(typeof(options) != "object") options = {}; var increment = options.increment || 1024; var onprogress = options.onprogress || null; var i = 0; var j = 0; function f(){ while(i < num){ b = x_user_defined.charCodeAt(i) & 0xff; base64.push(dic[(b >> 2)]); n = (b & 0x03) << 4; i ++; if(i >= num) break; b = x_user_defined.charCodeAt(i) & 0xff; base64.push(dic[n | (b >> 4)]); n = (b & 0x0f) << 2; i ++; if(i >= num) break; b = x_user_defined.charCodeAt(i) & 0xff; base64.push(dic[n | (b >> 6)]); base64.push(dic[(b & 0x3f)]); i ++; j += 3; if(j > increment){ j = 0; if(onprogress){ onprogress({loaded:i,total:num}); } execute_queue.attachFirst(f,null); return; } } var m = num % 3; if(m){ base64.push(dic[n]); } if(m == 1){ base64.push("=="); }else if(m == 2){ base64.push("="); } callback(base64.join("")); } execute_queue.attachFirst(f,null); } // -------------------------------------------------------------------------------- // Base64 文字列から ArrayBuffer に変換する関数 (同期実行) // -------------------------------------------------------------------------------- function Base64_To_ArrayBuffer(base64){ var dic = new Object(); dic[0x41]= 0; dic[0x42]= 1; dic[0x43]= 2; dic[0x44]= 3; dic[0x45]= 4; dic[0x46]= 5; dic[0x47]= 6; dic[0x48]= 7; dic[0x49]= 8; dic[0x4a]= 9; dic[0x4b]=10; dic[0x4c]=11; dic[0x4d]=12; dic[0x4e]=13; dic[0x4f]=14; dic[0x50]=15; dic[0x51]=16; dic[0x52]=17; dic[0x53]=18; dic[0x54]=19; dic[0x55]=20; dic[0x56]=21; dic[0x57]=22; dic[0x58]=23; dic[0x59]=24; dic[0x5a]=25; dic[0x61]=26; dic[0x62]=27; dic[0x63]=28; dic[0x64]=29; dic[0x65]=30; dic[0x66]=31; dic[0x67]=32; dic[0x68]=33; dic[0x69]=34; dic[0x6a]=35; dic[0x6b]=36; dic[0x6c]=37; dic[0x6d]=38; dic[0x6e]=39; dic[0x6f]=40; dic[0x70]=41; dic[0x71]=42; dic[0x72]=43; dic[0x73]=44; dic[0x74]=45; dic[0x75]=46; dic[0x76]=47; dic[0x77]=48; dic[0x78]=49; dic[0x79]=50; dic[0x7a]=51; dic[0x30]=52; dic[0x31]=53; dic[0x32]=54; dic[0x33]=55; dic[0x34]=56; dic[0x35]=57; dic[0x36]=58; dic[0x37]=59; dic[0x38]=60; dic[0x39]=61; dic[0x2b]=62; dic[0x2f]=63; var num = base64.length; var n = 0; var b = 0; var e; e = Math.ceil(num / 4) * 3; switch(num % 4){ case 0: if(base64.charAt(num - 1) == '=') e -= 1; if(base64.charAt(num - 2) == '=') e -= 1; break; case 2: e -= 2; break; case 3: e -= 1; break; case 1: return null; } var ary_buffer = new ArrayBuffer( e ); var ary_u8 = new Uint8Array( ary_buffer ); var i = 0; var p = 0; while(p < e){ b = dic[base64.charCodeAt(i)]; if(b === undefined) return null; n = (b << 2); i ++; b = dic[base64.charCodeAt(i)]; if(b === undefined) return null; ary_u8[p] = n | ((b >> 4) & 0x3); n = (b & 0x0f) << 4; i ++; p ++; if(p >= e) break; b = dic[base64.charCodeAt(i)]; if(b === undefined) return null; ary_u8[p] = n | ((b >> 2) & 0xf); n = (b & 0x03) << 6; i ++; p ++; if(p >= e) break; b = dic[base64.charCodeAt(i)]; if(b === undefined) return null; ary_u8[p] = n | b; i ++; p ++; } return ary_buffer; } // -------------------------------------------------------------------------------- // Base64 文字列から ArrayBuffer に変換する関数 (非同期実行) // -------------------------------------------------------------------------------- function Base64_To_ArrayBuffer_Async(base64,callback,options){ var dic = new Object(); dic[0x41]= 0; dic[0x42]= 1; dic[0x43]= 2; dic[0x44]= 3; dic[0x45]= 4; dic[0x46]= 5; dic[0x47]= 6; dic[0x48]= 7; dic[0x49]= 8; dic[0x4a]= 9; dic[0x4b]=10; dic[0x4c]=11; dic[0x4d]=12; dic[0x4e]=13; dic[0x4f]=14; dic[0x50]=15; dic[0x51]=16; dic[0x52]=17; dic[0x53]=18; dic[0x54]=19; dic[0x55]=20; dic[0x56]=21; dic[0x57]=22; dic[0x58]=23; dic[0x59]=24; dic[0x5a]=25; dic[0x61]=26; dic[0x62]=27; dic[0x63]=28; dic[0x64]=29; dic[0x65]=30; dic[0x66]=31; dic[0x67]=32; dic[0x68]=33; dic[0x69]=34; dic[0x6a]=35; dic[0x6b]=36; dic[0x6c]=37; dic[0x6d]=38; dic[0x6e]=39; dic[0x6f]=40; dic[0x70]=41; dic[0x71]=42; dic[0x72]=43; dic[0x73]=44; dic[0x74]=45; dic[0x75]=46; dic[0x76]=47; dic[0x77]=48; dic[0x78]=49; dic[0x79]=50; dic[0x7a]=51; dic[0x30]=52; dic[0x31]=53; dic[0x32]=54; dic[0x33]=55; dic[0x34]=56; dic[0x35]=57; dic[0x36]=58; dic[0x37]=59; dic[0x38]=60; dic[0x39]=61; dic[0x2b]=62; dic[0x2f]=63; var num = base64.length; var n = 0; var b = 0; var e; if(typeof(options) != "object") options = {}; var increment = options.increment || 1024; var onprogress = options.onprogress || null; e = Math.ceil(num / 4) * 3; switch(num % 4){ case 0: if(base64.charAt(num - 1) == '=') e -= 1; if(base64.charAt(num - 2) == '=') e -= 1; break; case 2: e -= 2; break; case 3: e -= 1; break; case 1: callback(null); return; } var ary_buffer = new ArrayBuffer( e ); var ary_u8 = new Uint8Array( ary_buffer ); var i = 0; var j = 0; var p = 0; function f(){ while(p < e){ b = dic[base64.charCodeAt(i)]; if(b === undefined){ callback(null); return; } n = (b << 2); i ++; b = dic[base64.charCodeAt(i)]; if(b === undefined){ callback(null); return; } ary_u8[p] = n | ((b >> 4) & 0x3); n = (b & 0x0f) << 4; i ++; p ++; if(p >= e) break; b = dic[base64.charCodeAt(i)]; if(b === undefined){ callback(null); return; } ary_u8[p] = n | ((b >> 2) & 0xf); n = (b & 0x03) << 6; i ++; p ++; if(p >= e) break; b = dic[base64.charCodeAt(i)]; if(b === undefined){ callback(null); return; } ary_u8[p] = n | b; i ++; p ++; j += 4; if(j > increment){ j = 0; execute_queue.attachFirst(f,null); return; } } callback(ary_buffer); } 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 // -------------------------------------------------------------------------------- var CRC32 = (function(){ var t = [ 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 ]; var CRC32 = function(){ this.initialize(); }; CRC32.prototype = { initialize:function(){ delete this.pos; delete this.crc32; }, getFromArrayBuffer:function(buffer,pos,size){ pos = pos || 0; size = size || (buffer.byteLength - pos); var a = new Uint8Array(buffer,pos,size); var i; for (i=0;i>> 8); } this.pos += size; return (this.crc32 ^ 0xffffffff) >>> 0; }, getFromStringOfBinaryData:function(buffer,pos,size){ var total = buffer.length; pos = pos || 0; size = size || total; size += pos; if(pos > total) pos = total; if(size > total) size = total; this.pos += size - pos; while(pos>> 8); pos ++; } return (this.crc32 ^ 0xffffffff) >>> 0; }, getFromString:function(buffer,pos,size){ var total = buffer.length; pos = pos || 0; size = size || total; size += pos; if(pos > total) pos = total; if(size > total) size = total; this.pos += (size - pos) * 2; while(pos>> 8) & 0xff)) & 0xff] ^ (this.crc32 >>> 8); this.crc32 = t[(this.crc32 ^ ((code >>> 0) & 0xff)) & 0xff] ^ (this.crc32 >>> 8); pos ++; } return (this.crc32 ^ 0xffffffff) >>> 0; }, pos:0, crc32:0xffffffff, }; return CRC32; })(); // -------------------------------------------------------------------------------- // MIMEType 辞書 // -------------------------------------------------------------------------------- var MIMEType_To_Ext; var MIMEType_From_Ext; var MIMEType_is_Archive; var MIMEType_is_Same; (function(){ var list = { "image":[ {sub:["png"],ext:["png"]}, {sub:["apng","vnd.mozilla.apng"],ext:["apng"]}, {sub:["bmp"],ext:["bmp"]}, {sub:["gif"],ext:["gif"]}, {sub:["jpeg"],ext:["jpg","jpeg","jpe","pjpeg","pjpg","pjp","jfif","jfi","jif"]}, {sub:["avif"],ext:["avif"]}, {sub:["svg+xml"],ext:["svg","svgz"]}, {sub:["x-tga"],ext:["tga"]}, {sub:["tiff"],ext:["tif","tiff"]}, {sub:["webp"],ext:["webp"]}, {sub:["x-icon"],ext:["ico"]}, {sub:["image/vnd.adobe.photoshop"],ext:["psd"]} ], "audio":[ {sub:["mp4"],ext:["m4a","m4b","m4r","mp4a"]}, {sub:["x-aac"],ext:["aac"]}, {sub:["midi","x-midi"],ext:["mid","midi","kar","rmi"]}, {sub:["mpeg"],ext:["mp3","m2a","m3a","mp1","mp2","mp2a","mpa","mpga"]}, {sub:["ogg"],ext:["oga","ogg","spx","opus"]}, {sub:["x-wav"],ext:["wav"]}, {sub:["webm"],ext:["weba"]}, {sub:["x-aiff"],ext:["aif","aifc","aiff"]}, {sub:["x-matroska"],ext:["mka"]} ], "video":[ {sub:["mpeg"],ext:["mpg","m1v","m2v","mpe","mpeg"]}, {sub:["mp4"],ext:["mp4","m4v","mp4v","mpg4"]}, {sub:["webm"],ext:["webm"]}, {sub:["ogg"],ext:["ogv"]}, {sub:["x-msvideo"],ext:["avi"]}, {sub:["x-ms-wmv"],ext:["wmv"]}, {sub:["x-ms-asf"],ext:["asf","asx"]}, {sub:["x-flv"],ext:["flv"]}, {sub:["x-matroska"],ext:["mkv","mk3d","mks"]} ], "text":[ {sub:["plain"],ext:["txt","text","log"]}, {sub:["html"],ext:["html","htm","php","cgi","asp","aspx"]}, {sub:["javascript"],ext:["js"]}, {sub:["css"],ext:["css"]}, {sub:["csv"],ext:["csv"]}, {sub:["markdown"],ext:["md"]} ], "application":[ {sub:["xml"],ext:["xml","xsl"]}, {sub:["rdf+xml"],ext:["rdf"]}, {sub:["json"],ext:["json"]}, {sub:["pdf"],ext:["pdf"]}, {sub:["rtf"],ext:["rtf"]}, {sub:["vnd.msword"],ext:["doc","dot"]}, {sub:["vnd.ms-excel"],ext:["xls","xlm","xla","xlc","xlt","xlw"]}, {sub:["vnd.ms-powerpoint"],ext:["ppt","pps","pot"]}, {sub:["vnd.openxmlformats-officedocument.wordprocessingml.document"],ext:["docx"]}, {sub:["vnd.openxmlformats-officedocument.spreadsheetml.sheet"],ext:["xlsx"]}, {sub:["vnd.openxmlformats-officedocument.presentationml.presentation"],ext:["pptx"]}, {sub:["vnd.oasis.open­document.text"],ext:["odt"]}, {sub:["vnd.oasis.opendocument.spreadsheet"],ext:["ods"]}, {sub:["vnd.oasis.opendocument.presentation"],ext:["odp"]}, {sub:["vnd.oasis.opendocument.database"],ext:["odb"]}, {sub:["vnd.oasis.opendocument.graphics"],ext:["odg"]}, {sub:["vnd.oasis.opendocument.formula"],ext:["odf"]}, {sub:["x-iso9660-image"],ext:["iso"]}, {sub:["x-msdownload"],ext:["exe","dll","bat","msi"]} // {sub:["octet-stream"],ext:["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy"]} ], "archive":[ {sub:["x-7z-compressed"],ext:["7z"]}, {sub:["x-ace-compressed"],ext:["ace"]}, {sub:["x-bzip"],ext:["bz"]}, {sub:["x-bzip2"],ext:["bz2","boz"]}, {sub:["vnd.ms-cab-compressed"],ext:["cab"]}, {sub:["x-cfs-compressed"],ext:["cfs"]}, {sub:["x-dgc-compressed"],ext:["dgc"]}, {sub:["x-gca-compressed"],ext:["gca"]}, {sub:["x-gzip","gzip"],ext:["gz"]}, {sub:["x-lzh-compressed"],ext:["lzh","lha"]}, {sub:["x-tar"],ext:["tar"]}, {sub:["x-rar-compressed","vnd.rar"],ext:["rar"]}, {sub:["x-xz"],ext:["xz"]}, {sub:["x-compress"],ext:["z"]}, {sub:["zip","x-zip-compressed"],ext:["zip"]} ] }; var type_form_x = { "archive":"application" }; var type_to_x = { "application":"archive" }; // -------------------------------------------------------------------------------- // MIMEタイプから拡張子を取得 // -------------------------------------------------------------------------------- (function(){ var dic = new Object(); var i,j; var type; for(type in list){ var o = dic[type] = new Object(); var a = list[type]; var a_num = a.length; for(i=0;i>> 8){ case 0x474946: return "gif"; } switch(data_view.getUint32(0,false)){ case 0x52494646: return "webp"; } if(size < 8) return ""; if((data_view.getUint32(0,false) == 0x89504E47) && (data_view.getUint32(4,false) == 0x0D0A1A0A)){ return "png"; } return ""; } // -------------------------------------------------------------------------------- // 文字列から ArrayBuffer に変換(UTF-8) // -------------------------------------------------------------------------------- function String_To_ArrayBuffer_As_UTF8(str){ var i; var p; var num; var list = new Array(); var size = 0; p = 0; num = str.length; while(p < num){ var c0 = str.charCodeAt(p); p += 1; if((c0 & 0xFC00) == 0xD800){ var c1 = str.charCodeAt(p) || 0; if((c1 & 0xFC00) == 0xDC00){ c0 = (((c0 - 0xD800) << 10) | ((c1 - 0xDC00) & 0x3FF)) + 0x10000; p += 1; } } if(c0 < 0x80){ size += 1; }else if(c0 < 0x800){ size += 2; }else if(c0 < 0x10000){ size += 3; }else if(c0 < 0x200000){ size += 4; }else if(c0 < 0x4000000){ size += 5; }else{ size += 6; } list.push(c0); } var a = new Uint8Array(size); p = 0; var i; var num = list.length; for(i=0;i>> 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; } // -------------------------------------------------------------------------------- // ArrayBuffer から文字列に変換(UTF-8) // -------------------------------------------------------------------------------- function String_From_ArrayBuffer_As_UTF8(ary){ var str = new Array(); var a = new Uint8Array(ary); var size = a.byteLength; var p = 0; var c; while(p < size){ if((a[p+0] & 0xC0) == 0x80){ p += 1; }else if((a[p+0] & 0x80) == 0x00){ c = (a[p+0] & 0x7f); str.push(String.fromCharCode(c)); p += 1; }else if((a[p+0] & 0xe0) == 0xc0){ c = ( ((a[p+0] & 0x1c) >> 2) << 8) | ((((a[p+0] & 0x03) << 6) | ((a[p+1] & 0x3f) << 0)) << 0); str.push(String.fromCharCode(c)); p += 2; }else if((a[p+0] & 0xF0) == 0xe0){ c = ((((a[p+0] & 0x0f) << 4) | ((a[p+1] & 0x3c) >> 2)) << 8) | ((((a[p+1] & 0x03) << 6) | ((a[p+2] & 0x3f) << 0)) << 0); str.push(String.fromCharCode(c)); p += 3; }else if((a[p+0] & 0xf8) == 0xf0){ c = ((((a[p+0] & 0x07) << 2) | ((a[p+1] & 0x30) >> 4)) << 16) | ((((a[p+1] & 0x0f) << 4) | ((a[p+2] & 0x3c) >> 2)) << 8) | ((((a[p+2] & 0x03) << 6) | ((a[p+3] & 0x3f) << 0)) << 0); str.push(String.fromCharCode( ((c - 0x10000) >>> 10) + 0xD800 , ((c - 0x10000) & 0x3FF) + 0xDC00 )); p += 4; }else if((a[p+0] & 0xfc) == 0xf8){ c = ( ((a[p+0] & 0x03) << 0) << 24) | ((((a[p+1] & 0x3f) << 2) | ((a[p+2] & 0x30) >> 4)) << 16) | ((((a[p+2] & 0x0f) << 4) | ((a[p+3] & 0x3c) >> 2)) << 8) | ((((a[p+3] & 0x03) << 6) | ((a[p+4] & 0x3f) << 0)) << 0); str.push(String.fromCodePoint(c)); p += 5; }else if((a[p+0] & 0xfe) == 0xfc){ c = ((((a[p+0] & 0x01) << 6) | ((a[p+1] & 0x3f) << 0)) << 24) | ((((a[p+2] & 0x3f) << 2) | ((a[p+3] & 0x30) >> 4)) << 16) | ((((a[p+3] & 0x0f) << 4) | ((a[p+4] & 0x3c) >> 2)) << 8) | ((((a[p+4] & 0x03) << 6) | ((a[p+5] & 0x3f) << 0)) << 0); str.push(String.fromCodePoint(c)); p += 6; }else{ break; } } return str.join(""); } // -------------------------------------------------------------------------------- // DataViewに符号なし64bitを書き込む(大きすぎる場合下位が不正確) // -------------------------------------------------------------------------------- function DataView_setUint64(data,p,v,e){ data.setUint32(p,(v%0x100000000),e); data.setUint32(p+4,Math.floor(v/0x100000000),e); } // -------------------------------------------------------------------------------- // ResponseHeaders パーサー // -------------------------------------------------------------------------------- function ResponseHeadersParser(str){ var _this = this; // -------------------------------------------------------------------------------- // ローカル変数 // -------------------------------------------------------------------------------- var dic = new Object(); // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ var s = str.replace(/\r\n?/g,"\n"); var a = s.split("\n"); var index = 0; var i; var num = a.length; for(i=0;i=0;i--){ var item = _item_list[i]; delete _item_list[i]; try{ //GM_unregisterMenuCommand(item.id); }catch(e){ } } }; // -------------------------------------------------------------------------------- // 追加 // -------------------------------------------------------------------------------- _this.addItem = function(caption, commandFunc, accessKey){ var key_code = 0; if(accessKey){ key_code = accessKey.toLocaleUpperCase().charCodeAt(0) || 0; } var item = { caption:caption, callback:commandFunc, key_code:key_code }; _item_list.push(item); try{ item.id = GM.registerMenuCommand(caption, commandFunc, accessKey); return; }catch(e){ } try{ item.id = GM_registerMenuCommand(caption, commandFunc, accessKey); return; }catch(e){ } }; // -------------------------------------------------------------------------------- // プライベート変数 // -------------------------------------------------------------------------------- var _item_list; // -------------------------------------------------------------------------------- // 初期化 // -------------------------------------------------------------------------------- (function(){ _item_list = new Array(); })(); } GMW_MenuCommand.isSupported = function(){ try{ if(GM.registerMenuCommand) return true; }catch(e){ } 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(GMW_LocalStorage.isSupported()){ var storage = new GMW_LocalStorage(); var promise = storage.getItem(key); promise.then( function(value){ func({result:true,value:value}); }, function(reason){ func({result:false,message:reason}); } ); }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(GMW_LocalStorage.isSupported()){ var storage = new GMW_LocalStorage(); var promise = storage.setItem(key,str); promise.then( function(value){ func({result:true,value:value}); }, function(reason){ func({result:false,message:reason}); } ); }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(GMW_LocalStorage.isSupported()){ var storage = new GMW_LocalStorage(); var promise = storage.removeItem(key); promise.then( function(value){ func({result:true,value:value}); }, function(reason){ func({result:false,message:reason}); } ); }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, " "); } // -------------------------------------------------------------------------------- // 半角カタカナから全角カタカナに変換 // -------------------------------------------------------------------------------- var StringConvertFromKatakanaFullToKatakanaHalf = (function(){ var data_g = ["ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ヅ","デ","ド","バ","ビ","ブ","ベ","ボ"]; var re_g = new RegExp("ガ|ギ|グ|ゲ|ゴ|ザ|ジ|ズ|ゼ|ゾ|ダ|ヂ|ヅ|デ|ド|バ|ビ|ブ|ベ|ボ","g"); var data_p = ["パ","ピ","プ","ペ","ポ"]; var re_p = new RegExp("パ|ピ|プ|ペ|ポ","g"); var data_o = ["。","「","」","、","・","ヲ","ァ","ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ","ー","ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ","タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ン","゛","゜"]; var re_o = new RegExp("[。-゚]","g"); return function (s){ // 濁点 s = s.replace(re_g, function(c){ var code = c.charCodeAt(0); if(code <= 65409) return data_g[code-65398]; if(code >= 65418) return data_g[code-65418 + 15]; return data_g[code-65410 + 12]; }); // 半濁点 s = s.replace(re_p, function(c){ var code = c.charCodeAt(0); return data_p[code-65418]; }); // その他 s = s.replace(re_o, function(c){ return data_o[c.charCodeAt(0)-65377]; }); return s; }; })(); // -------------------------------------------------------------------------------- // 全角カタカナから半角カタカナに変換 // -------------------------------------------------------------------------------- var StringConvertFromKatakanaHalfToKatakanaFull = (function(){ 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 function (s){ 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 StringConvert_From_CharacterReferences_To_Text(html){ var element = document.createElement("span"); var re = new RegExp("(&#[0-9]{1,};)|(&#x[0-9a-f]{1,};)|(&[0-9a-z]{2,};)","gi"); return html.replace(re , function(c){ element.innerHTML = c; return ElementGetTextContent(element); }); } // -------------------------------------------------------------------------------- // 文字列を評価して配列関数を作成 // -------------------------------------------------------------------------------- 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 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|~]+)/); if(m){ ext = m[1]; } } return { protocol:parser.protocol, username:parser.username, password:parser.password, port:parser.port, host:parser.host, hostname:parser.hostname, origin:parser.origin, pathname:pathname, filename:filename, name:name, ext:ext, search:parser.search, hash:parser.hash }; }catch(e){ } try{ if(url.length > 2048) throw 0; var m; var n = url; m = n.match(/([#].*)$/); if(m){ hash = m[1]; n = RegExp.leftContext; } m = n.match(/([?].*)/); if(m){ search = m[1]; n = RegExp.leftContext; } m = n.match(/^([^:]+:)/); if(m){ protocol = m[1]; n = RegExp.rightContext; } m = protocol.match(/^(http|https|ftp|file|ws|wss):/); special_scheme = Boolean(m); if(special_scheme){ m = n.match(/^([/]*)/); if(m){ n = RegExp.rightContext; } if(protocol.match(/^(file):/)){ n = "/" + n; } m = n.match(/^([^/]*)/); if(m){ pathname = RegExp.rightContext; n = m[1]; } }else{ pathname = n; n = ""; } m = pathname.match(/([^/]+)([/]*)$/); if(m) filename = m[1]; m = filename.match(/[.]([^.]*)$/); if(m){ ext = m[1]; name = RegExp.leftContext; }else{ name = filename; } m = n.match(/([^@]*)@/); if(m){ host = RegExp.rightContext; n = m[1]; }else{ host = n; n = ""; } m = host.match(/:([^:]*)$/); if(m){ port = m[1]; hostname = RegExp.leftContext; }else{ hostname = host; } m = n.match(/[:]([^:]*)$/); if(m){ password = m[1]; username = RegExp.leftContext; }else{ username = n; } if(special_scheme){ origin = protocol + "//" + hostname; if(port) origin += ":" + port; } }catch(e){ } return { protocol:protocol, username:username, password:password, port:port, host:host, hostname:hostname, origin:origin, pathname:pathname, filename:filename, name:name, ext:ext, search:search, hash:hash }; } // -------------------------------------------------------------------------------- // Data URL パーサー // -------------------------------------------------------------------------------- function DataURL_Parser(url){ var mimetype = ""; var charset = ""; var format = ""; var offset = 0; var m; m = url.match(/^data:/i); if(!m) return null; offset = url.indexOf(","); if(offset < 0) return null; var ary = url.slice(5,offset).split(";"); var s; s = ary.shift() || ""; m = s.match(/.+[/].+/); if(m){ mimetype = m[0]; s = ary.shift() || ""; } m = s.match(/^charset=(.*)/i); if(m){ charset = m[1]; s = ary.shift() || ""; } if(s.match(/^base64$/i)){ format = "base64"; }else{ format = "text"; } offset += 1; return { mimetype:mimetype, charset:charset, format:format, data_offset:offset, data_size:(url.length - offset) }; } // -------------------------------------------------------------------------------- // srcset パーサー // -------------------------------------------------------------------------------- function SrcSet_Parser(element){ var a = new Array(); var o = new Object(); var srcset = element.srcset || ""; var p = 0; var re0 = new RegExp("[^ ,]+","g"); var re1 = new RegExp("data:[^,]*,[^ ,]*","gy"); var m0,m1,m2; while(true){ re0.lastIndex = p; m0 = re0.exec(srcset); if(!m0) break; re1.lastIndex = m0.index; m1 = re1.exec(srcset); if(m1){ p = re1.lastIndex; o = {url:m1[0]}; a.push(o); continue; } p = re0.lastIndex; m2 = m0[0].match(/^([0-9.]+)x$/); if(m2){ o.pixelDensity = parseFloat(m2[1]); continue; } m2 = m0[0].match(/^([0-9]+)w$/); if(m2){ o.width = parseInt(m2[1]); continue; } o = {url:StringUrl_To_Absolute(m0[0],element.baseURI)}; a.push(o); } return a; } // -------------------------------------------------------------------------------- // 文字列リテラルから文字列に変換 // -------------------------------------------------------------------------------- function StringLiteral_To_String(str){ // 引用符 var q; var m; if(!q){ m = str.match(/^"(.*)"$/); if(m){ q = '"'; str = m[1]; } } if(!q){ m = str.match(/^'(.*)'$/); if(m){ q = '"'; str = m[1]; } } if(!q) return null; function getChar(s){ var n = 0; var d = 1; var i; for(i=s.length-1;i>=0;i--){ var c = s.charCodeAt(i); if(c >= 97) c -= 87; if(c >= 65) c -= 55; if(c >= 48) c -= 48; n += d * c; d *= 16; } return String.fromCharCode(n); } // Unicodeスカラ値 str = str.replace(new RegExp("\\\\u([0-9a-f]{4})","ig"),function (m0,m1){ return getChar(m1); }); // Hexスカラ値 str = str.replace(new RegExp("\\\\x([0-9a-f]{2})","ig"),function (m0,m1){ return getChar(m1); }); // エスケープ var d = { "\\":"\u005C", "b":"\u0008", "f":"\u000C", "n":"\u000A", "r":"\u000D", "t":"\u0009", "v":"\u000B", "'":"\u0027", '"':"\u0022", "/":"\u002F" }; str = str.replace(new RegExp("\\\\(.)","g"),function (m0,m1){ if(d[m1]) return d[m1]; return m1; }); return str; } // -------------------------------------------------------------------------------- // タイムスタンプから日付を取得 // -------------------------------------------------------------------------------- function Timestamp_ToString_JP(time){ var date = new Date(time); var year = date.getFullYear(); var mon = date.getMonth() + 1; var day = date.getDate(); var hou = date.getHours(); var min = date.getMinutes(); var sec = date.getSeconds(); var str = ""; if(year < 1000) str += "0"; if(year < 100) str += "0"; if(year < 10) str += "0"; str += year; str += "/"; if(mon < 10) str += "0"; str += mon; str += "/"; if(day < 10) str += "0"; str += day; str += " "; if(hou < 10) str += "0"; str += hou; str += ":"; if(min < 10) str += "0"; str += min; str += ":"; if(sec < 10) str += "0"; str += sec; return str; } // -------------------------------------------------------------------------------- // UNIXTIME から日付を取得 // -------------------------------------------------------------------------------- function UNIXTIME_ToString_JP(unix_time){ return Timestamp_ToString_JP(unix_time * 1000); } // -------------------------------------------------------------------------------- // 属性辞書 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 = StringConvert_From_CharacterReferences_To_Text(s); 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"); // コメント "",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 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 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 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 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 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 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 position_offset_parent = {"relative":1,"absolute":1,"fixed":1,"sticky":1}; var absoluted = false; 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(style.position == "fixed") break; if(absoluted){ absoluted = !Boolean(position_offset_parent[style.position]); }else{ absoluted = Boolean(style.position == "absolute"); } if(!absoluted){ 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 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 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){ try{ 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; } }catch(e){ } return null; } // -------------------------------------------------------------------------------- // スタイルから各サイズ情報を取得する // -------------------------------------------------------------------------------- var ComputedStyleGetSize = (function(){ 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" } ]; return function (style){ 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; } // -------------------------------------------------------------------------------- // スタイルからボーダーサイズを取得 // -------------------------------------------------------------------------------- var ComputedStyleGetBoaderWidth = (function(){ 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" } ]; return function (style){ 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=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 ノードのすべての子を外す // -------------------------------------------------------------------------------- function DomNodeRemoveChildren(node){ var nodes = node.childNodes; var i; var num = nodes.length; for(i=num-1;i>=0;i--){ node.removeChild(nodes[i]); } } // -------------------------------------------------------------------------------- // 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 DomNodeFindAllDescendants(node,func){ function f(n){ var nodes = n.childNodes; var i; var num = nodes.length; var a = new Array(); for(i=0;i < num;i++){ a[i] = nodes[i]; } for(i=0;i < num;i++){ node = func(a[i]); if(node){ return node; } node = f(a[i]); if(node){ return node; } } return null; } return f(node); } // -------------------------------------------------------------------------------- // 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 = null; if(node.nodeType == 1){ 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=0;i--){ var node = nodes[i]; node.parentNode.removeChild(node); } element.appendChild(element.ownerDocument.createTextNode(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; } // -------------------------------------------------------------------------------- // スタイルシートから CSSRuleList オブジェクトを取得する関数 // -------------------------------------------------------------------------------- function CSSStyleSheetGetCSSRuleList(style_sheet){ try{ if(style_sheet.cssRules !== undefined){ return style_sheet.cssRules; }else if(style_sheet.rules !== undefined){ return style_sheet.rules; } }catch(e){ } return null; } // -------------------------------------------------------------------------------- // スタイルにプロパティをセット // -------------------------------------------------------------------------------- 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 "all:revert;"; } // -------------------------------------------------------------------------------- // ImageElement 用初期スタイル文字列を取得 // -------------------------------------------------------------------------------- function CSSTextGetInitialImageElement(){ return "all:revert;"; } // -------------------------------------------------------------------------------- // ButtonElement 用初期スタイル文字列を取得 // -------------------------------------------------------------------------------- function CSSTextGetInitialButtonElement(){ return "all:revert;"; } // -------------------------------------------------------------------------------- // マウスイベントで変化したボタンを buttons 形式で取得する // -------------------------------------------------------------------------------- function MouseEventGetChangedButtons(event_obj){ try{ if(event_obj instanceof MouseEvent){ var buttons = 0; if(event_obj.button == 0) buttons |= 0x01; if(event_obj.button == 1) buttons |= 0x04; if(event_obj.button == 2) buttons |= 0x02; return buttons; } }catch(e){ } return event_obj.button; } // -------------------------------------------------------------------------------- // イメージを複製 // -------------------------------------------------------------------------------- function ImageClone(image){ var c = document.createElement("img"); c.src = image.src; return c; } // -------------------------------------------------------------------------------- // イメージの読み込みが完了したか取得する // -------------------------------------------------------------------------------- function ImageGetLoaded (image,callback) { var event_handler_release; var event_handler_load; var event_handler_error; var timer; var released = false; function release(){ if(released) return; released = true; if(event_handler_release){ event_handler_release.release(); event_handler_release = null; } if(event_handler_load){ image.removeEventListener("load" ,event_handler_load); event_handler_load = null; } if(event_handler_error){ image.removeEventListener("error",event_handler_error); event_handler_error = null; } if(timer){ timer.release(); timer = null; } } function complete(){ release(); callback(); } function success(){ if(released) return; complete(); } function failure(){ if(released) return; complete(); } event_handler_release = page_expand_event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ release(); }); function add_event(){ event_handler_load = success; event_handler_error = failure; image.addEventListener("load" ,event_handler_load); image.addEventListener("error",event_handler_error); } // ロード中 if(!image.complete){ add_event(); return; } // ロード完了 if(image.naturalHeight !== 0){ complete(); return; } // 念のために1秒待機 timer = new Timer(1000,1); timer.oncomplete = function(){ if(image.complete){ complete(); }else{ add_event(); } }; timer.start(); } // -------------------------------------------------------------------------------- // イメージのデフォルトのサイズを取得 // -------------------------------------------------------------------------------- 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); } // -------------------------------------------------------------------------------- // メニューコマンド(設定) // -------------------------------------------------------------------------------- var menu_command = new GMW_MenuCommand(); (function(){ var event_handler_release = page_expand_event_dispatcher.createEventHandler("release"); event_handler_release.setFunction(function(){ menu_command.release(); event_handler_release.release(); menu_command = null; }); })(); // -------------------------------------------------------------------------------- // メニューコマンドの追加(トップのみ) // -------------------------------------------------------------------------------- (function(){ if(!menu_command) return; if(WindowIsChild(window)) return; if(page_expand_arguments.admin != page_expand_arguments.window) return; menu_command.addItem(_i18n.getMessage("context_menu_pageexpand_open_image_viewer"), function(){ var popup_image = popup_image_container.getNext(); var image_viewer = new ImageViewer(popup_image); },"i"); menu_command.addItem(_i18n.getMessage("context_menu_pageexpand_open_download_board_inline"), function(){ download_board.setVisible(true); },"d"); menu_command.addItem(_i18n.getMessage("context_menu_batch_download_media"), function(){ download_board.setVisible(true); download_board.waitAnalyze({oncomplete:function(){ download_board.setFilter("media"); download_board.deselectItemsAll(); download_board.archive({onsuccess:function(){ download_board.setVisible(false); }}); }}); },"m"); if(!(project.getEnableStartup())){ menu_command.addItem(_i18n.getMessage("context_menu_pageexpand_start"), function(){ PageExpandStart(); },"s"); } menu_command.addItem(_i18n.getMessage("context_menu_pageexpand_abort"), function(){ PageExpandRelease(); },"a"); menu_command.addItem(_i18n.getMessage("context_menu_pageexpand_execute_fastest"), function(){ PageExpandExecuteFastest(); },"q"); menu_command.addItem(_i18n.getMessage("context_menu_pageexpand_debug"), function(){ page_expand_debug.setVisible(true); },""); (function(){ // BbsBoard の自動実行を許すアドレス var bbs_board_allow_filter = "https://hakuhin.github.io/PageExpand/GreaseMonkey/bbs_board.html"; var allowed = StringUrlMatchAsteriskWord( (document.URL) , (bbs_board_allow_filter + "*") ); var bbs_board_exec = function(){ if(!confirm(_i18n.getMessage("context_menu_pageexpand_open_bbs_board_run_confirm"))) return; // PageExpand コンストラクタ PageExpandConstructor(); // 実行開始 PageExpandStart(); var bbs_board = new PageExpandBbsBoard(); bbs_board.initialize(function(info){ if(!(info.result)) return; bbs_board.enableCompactMode(false); bbs_board.setURL(document.URL); }); }; menu_command.addItem(_i18n.getMessage("context_menu_pageexpand_open_bbs_board"), function(){ bbs_board_exec(); },"b"); // 自動実行 if(allowed) bbs_board_exec(); })(); (function(){ // PageExpand 設定の動作を許すアドレス var config_allow_filter = "https://hakuhin.github.io/PageExpand/GreaseMonkey/options.html"; var allowed = StringUrlMatchAsteriskWord( (document.URL) , (config_allow_filter + "*") ); var config_exec = function(){ if(!confirm(_i18n.getMessage("context_menu_pageexpand_config_auto_run_confirm"))) return; // PageExpand コンストラクタ PageExpandConstructor(); // 実行開始 PageExpandStart(); var config = new PageExpandConfig(); config.initialize(function(result){ config.MenuItemSelect(PageExpandConfig.MENU_TYPE_SETTING_STANDARD); }); }; menu_command.addItem(_i18n.getMessage("context_menu_pageexpand_config"), function(){ if(allowed){ config_exec(); }else{ if(confirm(_i18n.getMessage("context_menu_pageexpand_config_current_page_confirm") + config_allow_filter)){ if(GMW_openInTab.isSupported()){ GMW_openInTab(config_allow_filter,{active:true}); }else{ window.open(config_allow_filter,"_blank"); } } } },"c"); // 自動実行 if(allowed) config_exec(); })(); })(); // 実行可能 if(project.getEnable()){ // PageExpand コンストラクタ PageExpandConstructor(); if((page_expand_arguments.page_expand_parent) || project.getEnableStartup()){ // 実行開始 PageExpandStart(); } } }); break; }; })({execute_type:"UserScript",admin:window,window:window});