Added Opera to Phone version 1.2

This commit is contained in:
rich.tibbett
2010-10-31 21:51:13 +00:00
parent 7b8b4e51de
commit e2a32c90bc
9 changed files with 428 additions and 0 deletions

27
third_party/operatophone/config.xml vendored Normal file
View File

@@ -0,0 +1,27 @@
<?xml version='1.0' encoding='utf-8'?>
<widget xmlns="http://www.w3.org/ns/widgets" id="extensions:opera-to-phone" version="1.0_beta">
<name short="OperaToPhone">Opera to Phone</name>
<description>This extension adds a button to Opera that lets you seamlessly push links, maps, youtube videos, phone numbers and text to copy to the clipboard directly to your Android device. You also need to install the Chrome to Phone Android application on your phone. The application can be downloaded from Android Market (search for 'Chrome to Phone'). Requires a mobile phone running Android 2.2 ("Froyo") or later.</description>
<author href="http://opera.com" email="richt@opera.com">Rich Tibbett</author>
<access origin="https://chrometophone.appspot.com/*"/>
<icon src="icon_64.png"/>
<license>
Copyright 2010 Opera Software ASA.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Portions of this work are modifications based on work created and shared
by Google and used according to terms described in the Creative Commons 3.0
Attribution License.
</license>
</widget>

32
third_party/operatophone/constants.js vendored Normal file
View File

@@ -0,0 +1,32 @@
/*
* Portions of this page are modifications based on work created and shared
* by Google and used according to terms described in the Creative Commons 3.0
* Attribution License.
*/
var apiVersion = 5;
var baseUrl = 'https://chrometophone.appspot.com';
var sendUrl = baseUrl + '/send?ver=' + apiVersion;
var signInUrl = baseUrl + '/signin?extret=' +
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?login';
var signOutUrl = baseUrl + '/signout?extret=' +
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?logout';
var registerUrl = baseUrl + '/register?ver=' + apiVersion;
var apkUrl = 'http://code.google.com/p/chrometophone/wiki/AndroidApp';
var ACTION_START_SEND = 'start_send_process';
var ACTION_SEND_PAGE = 'send_to_phone';
var ACTION_APK_REQUIRED = 'apk_required';
var ACTION_REGISTER_USERJS = 'register_userjs';
var ACTION_DEREGISTER_USERJS = 'deregister_userjs';
var ACTION_CAPTURE_SELECTION = 'capture_selection';
var ACTION_SELECTION_CAPTURED = 'selection_captured';
var STATUS_SUCCESS = 'success';
var STATUS_LOGIN_REQUIRED = 'login_required';
var STATUS_DEVICE_NOT_REGISTERED = 'device_not_registered';
var STATUS_HTTP_PAGES_ONLY = 'http_pages_only';
var STATUS_GENERAL_ERROR = 'general_error';
var STATUS_NO_TAB_ACCESS = 'no_tab_access';
var BROWSER_CHANNEL_RETRY_INTERVAL_MS = 10000 * (1 + Math.random() - 0.5);

46
third_party/operatophone/help.html vendored Normal file
View File

@@ -0,0 +1,46 @@
<html>
<head>
<title>Opera to Phone</title>
</head>
<body>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1%2B%2FAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAuVSURBVGiBxZp7jFzXXcc%2F55x779zZ2Z3ZGe%2Fatb2sEztZxzWRRZUEmbiGBuoohjataEgoShoKxJFogmgLERFqSiNKpSLSlkdrTJSCCBGNQiFSiVIJV2mdBhnba5N0s36sXa%2B9tjvr9czO7Ozs3Mf58cfsjGdf9rjOhp%2F0k2bOfZzf9%2Fc%2B51wlIlwPKaXavve%2B%2B%2B67OZvNvt%2FzvM1a65scx%2Bnp7u5eFUWRDzQFmX1nXCwW8yKSt9YerdVqb166dOm1l1566dSc%2Bd8NAI%2Fu2vXhzq6uT%2Fi%2Bf7vneascx%2FESiQS1Wo19%2B%2FaRSqXQWiMiKKUIggDP89i6dStBEBBFEVEUBUEQXJienv7%2B5OTkM88%2B%2B%2ByhJoBr0eJbN2%2FMpWK2afhVBTuBPsAKDItS%2Fx657t6TH%2Fj513d8%2FR9mAJ7Y9chT%2FnvWfL6nZwXpdBrXdVFKYa1lZmaGsbGxJoAGRVGEtZb%2B%2Fn6MMVhrsdZSrVYplUrk8%2Fnw4sWL9%2B7Zs%2BeVtgEc37Dxgy7ygBG1DVitIKVAN56UOkeiVFm0Go1cd%2B%2F3Nq0%2Fl9%2Fyvi%2FfMDBAGAScP3%2BefD7PxMQE5XKZmZkZoigiCII5c7muSzKZxHVduru7yWazdHd309PTQy6Xo1KpcPTo0ZEjR45sd64m%2BPCGjXcmhC8aYbvmMlANxEAkoABHgQbHimRVJFk3rm1RHRlW9vdz5PBh9u%2Ffz%2BjoKKVSienp6aaWG9xKWmu01hhjSCQS%2BL5PKpWit7eXgYEBtm3bxrp16zZcunTps1e0wPD6gacS8JSpy4hQ%2F6GAshCUhP8IhAMafF%2FxS2nFB5IKLBDHMd%2F75EMcGB%2FnWy%2B8QLlcXqDpayVjDF1dXdx44408%2BOCDlEqlt5e0wPD6gecS8LCiLlCDBChZTozE3P%2FRM8cOtVz6wn%2F1D%2FzmWsM3kwovBKQjxZHB7zIxMYFSCmPMdQEQEYrFIoODg9x%2B%2B%2B1s3rx5tV7sxh%2BtH9jtKh4WBbaFRUEVKqciPjxPeAB%2BefTYC3nLowFgtSKWy%2B7hOE7TNX5aNsbgui5QD3QRUQsAHL5hYJcLj0Bd860cA9OWZ%2B49e%2BztpbS0%2FfSx56rCD%2BjwEeeyxpVS7xg3rGGtZQ6AH%2FTf1O9p%2FtLM%2BrG0MEAoVCZivrGU8A2aEf4mjiw2ts2wf6cBNGhODHQa%2FQWj6IxbhG5qEIjghzvOHBu7GoCJkO9i4kIcx1mlNUqpOXn%2BeqnVCs23vvYzN%2Fe7igfUIsJD0xL72pngnrFjxWpH15B1XBRy3b6%2FGDeoaYGk4WNakbCLilQHEAmH2wEAMC7Om6Fwp57V%2FjtpAT1rVUCaABzFTs3i2qc%2BLlYYaXeSasIfQ9WrxnIAAFBKOQ7At1etX6%2FhltaAnU8iTCGU2p2kaBJjCE3%2Ff6djYNYCdQBpT9%2BhFNkrAoBiYCm3O0lXpThq4xCll88CMBsDWsmvKbR%2FpYcEpgozerrdSdaWxwsVG6HUwsC7XmrEgIg0g%2FgXUailAniWagfHnbDdSSq2XgWWw4VaWxIHQFB9amnvaZD9HG%2B1v%2FoRpNEoLlcMWGvrACzC1RZmIrS%2F6pk3mTFm2WJAA8Rwug3Vmlc7NrcthQHNPAsYowE9Jy6up5A1K3Ek8qoI9koqVopENhd5bQPQqp4gZrtIYwxKGTo6DFFs0No0x38abgSxBqhY%2BU6EVK8iU1fClVS7ABxForFh0NBapaLZ%2BSuaz%2BxSFCY1tFinXZ7fV2mAY0Hw3zWRvLCwhW7hbqCzfQA6J8yNAVEaoxWffaLKp37bMll2r9mdGusKa%2B1lC%2Fzp%2BFh%2BWmQwpN7zL8Edoki3CyBnzHtqtQQX8jVGz5QplDSFSUO5YmDa8ud%2FVOH3H65RLDlXBWGMwXGc5mKmWCwSx3FdUY0Ji8LLKZFfd1k6n7qom4A3W8ei4TWbQX8I5UZKO6AMShvGvmPv2dJ7kmRnzJlfSNCdgVg07%2FvZACmDqglPf2YKEHb%2Fcyc9WYXWC7OhiBDHMUEQUK1WqVQqVCqVBYWMt5CX01YuZZTKLVXQNLIF%2BPbcUXsBiT6KBHeIVaBAUKz%2BIPS53%2BLu7Q54DsSToARmhLgMaIUpK57%2B9BRhWOMre1x6cwqRumuICFEUEcdxY2OrvgKbl4WaAP5s9GTxX9bdtNsX%2BROj1AIrCKDhzvmgnFsuTERv99wP6gDIitYH40BDYIEAWsvIbAzGMZgpw5f%2BOGCmOsnfPgdGK%2BaXjEbhmr8pMGdBA%2FA%2FjvlyAX5igWgRDmDrqRs2rVkAYtPFHwN%2FP3%2F88ibM0gk6DgHt8bnHXHp7NMLimWc%2BoEUBPDNytHDGmD8oi8WKELVwLEIgkrpE9LvzhYiGsutBHpq7ihaMCtEqRiuLVhajhDm2FTBpxYV8jbs%2FEZMf13hu%2B2vjBQAAHjt59F%2FPav3XMyIIczNRCJSFT19Yv2lDU%2FjhNSvRiW%2Bi3LUoLxZJlMOKTzCVpBKtIjJZxOtC3BTW82E2kzSEP5MP2fHxkAOHNB3JJQ21KM2JgVbader449%2B44ebVa639mKsUccu1KSQzYsOXyxtu%2BUjXyPBxUDOo5O%2BhO2vFr8itw69He6ZFuiKBk7%2F1APsO%2FZCDB%2FeTSHhUKhG%2F8ZEEX3rCQBxz%2BlzMzocihoY16TSIQDv7zK0utOTO3KM7d97%2FtVde2bMmjj7ZwWUQAlwU3ntAov2Hbhz4p2P38L8WdEVm7pgUebAqkmiYtVxSnDkbcfzEFI7rE4XC2DkDK1xGDsLOh0KOHacp%2FLXSFQHwd1%2B1j8PvfHH9xgNrovAvcqiMQRFRd62CSHcpjh93ZjNWJIKlnmAEEKNwPHBdwXU1yaShFFpW9hjOndTs%2BHjAyVNCOq1mtXptgjf4qt3lkyePfv1rUXD3a7WZV09HgQ1FMErhzQZSo3o3xoxSTIswHIVxaHTY2dlJGIaICF5Cc2Qo4t4Hqpz8sSWTufYOPQgCjDFkMhmiKGrngEMlQRJAT9ZLvH9rsmP7Bi%2BxeZU2q5Jap1yljQCB2Kgc28o5G51%2Fu1Z78%2FVadd%2Fnn3zymTAMci%2B%2B%2BCKjo6OIWKLIoLSmI9neRm%2BjEsdxjIjQ1dXFbbfdxo4dOzh37tzMVc8HqHepVaBYCGon%2FjOo%2FSPQA6zD9XI9rtMRAcUwqBBGeWAUuAR0WBv%2Fle%2F7bNmyhZUrVzIxMcHk5CTVapUgCJobv42utVWZjVTpOA5dXV10dnayYsUKstksq1evbgJyWl%2FQJlkgP8tXsp4ClLWWMAzxPI%2B%2Bvj76%2B%2Fux1jZ7mzAMm%2Bdj1locx8Fai1IK3%2FfxfR%2BnvnlCGIZNXtALLQe1KiaXy5FMJimVSkxNTeH7Pn19fbiuS7FYpFqtorUmjmMymQypVIpKpUKhUCCKIrLZLL7vMzU11WoxtZwArLU2bmg2k8mQyWQIw5BisYjWmnQ6je%2F7lEolZmZmmn2%2B7%2FvkcjmUUoyPj6OUIpPJkE6nm02etZY4jmvLCWCmUqlcSKfTvVprDh48SBRFpFIpMpkMQRDwxhtvEMcx6XS6CaZarTI8PMzg4CC%2B79Pd3Y2IMDg4SBAEdHR0sHHjRmq1GpVK5fhyApB8Pv%2BG53m3Oo5Db29v80LD13t7e%2Bu5XGvuuusutm3bxvPPP9%2FUciM2lFKsWLECEWmuiSuVCmfPnv23ZY2Bw4cP7%2FY875FGEM5PFo3%2FjuNw%2FPhxisUihUIBY0yzdixGWmvOnz%2F%2Fo7179%2B5eVgBDQ0OHMpnMH65ateoZrXXzlHL%2BSYu1lqGhIWq1GtlstnlPa3pt%2FE4kEhQKhfLIyMinoiiaeFc%2BNdi0adOHent7HzPGbBORZEOoxd6zmDwtLXRorf3%2B2bNnnz5x4sRr8C59KzFLXl9f3625XO7nfN9%2FrzFmrVIqq5RKKaU8mSuIAiIRqYhIwVr7k1qtNlwoFA6ePn36EFBr3vhufq0yjwyQAZKAx9y9hNkjOaaBEvWlyOLzXy%2BA%2F2%2F6PzBw4Z94LQ3uAAAAAElFTkSuQmCC" style="margin-right: 4px;"/>
<h2>Opera to Phone Extension - Help</h2>
<p><em>Welcome to Opera to Phone.</em></p>
<p>
This extension adds a button to Opera that allows users to send links from their Opera desktop browser to their Android device using Android's Cloud to Device Messaging service.
</p>
<p>
You need to install the <a href="http://code.google.com/p/chrometophone/wiki/AndroidApp">Chrome to Phone Android application</a> on your
phone for this extension to work. The application can be downloaded from Android Market (search for 'Chrome to Phone'). Requires a mobile
phone running Android 2.2 ("Froyo") or later.
</p>
<p>Extension Features:</p>
<ul>
<li>Send links to browser.</li>
<li>Google Maps links launch the Google Maps app.</li>
<li>YouTube links launch the YouTube app.</li>
<li>Selecting phone numbers in Web pages, launches the dialer with the number pre-populated.</li>
<li>Selected text populates the Android clipboard (long-press on text boxes to get paste option).</li>
<li>Right click on links and selections.</li>
</ul>
<h3>Requirements</h3>
<ul>
<li>Opera 11 (Alpha build 1024+)</li>
<li>Android 2.2 ("Froyo") device</li>
<li><a href="http://code.google.com/p/chrometophone/wiki/AndroidApp">Chrome to Phone</a> application installed on Android device</li>
</ul>
<p style="color:#cc0000; font-weight:bold;">
*** This is an experimental port of the Chrome to Phone extension to Opera 11 but it has been tested and is working ***
</p>
<p>If you have any questions, comments or feedback, please email me at <a href="mailto:richt@opera.com">richt@opera.com</a>.
</body>
</html>

BIN
third_party/operatophone/icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

BIN
third_party/operatophone/icon_64.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -0,0 +1,64 @@
// ==UserScript==
// @include *
// ==/UserScript==
// obtain access to all tabs
var ACTION_REGISTER_USERJS = 'register_userjs';
var ACTION_DEREGISTER_USERJS = 'deregister_userjs';
var ACTION_CAPTURE_SELECTION = 'capture_selection';
var ACTION_SEND_PAGE = 'send_to_phone';
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function guid() {
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
if(!window.top.userJS_UUID) {
window.top.userJS_UUID = guid();
window.addEventListener('focus', function(){
opera.extension.postMessage({action: ACTION_REGISTER_USERJS, uuid: window.top.userJS_UUID});
}, false);
window.addEventListener('blur', function(){
opera.extension.postMessage({action: ACTION_DEREGISTER_USERJS, uuid: window.top.userJS_UUID});
}, false);
// register this tab as the active userjs onload
opera.extension.postMessage({action: ACTION_REGISTER_USERJS, uuid: window.top.userJS_UUID});
}
opera.extension.addEventListener('message', function(request) {
//opera.postError('Callback received at UserJS: ' + request.data.action);
if(request.data.action==ACTION_CAPTURE_SELECTION
&& request.data.uuid==window.top.userJS_UUID) {
var currentUrl = document.location.href;
var pageInfo = {
action: ACTION_SEND_PAGE,
data: {
link: encodeURIComponent(currentUrl),
title: encodeURIComponent(document.title),
selection: encodeURIComponent(window.getSelection())
}
};
// URL overrides
if (currentUrl.match(/^http[s]?:\/\/maps\.google\./) ||
currentUrl.match(/^http[s]?:\/\/www\.google\.[a-z]{2,3}(\.[a-z]{2})\/maps/)) {
var link = document.getElementById('link');
if (link && link.href)
pageInfo.data.link = encodeURIComponent(link.href);
}
opera.extension.postMessage(pageInfo);
}
}, false);
//opera.postError("UserJS loaded: " + window.location.href + " / " + window.top.userJS_UUID);

108
third_party/operatophone/index.html vendored Normal file
View File

@@ -0,0 +1,108 @@
<!doctype html>
<html>
<head>
<script type="text/javascript" src="constants.js"></script>
<script type="text/javascript" src="send_logic.js"></script>
<script>
var UIItemProperties = { // options for the button
disabled: false,
title: "Opera to Phone",
icon: "icon.png",
popup: {
href: 'popup.html',
width: "320px",
height: "60px"
}
}
var operaBtn = opera.contexts.toolbar.createItem( UIItemProperties ); // create the button
opera.contexts.toolbar.addItem( operaBtn ); // add button to UI
var currentTab = null; // tracks currently focused tab
opera.extension.addEventListener('message', function(request) { onMessage(request); }, false);
var currentUserJS = null; // keeps track of which UserJS is in focus
var timoutTimer = null;
function onMessage(request) {
if (request.data.action==ACTION_REGISTER_USERJS) {
currentUserJS = request.data.uuid;
//opera.postError("BG: Registered UserJS[" + currentUserJS + "]");
} else if (request.data.action==ACTION_DEREGISTER_USERJS) {
// deregister after a short delay, so the button has time to capture the currentUserJS
window.setTimeout(function() {
if(currentUserJS==request.data.uuid) {
//opera.postError("BG: Deregistering UserJS[" + currentUserJS + "]");
currentUserJS = null;
}
}, 300);
} else if(request.data.action==ACTION_START_SEND) {
var captureSelection = {
action: ACTION_CAPTURE_SELECTION,
uuid: currentUserJS
};
// Get the selected text (if any) from the UserJS
opera.extension.broadcastMessage(captureSelection);
// Set timeoutTimer to throw an error after 1 second...
timeoutTimer = window.setTimeout(function() {
request.data.action = ACTION_SEND_PAGE;
onMessage(request); // stop waiting for UserJS and go to next step
}, 1000);
} else if (request.data.action==ACTION_SEND_PAGE) {
// Cancel timeoutTimer
if(timeoutTimer) window.clearTimeout(timeoutTimer);
var userJS_data = {};
if(request.data.data) userJS_data = request.data.data;
// Set currentTab pointer
currentTab = opera.extension.tabs.getFocused();
if(currentTab || userJS_data.link) {
var url = userJS_data.link ? userJS_data.link : encodeURIComponent(currentTab.url);
var title = userJS_data.title ? userJS_data.title : encodeURIComponent(currentTab.title);
var sel = userJS_data.selection ? userJS_data.selection : '';
var msgType = (sel && sel.length > 0) ? 'selection' : 'page';
var urlCheck = decodeURIComponent(url);
if (urlCheck.indexOf('http:') == 0 || urlCheck.indexOf('https:') == 0) {
sendToPhone(title, url, sel, msgType, function(status) {
// Display sendToPhone result in popup.html
opera.extension.broadcastMessage({action: status});
});
} else {
opera.extension.broadcastMessage({action: STATUS_NO_TAB_ACCESS});
}
} else { // no object means that the extension does not have access to the current tab :(
opera.extension.broadcastMessage({action: STATUS_NO_TAB_ACCESS});
}
// Reset currentTab pointer
currentTab = null;
} else if (request.data.action==ACTION_APK_REQUIRED) {
opera.extension.tabs.create({url: apkUrl, focused:true});
}
}
</script>
</head>
<body>
</body>
</html>

114
third_party/operatophone/popup.html vendored Normal file
View File

@@ -0,0 +1,114 @@
<html>
<head>
<style type="text/css">
body {
padding: 0px;
margin: 1px;
min-width: 320px;
overflow: hidden;
}
td {
font-family: verdana;
font-size: 12px;
color: black;
}
</style>
<script type="text/javascript">
/*
* Portions of this page are modifications based on work created and shared
* by Google and used according to terms described in the Creative Commons 3.0
* Attribution License.
*/
var apiVersion = 5;
var baseUrl = 'https://chrometophone.appspot.com';
var sendUrl = baseUrl + '/send?ver=' + apiVersion;
var signInUrl = baseUrl + '/signin?extret=' +
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?login';
var signOutUrl = baseUrl + '/signout?extret=' +
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?logout';
var registerUrl = baseUrl + '/register?ver=' + apiVersion;
var ACTION_START_SEND = 'start_send_process';
var ACTION_SEND_PAGE = 'send_to_phone';
var ACTION_APK_REQUIRED = 'apk_required';
var ACTION_REGISTER_USERJS = 'register_userjs';
var ACTION_DEREGISTER_USERJS = 'deregister_userjs';
var ACTION_CAPTURE_SELECTION = 'capture_selection';
var STATUS_SUCCESS = 'success';
var STATUS_LOGIN_REQUIRED = 'login_required';
var STATUS_DEVICE_NOT_REGISTERED = 'device_not_registered';
var STATUS_HTTP_PAGES_ONLY = 'http_pages_only';
var STATUS_GENERAL_ERROR = 'general_error';
var STATUS_NO_TAB_ACCESS = 'no_tab_access';
var BROWSER_CHANNEL_RETRY_INTERVAL_MS = 10000 * (1 + Math.random() - 0.5);
</script>
<script>
function loadHandler() {
document.getElementById('msg').innerHTML = "Sending to phone...";
document.getElementById('help').innerHTML = "Help";
document.getElementById('signout').innerHTML = "Sign out";
setSignOutVisibility(false);
opera.extension.postMessage({action: ACTION_START_SEND});
// Callback from the background process
opera.extension.addEventListener('message', function(status) {
if (status.data.action == STATUS_SUCCESS) {
document.getElementById('msg').innerHTML = "Sent to phone."
activateSignOutLink();
} else if (status.data.action == STATUS_LOGIN_REQUIRED) {
var signinLink = '<a href="' + signInUrl + '" target="_o2pTab">sign in</a>';
document.getElementById('msg').innerHTML = "Please " + signinLink + " to Opera to Phone.";
setSignOutVisibility(false);
} else if (status.data.action == STATUS_DEVICE_NOT_REGISTERED) {
opera.extension.postMessage({action: ACTION_APK_REQUIRED});
document.getElementById('msg').innerHTML = "Device not registered for user.";
activateSignOutLink();
} else if (status.data.action == STATUS_NO_TAB_ACCESS) {
document.getElementById('msg').innerHTML = "Only HTTP URLs are supported (or try refreshing the page).";
} else if (status.data.action == STATUS_GENERAL_ERROR) {
document.getElementById('msg').innerHTML = "Error sending to phone: " + status.data.action;
activateSignOutLink();
}
}, false);
}
function activateSignOutLink() {
setSignOutVisibility(true);
var signOutLink = document.getElementById('signout');
signOutLink.style.color = 'blue';
signOutLink.href=signOutUrl;
signOutLink.click();
}
function setSignOutVisibility(visible) {
var signOutLink = document.getElementById('signout');
signOutLink.style.visibility = visible ? 'visible' : 'hidden';
signOutLink.href = null;
var sep = document.getElementById('sep');
sep.style.visibility = visible ? 'visible' : 'hidden';
}
window.addEventListener("load", loadHandler, false);
</script>
</head>
<body>
<table>
<tr>
<td valign="top" width="48px"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1%2B%2FAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAuVSURBVGiBxZp7jFzXXcc%2F55x779zZ2Z3ZGe%2Fatb2sEztZxzWRRZUEmbiGBuoohjataEgoShoKxJFogmgLERFqSiNKpSLSlkdrTJSCCBGNQiFSiVIJV2mdBhnba5N0s36sXa%2B9tjvr9czO7Ozs3Mf58cfsjGdf9rjOhp%2F0k2bOfZzf9%2Fc%2B51wlIlwPKaXavve%2B%2B%2B67OZvNvt%2FzvM1a65scx%2Bnp7u5eFUWRDzQFmX1nXCwW8yKSt9YerdVqb166dOm1l1566dSc%2Bd8NAI%2Fu2vXhzq6uT%2Fi%2Bf7vneascx%2FESiQS1Wo19%2B%2FaRSqXQWiMiKKUIggDP89i6dStBEBBFEVEUBUEQXJienv7%2B5OTkM88%2B%2B%2ByhJoBr0eJbN2%2FMpWK2afhVBTuBPsAKDItS%2Fx657t6TH%2Fj513d8%2FR9mAJ7Y9chT%2FnvWfL6nZwXpdBrXdVFKYa1lZmaGsbGxJoAGRVGEtZb%2B%2Fn6MMVhrsdZSrVYplUrk8%2Fnw4sWL9%2B7Zs%2BeVtgEc37Dxgy7ygBG1DVitIKVAN56UOkeiVFm0Go1cd%2B%2F3Nq0%2Fl9%2Fyvi%2FfMDBAGAScP3%2BefD7PxMQE5XKZmZkZoigiCII5c7muSzKZxHVduru7yWazdHd309PTQy6Xo1KpcPTo0ZEjR45sd64m%2BPCGjXcmhC8aYbvmMlANxEAkoABHgQbHimRVJFk3rm1RHRlW9vdz5PBh9u%2Ffz%2BjoKKVSienp6aaWG9xKWmu01hhjSCQS%2BL5PKpWit7eXgYEBtm3bxrp16zZcunTps1e0wPD6gacS8JSpy4hQ%2F6GAshCUhP8IhAMafF%2FxS2nFB5IKLBDHMd%2F75EMcGB%2FnWy%2B8QLlcXqDpayVjDF1dXdx44408%2BOCDlEqlt5e0wPD6gecS8LCiLlCDBChZTozE3P%2FRM8cOtVz6wn%2F1D%2FzmWsM3kwovBKQjxZHB7zIxMYFSCmPMdQEQEYrFIoODg9x%2B%2B%2B1s3rx5tV7sxh%2BtH9jtKh4WBbaFRUEVKqciPjxPeAB%2BefTYC3nLowFgtSKWy%2B7hOE7TNX5aNsbgui5QD3QRUQsAHL5hYJcLj0Bd860cA9OWZ%2B49e%2BztpbS0%2FfSx56rCD%2BjwEeeyxpVS7xg3rGGtZQ6AH%2FTf1O9p%2FtLM%2BrG0MEAoVCZivrGU8A2aEf4mjiw2ts2wf6cBNGhODHQa%2FQWj6IxbhG5qEIjghzvOHBu7GoCJkO9i4kIcx1mlNUqpOXn%2BeqnVCs23vvYzN%2Fe7igfUIsJD0xL72pngnrFjxWpH15B1XBRy3b6%2FGDeoaYGk4WNakbCLilQHEAmH2wEAMC7Om6Fwp57V%2FjtpAT1rVUCaABzFTs3i2qc%2BLlYYaXeSasIfQ9WrxnIAAFBKOQ7At1etX6%2FhltaAnU8iTCGU2p2kaBJjCE3%2Ff6djYNYCdQBpT9%2BhFNkrAoBiYCm3O0lXpThq4xCll88CMBsDWsmvKbR%2FpYcEpgozerrdSdaWxwsVG6HUwsC7XmrEgIg0g%2FgXUailAniWagfHnbDdSSq2XgWWw4VaWxIHQFB9amnvaZD9HG%2B1v%2FoRpNEoLlcMWGvrACzC1RZmIrS%2F6pk3mTFm2WJAA8Rwug3Vmlc7NrcthQHNPAsYowE9Jy6up5A1K3Ek8qoI9koqVopENhd5bQPQqp4gZrtIYwxKGTo6DFFs0No0x38abgSxBqhY%2BU6EVK8iU1fClVS7ABxForFh0NBapaLZ%2BSuaz%2BxSFCY1tFinXZ7fV2mAY0Hw3zWRvLCwhW7hbqCzfQA6J8yNAVEaoxWffaLKp37bMll2r9mdGusKa%2B1lC%2Fzp%2BFh%2BWmQwpN7zL8Edoki3CyBnzHtqtQQX8jVGz5QplDSFSUO5YmDa8ud%2FVOH3H65RLDlXBWGMwXGc5mKmWCwSx3FdUY0Ji8LLKZFfd1k6n7qom4A3W8ei4TWbQX8I5UZKO6AMShvGvmPv2dJ7kmRnzJlfSNCdgVg07%2FvZACmDqglPf2YKEHb%2Fcyc9WYXWC7OhiBDHMUEQUK1WqVQqVCqVBYWMt5CX01YuZZTKLVXQNLIF%2BPbcUXsBiT6KBHeIVaBAUKz%2BIPS53%2BLu7Q54DsSToARmhLgMaIUpK57%2B9BRhWOMre1x6cwqRumuICFEUEcdxY2OrvgKbl4WaAP5s9GTxX9bdtNsX%2BROj1AIrCKDhzvmgnFsuTERv99wP6gDIitYH40BDYIEAWsvIbAzGMZgpw5f%2BOGCmOsnfPgdGK%2BaXjEbhmr8pMGdBA%2FA%2FjvlyAX5igWgRDmDrqRs2rVkAYtPFHwN%2FP3%2F88ibM0gk6DgHt8bnHXHp7NMLimWc%2BoEUBPDNytHDGmD8oi8WKELVwLEIgkrpE9LvzhYiGsutBHpq7ihaMCtEqRiuLVhajhDm2FTBpxYV8jbs%2FEZMf13hu%2B2vjBQAAHjt59F%2FPav3XMyIIczNRCJSFT19Yv2lDU%2FjhNSvRiW%2Bi3LUoLxZJlMOKTzCVpBKtIjJZxOtC3BTW82E2kzSEP5MP2fHxkAOHNB3JJQ21KM2JgVbader449%2B44ebVa639mKsUccu1KSQzYsOXyxtu%2BUjXyPBxUDOo5O%2BhO2vFr8itw69He6ZFuiKBk7%2F1APsO%2FZCDB%2FeTSHhUKhG%2F8ZEEX3rCQBxz%2BlzMzocihoY16TSIQDv7zK0utOTO3KM7d97%2FtVde2bMmjj7ZwWUQAlwU3ntAov2Hbhz4p2P38L8WdEVm7pgUebAqkmiYtVxSnDkbcfzEFI7rE4XC2DkDK1xGDsLOh0KOHacp%2FLXSFQHwd1%2B1j8PvfHH9xgNrovAvcqiMQRFRd62CSHcpjh93ZjNWJIKlnmAEEKNwPHBdwXU1yaShFFpW9hjOndTs%2BHjAyVNCOq1mtXptgjf4qt3lkyePfv1rUXD3a7WZV09HgQ1FMErhzQZSo3o3xoxSTIswHIVxaHTY2dlJGIaICF5Cc2Qo4t4Hqpz8sSWTufYOPQgCjDFkMhmiKGrngEMlQRJAT9ZLvH9rsmP7Bi%2BxeZU2q5Jap1yljQCB2Kgc28o5G51%2Fu1Z78%2FVadd%2Fnn3zymTAMci%2B%2B%2BCKjo6OIWKLIoLSmI9neRm%2BjEsdxjIjQ1dXFbbfdxo4dOzh37tzMVc8HqHepVaBYCGon%2FjOo%2FSPQA6zD9XI9rtMRAcUwqBBGeWAUuAR0WBv%2Fle%2F7bNmyhZUrVzIxMcHk5CTVapUgCJobv42utVWZjVTpOA5dXV10dnayYsUKstksq1evbgJyWl%2FQJlkgP8tXsp4ClLWWMAzxPI%2B%2Bvj76%2B%2Fux1jZ7mzAMm%2Bdj1locx8Fai1IK3%2FfxfR%2BnvnlCGIZNXtALLQe1KiaXy5FMJimVSkxNTeH7Pn19fbiuS7FYpFqtorUmjmMymQypVIpKpUKhUCCKIrLZLL7vMzU11WoxtZwArLU2bmg2k8mQyWQIw5BisYjWmnQ6je%2F7lEolZmZmmn2%2B7%2FvkcjmUUoyPj6OUIpPJkE6nm02etZY4jmvLCWCmUqlcSKfTvVprDh48SBRFpFIpMpkMQRDwxhtvEMcx6XS6CaZarTI8PMzg4CC%2B79Pd3Y2IMDg4SBAEdHR0sHHjRmq1GpVK5fhyApB8Pv%2BG53m3Oo5Db29v80LD13t7e%2Bu5XGvuuusutm3bxvPPP9%2FUciM2lFKsWLECEWmuiSuVCmfPnv23ZY2Bw4cP7%2FY875FGEM5PFo3%2FjuNw%2FPhxisUihUIBY0yzdixGWmvOnz%2F%2Fo7179%2B5eVgBDQ0OHMpnMH65ateoZrXXzlHL%2BSYu1lqGhIWq1GtlstnlPa3pt%2FE4kEhQKhfLIyMinoiiaeFc%2BNdi0adOHent7HzPGbBORZEOoxd6zmDwtLXRorf3%2B2bNnnz5x4sRr8C59KzFLXl9f3625XO7nfN9%2FrzFmrVIqq5RKKaU8mSuIAiIRqYhIwVr7k1qtNlwoFA6ePn36EFBr3vhufq0yjwyQAZKAx9y9hNkjOaaBEvWlyOLzXy%2BA%2F2%2F6PzBw4Z94LQ3uAAAAAElFTkSuQmCC" style="margin-right: 4px;"/></td>
<td valign="middle">
<b><div id="msg"></div></b>
<p><a id="help" href="help.html" target="_o2pTab"></a> <span id="sep">|</span>
<a id="signout" target="_o2pTab" style="color: gray;"></a></p>
</td>
</tr>
</table>
</body>
</html>

37
third_party/operatophone/send_logic.js vendored Normal file
View File

@@ -0,0 +1,37 @@
/*
* Portions of this page are modifications based on work created and shared
* by Google and used according to terms described in the Creative Commons 3.0
* Attribution License.
*/
var channel;
var socket;
var req = new XMLHttpRequest();
function sendToPhone(title, url, sel, msgType, listener) {
req.open('POST', sendUrl, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.setRequestHeader('X-Same-Domain', 'true'); // XSRF protector
req.onreadystatechange = function() {
if (this.readyState == 4) {
if (req.status == 200) {
var body = req.responseText;
if (body.indexOf('OK') == 0) {
listener(STATUS_SUCCESS);
} else if (body.indexOf('LOGIN_REQUIRED') == 0) {
listener(STATUS_LOGIN_REQUIRED);
} else if (body.indexOf('DEVICE_NOT_REGISTERED') == 0) {
listener(STATUS_DEVICE_NOT_REGISTERED);
}
} else {
listener(STATUS_GENERAL_ERROR);
}
}
};
// title, url and sel have already been encoded...
var data = 'title=' + title + '&url=' + url +
'&sel=' + sel + '&type=' + encodeURIComponent(msgType);
req.send(data);
}