/* global Awesomescreen */ /* global Browser */ /* global BrowserDB */ /* global KeyEvent */ /* global Settings */ 'use strict'; /** * The dialog listen to mozbrowsershowmodalprompt event. * (alert/confirm/prompt) * * @namespace Dialog */ var BrowserDialog = { // Dialog Event dialogEvt: null, browserDialogInputArea: null, PORT_MIN: 0, PORT_MAX: 65535, focusElement: [], focusIndex: {x:0, y:0}, defaultFocusIndex: {x:0, y:0}, deferredActions: new Map(), /** Get all elements when inited. */ getAllElements: function dialog_getAllElements() { var toCamelCase = function toCamelCase(str) { return str.replace(/\-(.)/g, function replacer(str, p1) { return p1.toUpperCase(); }); }; var elementIDs = [ 'browser-dialog-base', 'browser-dialog', 'browser-dialog-title', 'browser-dialog-msg', 'browser-dialog-input', 'browser-dialog-input-area', 'browser-dialog-input-clear', 'browser-dialog-button', 'browser-dialog-button1', 'browser-dialog-button2', ]; // Loop and add element with camel style name to Dialog attribute. elementIDs.forEach(function createElementRef(name) { this[toCamelCase(name)] = document.getElementById(name); }, this); }, /** Initialization. Get DOM elements and add listeners. */ init: function dialog_init() { // Get all elements initially. this.getAllElements(); this.browserDialogBase.addEventListener('mouseup', this.dialogBaseClick.bind(this)); // Add event listener(dialog) this.browserDialogButton1.addEventListener('mouseup', this.dialogButton1.bind(this)); this.browserDialogButton1.addEventListener('keyup', this.dialogButtonKeyup.bind(this)); this.browserDialogButton2.addEventListener('mouseup', this.dialogButton2.bind(this)); this.browserDialogButton2.addEventListener('keyup', this.dialogButtonKeyup.bind(this)); this.browserDialogInput.addEventListener('submit', this.dialogInput.bind(this)); this.browserDialogInputClear.addEventListener('mouseup', this.dialogInputClear.bind(this)); this.browserDialogInputClear.addEventListener('keyup', this.dialogButtonKeyup.bind(this)); this.browserDialogInputArea.addEventListener('blur', this.dialogInputAreaBlur.bind(this)); this.browserDialogInputArea.addEventListener('focus', this.dialogInputAreaFocus.bind(this)); this.browserDialogInputArea.addEventListener('mousedown', this.dialogInputAreaClick.bind(this)); }, /** * create Dialog */ createDialog: function dialog_createDialog(type, evt) { var opt; this.cancelDialog(); if( evt != null ) { evt.preventDefault(); } this.dialogEvt = evt; this.browserDialogBase.classList.remove('hide'); this.browserDialogBase.dataset.type = type; var promise; switch(type) { case 'del_cookie': opt = { title: null, msg: 'WB_LT_CONFIRM_DELETE_COOKIES', bt1: 'LT_CANCEL', bt2: 'WB_LT_CLEAR' }; break; case 'clear_history': opt = { title: null, msg: 'WB_LT_CLEAR_ALL_HISTORY', bt1: 'LT_CANCEL', bt2: 'WB_LT_CLEAR' }; break; case 'max_bookmark': opt = { title: null, msg: 'WB_LT_BOOKMARK_ERROR_1', bt1: 'LT_CANCEL', bt2: null }; break; case 'alert': opt = { title: null, msg: {raw: evt.detail.message}, bt1: 'LT_WB_OK', bt2: null }; break; case 'prompt': opt = { title: null, msg: {raw: evt.detail.message}, bt1: 'LT_CANCEL', bt2: 'LT_WB_OK' }; break; case 'confirm': opt = { title: null, msg: {raw: evt.detail.message}, bt1: 'LT_CANCEL', bt2: 'LT_WB_OK' }; break; //IFDEF_FIREFOX_SYNC case 'signout_confirm': opt = { title: 'fxsync-confirm-sign-out-title', msg: 'fxsync-confirm-sign-out-message', bt1: 'LT_CANCEL', bt2: 'fxsync-sign-out' }; var deferred = {}; deferred.promise = new Promise(function(resolve, reject) { deferred.resolve = resolve; deferred.reject = reject; }); promise = deferred.promise; this.deferredActions.set('signout_confirm', deferred); break; //ENDIF_FIREFOX_SYNC default: return; } Browser.switchCursorMode(false); // title if (opt.title) { this.browserDialogTitle.setAttribute('data-l10n-id', opt.title); } else { this.browserDialogTitle.removeAttribute('data-l10n-id'); this.browserDialogTitle.textContent = ''; } // msg if(opt.msg) { if (typeof opt.msg === 'string') { this.browserDialogMsg.setAttribute('data-l10n-id', opt.msg); } else if (opt.msg.hasOwnProperty('raw')) { this.browserDialogMsg.innerHTML = opt.msg.raw.replace(/\\n/g, '
'); } } else { this.browserDialogMsg.removeAttribute('data-l10n-id'); this.browserDialogMsg.textContent = ''; } var countIndex = 0; this.focusElement = []; this.focusElement[0] = []; this.focusElement[1] = []; this.defaultFocusIndex = {x:0, y:0}; // button1 if(opt.bt1) { this.browserDialogButton1.blur(); this.browserDialogButton1.setAttribute('data-l10n-id', opt.bt1); this.browserDialogButton1.dataset.type = type; this.browserDialogButton1.classList.add('visible'); } // button2 if(opt.bt2) { this.browserDialogButton2.blur(); this.browserDialogButton2.setAttribute('data-l10n-id', opt.bt2); this.browserDialogButton2.dataset.type = type; this.browserDialogButton2.classList.add('visible'); } var width = Browser.SCREEN_WIDTH; if( Browser.sideBlock.dataset.sidebar == 'true' ) { width -= Browser.SIDE_WINDOW_WIDTH; } if(type == 'prompt') { this.browserDialogInput.style.display = 'block'; this.browserDialogInput.classList.remove('exfocus'); this.browserDialogInput.classList.remove('input'); this.browserDialogInputClear.tabIndex = 0; countIndex = 0; this.focusElement[1][countIndex++] = this.browserDialogInputArea; this.focusElement[1][countIndex++] = this.browserDialogInputClear; //this.browserDialogInput.insertBefore(this.browserDialogInputArea, // this.browserDialogInputClear); this.browserDialogInputArea.type = 'text'; this.browserDialogInputArea.value = ''; } else { this.browserDialogInput.style.display = 'none'; } // initialize position countIndex = 0; if(opt.bt1 && opt.bt2) { this.defaultFocusIndex.x = 0; this.defaultFocusIndex.y = 0; this.focusIndex.x = 0; //IFDEF_FIREFOX_SYNC if(type === 'signout_confirm') { this.focusIndex.y = 0; this.focusElement[0][countIndex++] = this.browserDialogButton1; this.focusElement[0][countIndex++] = this.browserDialogButton2; } else { this.focusIndex.y = 1; this.focusElement[0][countIndex++] = this.browserDialogButton2; this.focusElement[0][countIndex++] = this.browserDialogButton1; } //ENDIF_FIREFOX_SYNC //IFNDEF_FIREFOX_SYNC this.focusIndex.y = 1; this.focusElement[0][countIndex++] = this.browserDialogButton2; this.focusElement[0][countIndex++] = this.browserDialogButton1; //ENDIF_FIREFOX_SYNC } else if(opt.bt1) { this.defaultFocusIndex.x = 0; this.defaultFocusIndex.y = 0; this.focusIndex.x = 0; this.focusIndex.y = 0; this.focusElement[0][countIndex++] = this.browserDialogButton1; } Awesomescreen.focusImgFunc( this.focusElement[this.focusIndex.x][this.focusIndex.y]); this.focusElement[this.focusIndex.x][this.focusIndex.y].focus(); return promise; }, isDisplayed: function dialog_isDisplayed() { return !this.browserDialogBase.classList.contains('hide'); }, dialogBaseClick: function dialog_dialogBaseClick(evt) { if( evt ) { evt.stopPropagation(); } }, dialogButtonKeyup: function dialog_dialogButton1Keyup(evt) { if( evt ) { evt.preventDefault(); } switch( evt.keyCode ) { case KeyEvent.DOM_VK_RETURN : var elm = document.activeElement; elm.classList.remove('active'); var dEvt = document.createEvent('MouseEvents'); dEvt.initMouseEvent('mouseup', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, elm); elm.dispatchEvent( dEvt ); break; } }, completeDeferredAction: function(type, resolution) { if (!this.deferredActions.has(type)) { return; } this.deferredActions.get(type)[resolution](); this.deferredActions.delete(type); }, dialogButton1: function dialog_dialogButton1(evt) { if (evt) { evt.preventDefault(); } var type = this.browserDialogButton1.dataset.type; switch(type) { case 'del_cookie': case 'clear_history': case 'max_bookmark': case 'alert': case 'prompt': case 'confirm': case 'signout_confirm': this.dialogButton2End(evt.currentTarget); break; default: return; } this.completeDeferredAction(type, 'reject'); }, dialogButton2End: function dialog_dialogButton2End(target) { // Animation end event var end_event = (function() { target.removeEventListener('transitionend', end_event, false); BrowserDialog.cancelDialog(); }); target.addEventListener('transitionend', end_event, false); }, dialogButton2: function dialog_dialogButton2(evt) { if (evt) { evt.preventDefault(); } this.argEvt = evt.currentTarget; var type = this.browserDialogButton2.dataset.type; switch (type) { case 'del_cookie': var request = navigator.mozApps.getSelf(); request.onsuccess = function() { var rtn = request.result.clearBrowserData(); rtn.onsuccess = function() { //BrowserDialog.cancelDialog(); BrowserDialog.dialogButton2End(BrowserDialog.argEvt); }; rtn.onerror = function() { //BrowserDialog.cancelDialog(); BrowserDialog.dialogButton2End(BrowserDialog.argEvt); Settings.clearCookieFailed(); }; }; request.onerror = function() { //BrowserDialog.cancelDialog(); BrowserDialog.dialogButton2End(BrowserDialog.argEvt); Settings.clearCookieFailed(); }; break; case 'clear_history': //BrowserDB.clearHistory(this.cancelDialog.bind(this)); BrowserDB.clearHistory( function(){ BrowserDialog.dialogButton2End(BrowserDialog.argEvt); }.bind(this)); Awesomescreen.selectTopSites(); break; case 'prompt': if (this.dialogEvt != null) { this.dialogEvt.detail.returnValue = this.browserDialogInputArea.value; if (this.dialogEvt.detail.unblock) { this.dialogEvt.detail.unblock(); } this.dialogEvt = null; } //this.cancelDialog(); this.dialogButton2End(this.argEvt); break; case 'confirm': if (this.dialogEvt != null) { this.dialogEvt.detail.returnValue = true; if (this.dialogEvt.detail.unblock) { this.dialogEvt.detail.unblock(); } this.dialogEvt = null; } //this.cancelDialog(); this.dialogButton2End(this.argEvt); break; case 'signout_confirm': BrowserDialog.dialogButton2End(BrowserDialog.argEvt); break; default: break; } this.completeDeferredAction(type, 'resolve'); }, dialogInput: function dialog_dialogInput(evt) { if( evt ) { evt.preventDefault(); } this.browserDialogInputArea.blur(); }, dialogInputAreaFocus: function dialog_dialogInputAreaFocus(evt) { if( evt ) { evt.preventDefault(); } this.browserDialogInput.classList.add('input'); this.browserDialogInput.classList.remove('exfocus'); }, dialogInputClear: function dialog_dialogInputClear() { this.browserDialogInputArea.value = ''; }, dialogInputAreaKeydown: function dialog_dialogInputKeydown(evt) { if( evt ) { evt.preventDefault(); } switch( evt.keyCode ) { case KeyEvent.DOM_VK_RETURN : this.moveFocus(this.focusIndex.x+1, 0); break; } }, dialogInputAreaClick: function dialog_dialogInputAreaClick(evt) { Browser.switchCursorMode(true); Browser.switchCursorMode(false); this.dialogInputAreaFocus(); this.focusIndex.x = 1; this.focusIndex.y = 0; this.focusElement[this.focusIndex.x][this.focusIndex.y].focus(); Awesomescreen.pointerImg.style.display = 'none'; }, dialogInputAreaBlur: function dialog_dialogInputBlur() { if(Awesomescreen.pointerImg.style.display == 'none') { Browser.switchCursorMode(true); Browser.switchCursorMode(false); } BrowserDialog.browserDialogInput.classList.remove('input'); BrowserDialog.browserDialogInput.classList.add('exfocus'); var self = this; setTimeout( function() { self.focusIndex.x = 1; self.focusIndex.y = 0; Awesomescreen.focusImgFunc(self.browserDialogInputArea); }, 1000); }, /** * cancel confirm dialog */ cancelDialog: function dialog_cancelDialog() { if( !BrowserDialog.isDisplayed() ) { return; } switch( BrowserDialog.browserDialogButton1.dataset.type ) { case 'alert': case 'prompt': if( BrowserDialog.dialogEvt != null ) { BrowserDialog.dialogEvt.detail.returnValue = null; if( BrowserDialog.dialogEvt.detail.unblock ) { BrowserDialog.dialogEvt.detail.unblock(); } } break; case 'confirm': if( BrowserDialog.dialogEvt != null ) { BrowserDialog.dialogEvt.detail.returnValue = false; if( BrowserDialog.dialogEvt.detail.unblock ) { BrowserDialog.dialogEvt.detail.unblock(); } } break; } if( BrowserDialog.dialogEvt != null ) { BrowserDialog.dialogEvt = null; } // hide dialog if( BrowserDialog.browserDialogInputArea ) { BrowserDialog.browserDialogInput.classList.remove('exfocus'); BrowserDialog.browserDialogInput.classList.remove('input'); } BrowserDialog.browserDialogBase.classList.add('hide'); BrowserDialog.browserDialogButton1.classList.remove('visible'); BrowserDialog.browserDialogButton2.classList.remove('visible'); Browser.switchCursorMode(true); Awesomescreen.pointerImg.style.display = 'none'; }, moveFocus: function dialog_moveFocus(xd, yd) { if(!this.focusElement[xd]) { return; } if(( xd < 0 || yd < 0 ) || ( !this.focusElement[xd][yd] )) { if(( !this.browserDialogButton2.classList.contains('visible') ) && ( Awesomescreen.pointerImg.style.display !== 'block' )) { Browser.switchCursorMode(true); Browser.switchCursorMode(false); var x = this.defaultFocusIndex.x; var y = this.defaultFocusIndex.y; this.focusIndex.x = x; this.focusIndex.y = y; Awesomescreen.focusImgFunc(this.focusElement[x][y]); this.focusElement[x][y].focus(); } return; } this.focusIndex.x = xd; this.focusIndex.y = yd; var opt = null; var flg = false; if(Awesomescreen.pointerImg.style.display == 'none') { Browser.switchCursorMode(true); Browser.switchCursorMode(false); flg = true; } document.activeElement.blur(); Awesomescreen.focusImgFunc( this.focusElement[this.focusIndex.x][this.focusIndex.y], opt); if(this.focusElement[this.focusIndex.x][this.focusIndex.y].nodeName == 'INPUT') { if( !this.browserDialogInput.classList.contains('exfocus') ) { this.browserDialogInput.classList.add('exfocus'); } } else if(this.focusElement[this.focusIndex.x][this.focusIndex.y].id == 'browser-dialog-input-clear') { this.focusElement[this.focusIndex.x][this.focusIndex.y].focus(); if( !this.browserDialogInput.classList.contains('exfocus') ) { this.browserDialogInput.classList.add('exfocus'); } if( flg ) { opt = Awesomescreen.DEFAULT_EXCLEAR; } } else { this.focusElement[this.focusIndex.x][this.focusIndex.y].focus(); this.browserDialogInput.classList.remove('exfocus'); } }, handleKeyEvent: function dialog_handleKeyEvent(evt) { if( !BrowserDialog.isDisplayed() ) { return false; } if( document.activeElement.nodeName == 'INPUT' ) { return true; } switch( evt.keyCode ) { case KeyEvent.DOM_VK_LEFT : evt.preventDefault(); this.moveFocus(this.focusIndex.x, this.focusIndex.y-1); break; case KeyEvent.DOM_VK_RIGHT : evt.preventDefault(); this.moveFocus(this.focusIndex.x, this.focusIndex.y+1); break; case KeyEvent.DOM_VK_UP : evt.preventDefault(); this.moveFocus(this.focusIndex.x+1, 0); break; case KeyEvent.DOM_VK_DOWN : evt.preventDefault(); this.moveFocus(this.focusIndex.x-1, this.defaultFocusIndex.y); break; case KeyEvent.DOM_VK_RETURN : evt.preventDefault(); if(this.focusIndex.x === 1 && this.focusIndex.y === 0) { this.focusElement[this.focusIndex.x][this.focusIndex.y].focus(); Awesomescreen.pointerImg.style.display = 'none'; } else { document.activeElement.classList.remove('active'); document.activeElement.classList.add('active'); } break; case KeyEvent.DOM_VK_BACK_SPACE : BrowserDialog.cancelDialog(); return true; default : return false; } return true; } };