This commit is contained in:
burke.davey
2011-05-23 20:17:34 +00:00
parent 28f93b1dc5
commit 0726fa437c
76 changed files with 0 additions and 3241 deletions

View File

@@ -1,24 +0,0 @@
content sendtophone chrome/content/
skin sendtophone classic/1.0 chrome/skin/
resource sendtophone modules/
locale sendtophone cs chrome/locale/cs/
locale sendtophone de chrome/locale/de/
locale sendtophone en-US chrome/locale/en-US/
locale sendtophone es chrome/locale/es/
locale sendtophone fr chrome/locale/fr/
locale sendtophone ga-IE chrome/locale/ga-IE/
locale sendtophone hi-IN chrome/locale/hi-IN/
locale sendtophone hu chrome/locale/hu/
locale sendtophone it chrome/locale/it/
locale sendtophone ja-JP chrome/locale/ja-JP/
locale sendtophone nl chrome/locale/nl/
locale sendtophone pt-BR chrome/locale/pt-BR/
locale sendtophone ru chrome/locale/ru/
locale sendtophone sr chrome/locale/sr/
locale sendtophone sv chrome/locale/sv/
locale sendtophone zh-CN chrome/locale/zh-CN/
overlay chrome://browser/content/browser.xul chrome://sendtophone/content/ff-overlay.xul
style chrome://global/content/customizeToolbar.xul chrome://sendtophone/skin/overlay.css

View File

@@ -1,199 +0,0 @@
/*
Copyright 2010 Alfonso Martínez de Lizarrondo & Patrick O'Reilly
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.
*/
sendtophone.init = function()
{
// Try to install the toolbar button, but only once
if (!this.prefs.getBoolPref("installedButton"))
{
this.installToolbarButton();
this.prefs.setBoolPref( "installedButton", true ) ;
}
document.getElementById("contentAreaContextMenu").
addEventListener("popupshowing", function (e){ sendtophone.showFirefoxContextMenu(e); }, false);
}
sendtophone.installToolbarButton = function()
{
try {
var firefoxnav = document.getElementById("nav-bar");
var curSet = firefoxnav.currentSet;
if (curSet.indexOf("sendtophone-toolbar-button") == -1)
{
var set;
// Place the button before the urlbar
if (curSet.indexOf("urlbar-container") != -1)
set = curSet.replace(/urlbar-container/, "urlbar-container,sendtophone-toolbar-button");
else // at the end
set = curSet + ",sendtophone-toolbar-button";
firefoxnav.setAttribute("currentset", set);
firefoxnav.currentSet = set;
document.persist("nav-bar", "currentset");
// If you don't do the following call, funny things happen
try {
BrowserToolboxCustomizeDone(true);
}
catch (e) { }
}
}
catch(e) { }
}
//Toggle Protocol Prefrences onFlyout Menu Click
sendtophone.onToggleOption = function(menuitem)
{
var option = menuitem.getAttribute("option");
var checked = menuitem.getAttribute("checked") == "true";
this.prefs.setBoolPref("protocols."+option, checked );
if (!option.indexOf("sms"))
this.prefs.setBoolPref("protocols."+option+"to", checked );
}
//Set MenuItem as checked based on preferences.
sendtophone.onOptionsShowing= function(popup)
{
for (var child = popup.firstChild; child; child = child.nextSibling)
{
if (child.localName == "menuitem")
{
var option = child.getAttribute("option");
if (option)
{
var checked = this.prefs.getBoolPref("protocols."+option);
child.setAttribute("checked", checked);
}
}
}
}
sendtophone.showFirefoxContextMenu = function(event) {
// show or hide the menuitem based on what the context menu is on
// see http://kb.mozillazine.org/Adding_items_to_menus
var mediaURL = gContextMenu.mediaURL;
gContextMenu.showItem("context-sendtophone-link", gContextMenu.onLink);
gContextMenu.showItem("context-sendtophone-image", false);
gContextMenu.showItem("context-sendtophone-qrimage", false);
gContextMenu.showItem("context-sendtophone-video", false);
if (gContextMenu.onImage)
{
var data = this.detectQR( mediaURL );
if (data)
{
gContextMenu.showItem("context-sendtophone-qrimage", true);
var label = this.getString("qrContextMenu");
label = label.replace("%s", data.substring(0, 20) + "..." );
document.getElementById("context-sendtophone-qrimage").setAttribute("label", label);
}
else
gContextMenu.showItem("context-sendtophone-image", true);
}
/* TBC
if(mediaURL.match(/.webm$/i)){
gContextMenu.showItem("context-sendtophone-video", true);
}
*/
gContextMenu.showItem("context-sendtophone-text", gContextMenu.isTextSelected ||
(gContextMenu.onTextInput && gContextMenu.target.selectionEnd > gContextMenu.target.selectionStart) );
gContextMenu.showItem("context-sendtophone-page", !( gContextMenu.inDirList || gContextMenu.isContentSelected || gContextMenu.onTextInput || gContextMenu.onLink || gContextMenu.onImage ));
};
// https://developer.mozilla.org/En/DragDrop/Drag_and_Drop
sendtophone.checkDrag = function(event)
{
//event.dataTransfer.dropEffect = "copy";
var types = event.dataTransfer.types;
if (types.contains("text/plain") || types.contains("text/uri-list") || types.contains("text/x-moz-url"))
event.preventDefault();
if (this.prefs.getCharPref( "fileServerUrl" ) && types.contains("application/x-moz-file") )
event.preventDefault();
}
sendtophone.doDrop = function(event)
{
var dt = event.dataTransfer;
var types = dt.types;
var supportedTypes = ["application/x-moz-file", "text/x-moz-url", "text/uri-list", "text/plain"];
types = supportedTypes.filter(function (value) {return types.contains(value)});
event.preventDefault();
switch (types[0])
{
case "text/plain":
var plainText = dt.getData(types[0]);
sendtophoneCore.send("Selection", "http://google.com", plainText);
break;
case "text/x-moz-url":
var mozUrlArray = dt.getData(types[1]).split("\n");
var mozUrl = mozUrlArray[0];
var mozTitle = mozUrlArray[1] || '';
sendtophoneCore.send(mozTitle, mozUrl, "");
break;
case "text/uri-list":
var mozUrl = dt.getData(types[0]);
sendtophoneCore.send("", mozUrl, "");
break;
case "application/x-moz-file":
for (var i = 0; i < dt.mozItemCount; i++)
{
var file = dt.mozGetDataAt("application/x-moz-file", i);
if (file instanceof Ci.nsIFile )
sendtophoneCore.sendFile(file);
else
this.alert(this.getString("InvalidFile"));
}
break;
}
}
sendtophone.pickFile = function(folder)
{
var fp = Cc["@mozilla.org/filepicker;1"]
.createInstance(Ci.nsIFilePicker);
if (folder)
fp.init(window, this.getString("SendFolderToPhone"), Ci.nsIFilePicker.modeGetFolder);
else
{
fp.init(window, this.getString("SendFileToPhone"), Ci.nsIFilePicker.modeOpenMultiple);
fp.appendFilters(Ci.nsIFilePicker.filterAll | Ci.nsIFilePicker.filterImages);
}
var rv = fp.show();
if (rv == Ci.nsIFilePicker.returnOK)
{
var files = fp.files;
while (files.hasMoreElements())
{
var file = files.getNext().QueryInterface(Ci.nsILocalFile);
sendtophoneCore.sendFile( file );
}
}
}

View File

@@ -1,83 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="chrome://sendtophone/skin/overlay.css" type="text/css"?>
<!DOCTYPE overlay SYSTEM "chrome://sendtophone/locale/overlay.dtd">
<overlay id="sendtophone-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script src="overlay.js"/>
<script src="ff-overlay.js"/>
<stringbundleset id="stringbundleset">
<stringbundle id="sendtophone-strings" src="chrome://sendtophone/locale/overlay.properties"/>
</stringbundleset>
<popupset id="mainPopupSet">
<menupopup id="sendtophoneContextMenu" onpopupshowing="sendtophone.initPopup();">
<menuitem label="&sendtophoneContextSendClipboard.label;"
accesskey="&sendtophoneContextSendClipboard.accesskey;"
oncommand="sendtophone.sendClipboard()" id="sendtophoneContextMenuSendClipboard"/>
<menuitem label="&sendtophoneContextSendFile.label;"
accesskey="&sendtophoneContextSendFile.accesskey;"
oncommand="sendtophone.pickFile(false)" id="sendtophoneContextMenuSendFiles"/>
<menuitem label="&sendtophoneContextSendFolder.label;"
accesskey="&sendtophoneContextSendFolder.accesskey;"
oncommand="sendtophone.pickFile(true)" id="sendtophoneContextMenuSendFolder"/>
<menu label="&sendtophoneProtocols.label;">
<menupopup id="menu_Protocols" onpopupshowing="sendtophone.onOptionsShowing(this)">
<menuitem type="checkbox" id="marketcheck" label="market:" oncommand="sendtophone.onToggleOption(this)" option="market"/>
<menuitem type="checkbox" id="smscheck" label="sms:" oncommand="sendtophone.onToggleOption(this)" option="sms"/>
<menuitem type="checkbox" id="telcheck" label="tel:" oncommand="sendtophone.onToggleOption(this)" option="tel"/>
</menupopup>
</menu>
<menuitem label="&sendtophoneContextLogout.label;"
accesskey="&sendtophoneContextLogout.accesskey;"
oncommand="sendtophone.logout()" id="sendtophoneContextMenuLogout"/>
</menupopup>
</popupset>
<menupopup id="contentAreaContextMenu">
<menuitem id="context-sendtophone-link" label="&sendtophoneContext.label;"
class="menuitem-iconic"
accesskey="&sendtophoneContext.accesskey;"
insertafter="context-sendlink"
oncommand="sendtophone.onMenuItemCommand(event, 'link')"/>
<menuitem id="context-sendtophone-image" label="&sendtophoneContextImage.label;"
class="menuitem-iconic"
accesskey="&sendtophoneContextImage.accesskey;"
insertafter="context-sendimage"
oncommand="sendtophone.onMenuItemCommand(event, 'image')"/>
<menuitem id="context-sendtophone-qrimage" label="&sendtophoneContextQrImage.label;"
class="menuitem-iconic"
accesskey="&sendtophoneContextQrImage.accesskey;"
insertafter="context-sendimage"
oncommand="sendtophone.onMenuItemCommand(event, 'qr')"/>
<menuitem id="context-sendtophone-video" label="&sendtophoneContextVideo.label;"
class="menuitem-iconic"
accesskey="&sendtophoneContextVideo.accesskey;"
insertafter="context-sendvideo"
oncommand="sendtophone.onMenuItemCommand(event, 'video')"/>
<menuitem id="context-sendtophone-text" label="&sendtophoneContextText.label;"
class="menuitem-iconic"
accesskey="&sendtophoneContextText.accesskey;"
insertafter="context-searchselect"
oncommand="sendtophone.onMenuItemCommand(event, 'text')"/>
<menuitem id="context-sendtophone-page" label="&sendtophoneContextPage.label;"
class="menuitem-iconic"
accesskey="&sendtophoneContextPage.accesskey;"
insertafter="context-sendpage"
oncommand="sendtophone.onMenuItemCommand(event, 'page')"/>
</menupopup>
<toolbarpalette id="BrowserToolbarPalette">
<toolbarbutton id="sendtophone-toolbar-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&sendtophoneToolbarButton.label;" tooltiptext="&sendtophoneToolbarButton.tooltip;"
context="sendtophoneContextMenu"
ondragenter="sendtophone.checkDrag(event)"
ondragover="sendtophone.checkDrag(event)"
ondrop="sendtophone.doDrop(event)"
oncommand="sendtophone.onToolbarButtonCommand()"/>
</toolbarpalette>
</overlay>

View File

@@ -1,34 +0,0 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://sendtophone/locale/overlay.dtd">
<prefwindow id="sendtophone-prefs"
title="&sendtophoneOptions.title;"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<prefpane>
<preferences>
<preference id="extensions.sendtophone.protocols.market" name="extensions.sendtophone.protocols.market" type="bool"/>
<preference id="extensions.sendtophone.protocols.sms" name="extensions.sendtophone.protocols.sms" type="bool"/>
<preference id="extensions.sendtophone.protocols.smsto" name="extensions.sendtophone.protocols.smsto" type="bool"/>
<preference id="extensions.sendtophone.protocols.tel" name="extensions.sendtophone.protocols.tel" type="bool"/>
</preferences>
<groupbox style="padding:1em;" label="ProtocolsGroup">
<caption label="&sendtophoneProtocols.label;"/>
<checkbox preference="extensions.sendtophone.protocols.market"
label="market:" />
<checkbox id="sms" preference="extensions.sendtophone.protocols.sms"
label="sms:" oncommand="var o = document.getElementById('smsto'); o.checked=this.checked; o.doCommand();" />
<checkbox id="smsto" preference="extensions.sendtophone.protocols.smsto"
label="smsto:" style="display:none"/>
<checkbox preference="extensions.sendtophone.protocols.tel"
label="tel:" />
</groupbox>
</prefpane>
</prefwindow>

View File

@@ -1,301 +0,0 @@
/*
Copyright 2010 Alfonso Martínez de Lizarrondo & Patrick O'Reilly
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.
*/
// Core functions
Components.utils.import("resource://sendtophone/sendtophone.js");
// Protocol handlers
Components.utils.import("resource://sendtophone/protocolHandlers.js");
var sendtophone = {
init: function()
{
// Each app will implement its specific initialization
},
onLoad: function()
{
var me = sendtophone;
me.strings = document.getElementById("sendtophone-strings");
me.prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Ci.nsIPrefService)
.getBranch("extensions.sendtophone.") ;
me.init();
},
getString: function(name)
{
return this.strings.getString(name);
},
// Detect images of QR codes generated by the Google Charts API
detectQR: function( url )
{
var match = url.match(/^http:\/\/chart.apis.google.com\/chart\?(.*)/i);
if (!match)
return false;
var chartLink=/^chl=/;
var qrArray = match[0].split("&");
for(var qrI=0; qrI<qrArray.length; qrI++){
if(chartLink.test(qrArray[qrI])){
//Decode any data encoded in the QR Image Link
return decodeURIComponent(qrArray[qrI].replace(chartLink, ''));
}
}
},
onMenuItemCommand: function(e, type)
{
var title, url, selection = '';
switch(type)
{
case 'link':
title = gContextMenu.linkText();
url = gContextMenu.linkURL;
break;
case 'image':
title = gContextMenu.target.title || gContextMenu.target.alt;
url = gContextMenu.mediaURL;
break;
case 'video':
title = gContextMenu.target.title || gContextMenu.target.alt;
url = gContextMenu.mediaURL;
if(!title)
title=this.getString("videoTitle");
break;
case 'qr':
title = gContextMenu.target.title || gContextMenu.target.alt;
url = gContextMenu.mediaURL;
var data = this.detectQR(url);
if (this.validURI(data))
url = data;
else
selection = data;
//If the QR Image has no title text, give it one.
if (!title)
title=this.getString("qrTitle");
break;
case 'text':
title = "Selection";
url = 'http://google.com/';
var input = gContextMenu.target;
if (gContextMenu.onTextInput && input && input.value)
{
selection = input.value.substring(input.selectionStart, input.selectionEnd);
}
else
{
// Get the selection from the correct iframe
var focusedWindow = document.commandDispatcher.focusedWindow;
selection = focusedWindow.getSelection().toString();
}
break;
case 'pageButton':
// Check if there's a single image with a QR code in the contents
var images = gBrowser.contentDocument.getElementsByTagName( "img" );
// 0: search and prompt, 1: search and launch automatically, 2: don't search
var pref = this.prefs.getIntPref("SearchQR");
if (pref!=2)
{
var QRs = [];
for( var i=0; i<images.length; i++)
{
var imgData = this.detectQR( images[i].src );
if (imgData)
QRs.push({data: imgData, img: images[i]});
}
if (QRs.length==1)
{
var data = QRs[0].data;
if (pref == 0)
{
var question = this.getString("ConfirmQR").replace("%s", data.substring(0, 80)) ;
var answer = this.confirm( question );
pref = (answer.confirm ? 1 : 2 );
if (answer.remember)
this.prefs.setIntPref("SearchQR", pref);
}
if ( pref!=2 )
{
title = QRs[0].img.title || QRs[0].img.alt;
if (this.validURI(data))
url = data;
else
selection = data;
if (!title)
title=this.getString("qrTitle");
// We got the data, break out of the select
break;
}
}
} // pref != 2
// fall through
case 'page':
default:
var info = this.getInfo();
title = info.title;
url = info.url;
selection = info.selection;
break;
}
sendtophoneCore.send(title, url, selection);
},
// Shows a message in a modal alert
alert: function(text)
{
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Ci.nsIPromptService);
promptService.alert(window, this.getString("SendToPhoneTitle"),
text);
},
// Shows a message in a modal confirm
confirm: function(text)
{
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Ci.nsIPromptService);
// https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIPromptService#confirmEx
var check = {value: false};
var button = promptService.confirmEx(window, this.getString("SendToPhoneTitle"),
text, promptService.STD_YES_NO_BUTTONS, "", "", "", this.getString("RememberMyDecision"), check);
// confirmEx returns the pressed button, and Yes it's the first one.
return ({confirm: (0 == button), remember: check.value});
},
onToolbarButtonCommand: function(e) {
// just reuse the function above.
sendtophone.onMenuItemCommand(e, 'pageButton');
},
getInfo: function() {
var doc = gBrowser.contentDocument,
href = doc.location.href;
// Is it the Google Maps page?
if (this.isMapsURL(href))
{
// Then try to send the current view:
var link = doc.getElementById('link');
if (link && link.href)
href = link.href;
}
var focusedWindow = document.commandDispatcher.focusedWindow;
var selection = focusedWindow.getSelection().toString();
return {
"title": doc.title,
"url": href,
"selection": selection
};
},
isMapsURL: function(url)
{
return url.match("http://maps\\.google\\.[a-z]{2,3}(\\.[a-z]{2})?[/?].*") || url.match("http://www\\.google\\.[a-z]{2,3}(\\.[a-z]{2})?/maps.*");
},
validURI: function(uri)
{
return (/^(https?|market|tel|sms(to)?|mailto|ftp):/i).test( uri );
},
initPopup: function()
{
var fileServerUrl = this.prefs.getCharPref( "fileServerUrl" );
if (!fileServerUrl)
{
document.getElementById("sendtophoneContextMenuSendFiles").hidden = true;
document.getElementById("sendtophoneContextMenuSendFolder").hidden = true;
}
document.getElementById("sendtophoneContextMenuSendClipboard").disabled = !this.clipboardHasText();
// returning true will make the popup show
return true;
},
clipboardHasText : function()
{
var clip = Cc["@mozilla.org/widget/clipboard;1"].getService(Ci.nsIClipboard);
if (!clip) return false;
if (!clip.hasDataMatchingFlavors(["text/unicode"], 1, clip.kGlobalClipboard))
return false;
return true;
},
sendClipboard : function()
{
// https://developer.mozilla.org/en/using_the_clipboard
// Access Clipboard
var clip = Cc["@mozilla.org/widget/clipboard;1"].getService(Ci.nsIClipboard);
if (!clip) return;
if (!clip.hasDataMatchingFlavors(["text/unicode"], 1, clip.kGlobalClipboard))
return;
var trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable);
if (!trans) return;
trans.addDataFlavor("text/unicode");
// Get the data
clip.getData(trans, clip.kGlobalClipboard);
var str = new Object();
var strLength = new Object();
var pastetext;
trans.getTransferData("text/unicode", str, strLength);
// Convert to js string
if (str) str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
if (str) pastetext = str.data.substring(0, strLength.value / 2);
// Send it.
if (pastetext)
sendtophoneCore.send("Clipboard", "http://google.com", pastetext);
},
logout: function()
{
sendtophoneCore.logout();
}
};
window.addEventListener("load", sendtophone.onLoad, false);

View File

@@ -1,16 +0,0 @@
richlistitem[type="upload"][state="0"] {
-moz-binding: url('chrome://sendtophone/content/upload.xml#uploading');
-moz-box-orient: vertical;
}
richlistitem[type="upload"][state="1"] {
-moz-binding: url('chrome://sendtophone/content/upload.xml#compressing');
-moz-box-orient: vertical;
}
/* Only focus buttons in the selected item*/
richlistitem[type="upload"]:not([selected="true"]) button {
-moz-user-focus: none;
}

View File

@@ -1,99 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE bindings [
<!ENTITY % downloadManagerDTD SYSTEM "chrome://mozapps/locale/downloads/downloads.dtd">
%downloadManagerDTD;
<!ENTITY % uploadDTD SYSTEM "chrome://sendtophone/locale/uploads.dtd" >
%uploadDTD;
]>
<bindings id="uploadBindings"
xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xbl="http://www.mozilla.org/xbl">
<binding id="upload-base" extends="chrome://global/content/bindings/richlistbox.xml#richlistitem">
<resources>
<stylesheet src="chrome://sendtophone/skin/uploads.css"/>
</resources>
<implementation>
<property name="inProgress">
<getter>
<![CDATA[
var state = parseInt(this.getAttribute("state"));
var currBytes = Number(this.getAttribute("currBytes"));
var maxBytes = Number(this.getAttribute("maxBytes"));
return (state == 0 && (currBytes<maxBytes));
]]>
</getter>
</property>
<property name="buttons">
<getter>
<![CDATA[
var startEl = document.getAnonymousNodes(this);
if (!startEl.length)
startEl = [this];
const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
return startEl[0].getElementsByTagNameNS(XULNS, "button");
]]>
</getter>
</property>
</implementation>
</binding>
<binding id="uploading" extends="chrome://sendtophone/content/upload.xml#upload-base">
<content>
<xul:hbox flex="1" class="downloadContentBox">
<xul:vbox pack="center">
<xul:image class="uploadTypeIcon" validate="always"
xbl:inherits="src=image"/>
</xul:vbox>
<xul:vbox flex="1">
<xul:label xbl:inherits="value=target,tooltiptext=file"
crop="center" flex="2" class="name"/>
<xul:hbox>
<xul:vbox flex="1">
<xul:progressmeter mode="normal" value="0" flex="1"
anonid="progressmeter"
xbl:inherits="value=progress,mode=progressmode"/>
</xul:vbox>
<xul:button class="cancel mini-button" tooltiptext="&cmd.cancel.label;"
cmd="cmd_cancel" ondblclick="event.stopPropagation();"
oncommand="performCommand('cmd_cancel', this);"/>
</xul:hbox>
<xul:label xbl:inherits="value=status,tooltiptext=statusTip" flex="1"
crop="right" class="status"/>
<xul:spacer flex="1"/>
</xul:vbox>
</xul:hbox>
</content>
</binding>
<binding id="compressing" extends="chrome://sendtophone/content/upload.xml#upload-base">
<content>
<xul:hbox flex="1">
<xul:vbox pack="center">
<xul:image class="uploadTypeIcon" validate="always"
src="moz-icon://.zip?size=32"/>
</xul:vbox>
<xul:vbox pack="start" flex="1">
<xul:label xbl:inherits="value=target,tooltiptext=file"
crop="center" flex="2" class="name"/>
<xul:hbox>
<xul:vbox flex="1">
<xul:progressmeter mode="undetermined" flex="1" />
</xul:vbox>
</xul:hbox>
<xul:label value="&compressing.label;" class="status"/>
<xul:spacer flex="1"/>
</xul:vbox>
</xul:hbox>
</content>
</binding>
</bindings>

View File

@@ -1,168 +0,0 @@
var Cc = Components.classes;
var Ci = Components.interfaces;
let Cu = Components.utils;
Cu.import("resource://gre/modules/DownloadUtils.jsm");
Cu.import("resource://gre/modules/PluralForm.jsm");
Cu.import("resource://sendtophone/uploadsManager.js");
let gUploadManager = sendtophoneUploadsManager;
let gUploadsView = null;
function addFile(upload)
{
let dl = document.createElement("richlistitem");
dl.setAttribute("file", upload.file.path);
dl.setAttribute("target", upload.file.leafName);
dl.setAttribute("image", "moz-icon://" + upload.file.path + "?size=32");
dl.setAttribute("state", upload.state);
dl.setAttribute("startTime", upload.startTime);
dl.setAttribute("currBytes", upload.currBytes);
dl.setAttribute("maxBytes", upload.maxBytes);
dl.setAttribute("lastSeconds", Infinity);
// Initialize other attributes
dl.setAttribute("type", "upload");
dl.setAttribute("id", "upl" + upload.id);
dl.setAttribute("uploadId", upload.id);
gUploadsView.appendChild( dl );
}
var checkTimerEvent =
{
notify: function(timer)
{
if (sendtophoneUploadsManager.isWindowNeeded())
{
if (gUploadsView.children.length==0)
window.close();
}
}
}
function cancelUpload(item)
{
gUploadManager.cancelUpload( parseInt(item.getAttribute("uploadId"), 10) );
}
let gUploadListener = {
fileAdded: function(data)
{
addFile(data);
},
progressUpdate: function(data)
{
let item = document.getElementById( "upl" + data.id);
item.setAttribute("currBytes", data.currBytes);
item.setAttribute("maxBytes", data.maxBytes);
let percentComplete = Math.round(100 * data.currBytes / data.maxBytes);
item.setAttribute("progress", percentComplete);
// Status text
updateStatus(item);
},
fileFinished: function(data)
{
let item = document.getElementById("upl" + data.id);
gUploadsView.removeChild(item);
// If no more pending uploads, close the tab.
// Use a 0 ms timeout to avoid flicker while compress -> upload a folder
let checkTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
checkTimer.initWithCallback(checkTimerEvent, 0, Ci.nsITimer.TYPE_ONE_SHOT);
}
};
function Startup()
{
gUploadsView = document.getElementById("UploadsBox");
gUploadManager.addListener(gUploadListener);
for (let id in gUploadManager.uploads)
addFile( gUploadManager.uploads[id] );
}
function Shutdown()
{
gUploadManager.removeListener(gUploadListener);
}
////////////////////////////////////////////////////////////////////////////////
//// Command Updating and Command Handlers
var gUploadViewController = {
isCommandEnabled: function(aCommand, aItem)
{
let dl = aItem;
switch (aCommand) {
case "cmd_cancel":
return dl.inProgress;
}
return false;
},
doCommand: function(aCommand, aItem)
{
if (this.isCommandEnabled(aCommand, aItem))
this.commands[aCommand](aItem);
},
commands: {
cmd_cancel: function(aSelectedItem) {
cancelUpload(aSelectedItem);
}
}
};
/**
* Helper function to do commands.
*
* @param aCmd
* The command to be performed.
* @param aItem
* The richlistitem that represents the download that will have the
* command performed on it. If this is null, the command is performed on
* all downloads. If the item passed in is not a richlistitem that
* represents a download, it will walk up the parent nodes until it finds
* a DOM node that is.
*/
function performCommand(aCmd, aItem)
{
let elm = aItem;
while (elm.nodeName != "richlistitem" ||
elm.getAttribute("type") != "upload")
elm = elm.parentNode;
gUploadViewController.doCommand(aCmd, elm);
}
function updateStatus(aItem)
{
let currBytes = Number(aItem.getAttribute("currBytes"));
let maxBytes = Number(aItem.getAttribute("maxBytes"));
let elapsedTime = (Date.now() - Number(aItem.getAttribute("startTime"))) / 1000;
// If we don't have an active upload, assume 0 bytes/sec
let speed = (currBytes>0) ? currBytes/elapsedTime : 0;
let lastSec = Number(aItem.getAttribute("lastSeconds"));
let status, newLast;
[status, newLast] =
DownloadUtils.getDownloadStatus(currBytes, maxBytes, speed, lastSec);
// Update lastSeconds to be the new value
aItem.setAttribute("lastSeconds", newLast);
aItem.setAttribute("status", status);
}

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://sendtophone/content/upload.css"?>
<?xml-stylesheet href="chrome://sendtophone/skin/uploads.css"?>
<!DOCTYPE window SYSTEM "chrome://sendtophone/locale/overlay.dtd">
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
id="sendtophoneUploadsWindow"
onload="Startup();" onunload="Shutdown();"
onclose="return closeWindow(false);">
<script type="application/javascript" src="chrome://sendtophone/content/uploads.js"/>
<richlistbox id="UploadsBox" flex="1">
</richlistbox>
</window>

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "Odeslat tuto stránku do telefonu">
<!ENTITY sendtophoneContext.label "Odeslat tento odkaz do telefonu">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Odeslat tento obrázek do telefonu">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Odeslat tento text do telefonu">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Odeslat tuto stránku do telefonu">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Odhlásit">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Nastavení">
<!ENTITY sendtophoneProtocols.label "Protokoly">
<!ENTITY sendtophoneContextSendFile.label "Odeslat soubory...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Odeslat složku...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Odeslat odkaz z QR kódu do telefonu">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Odeslat obsah schránky">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Odeslat video do telefonu">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Odešle aktuální stránku do telefonu
SendToPhoneTitle=Fox To Phone
InvalidScheme=Nevalidní schéma, odesílejte prosím pouze http:// nebo https:// odkazy.
InfoSent=Odkaz byl odeslán do Vašeho telefonu.
ErrorOnSend=Během odesílání se vyskytla chyba:
LoginRequired=Pro odeslání odkazu je potřeba být přihlášen.
LoginSuccessful=Byl(a) jste přihlášen(a).
DeviceNotRegistered=Nainstalujte chrometophone.apk na Váš telefon
LogoutSuccessful=Byl(a) jste odhlášen(a)
marketLink=Odkaz na market
smsLink=SMS číslo
smstoLink=SMS číslo
telLink=Telefonní číslo
InvalidFile=Soubor není validní
SendFileToPhone=Odeslat soubory do telefonu.
SendFolderToPhone=Odeslat složku do telefonu.
qrTitle=Odkaz na QR obrázek
ConfirmQR=Byl detekován QR obrázek\n"%s"\nOpravdu ho chcete odeslat namísto stránky?
RememberMyDecision=Zapamatovat
qrContextMenu=Odeslat "%s" do telefonu
FileUploadsDisabled=Není možné odeslat soubory do telefonu.
FileTooBig=Soubor je příliš veliký.
videoTitle=Odkaz na video

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Komprimuji složku">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox to Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "Diese Seite auf Ihr Android Gerät schicken.">
<!ENTITY sendtophoneContext.label "Link auf Android senden">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Grafik auf Android senden">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Markierten Text auf Android senden">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Seite auf Android senden">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Abmelden">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Send To Phone Einstellungen">
<!ENTITY sendtophoneProtocols.label "Protokolle">
<!ENTITY sendtophoneContextSendFile.label "Send files...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Sendet die aktuelle Seite auf Ihr Android Gerät
SendToPhoneTitle=Fox To Phone
InvalidScheme=Protokoll nicht unterstützt, bitte senden Sie nur http:// oder https:// links.
InfoSent=Der Link wurde auf Ihr Android Gerät geschickt.
ErrorOnSend=Es gab einen Fehler beim Senden:
LoginRequired=Login erforderlich zum Senden des Links.
LoginSuccessful=Sie sind eingeloggt
DeviceNotRegistered=Die Chome2Phone-App muss auf dem Android Gerät, das mit diesem GMail Account verbunden ist, installiert sein.
LogoutSuccessful=Sie sind abgemeldet.
marketLink=Market Link
smsLink=SMS-Nummer
smstoLink=SMS-Nummer
telLink=Telefonnummer
InvalidFile=Not a valid file
SendFileToPhone=Send files to your phone.
SendFolderToPhone=Send a folder to your phone.
qrTitle=QR Image Link
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
RememberMyDecision=Auswahl merken
qrContextMenu=Send "%s" to Android
FileUploadsDisabled=It's not possible to upload files to the phone.
FileTooBig=The file is too big.
videoTitle=Video Link

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compressing folder">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "Send this page to your Android Phone">
<!ENTITY sendtophoneContext.label "Send this link to Android">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Send this image to Android">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Send this text to Android">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Send this page to Android">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Logout">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Fox To Phone Preferences">
<!ENTITY sendtophoneProtocols.label "Protocols">
<!ENTITY sendtophoneContextSendFile.label "Send files...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Sends the current page to your Android phone
SendToPhoneTitle=Fox To Phone
InvalidScheme=Invalid scheme, please only send http:// or https:// links.
InfoSent=The link has been sent to your phone.
ErrorOnSend=There was an error sending:
LoginRequired=Login required to send the link.
LoginSuccessful=You have logged in.
DeviceNotRegistered=You must install the chrometophone.apk on your phone registered to this GMail account
LogoutSuccessful=You are logged out
marketLink=Market Link
smsLink=SMS Number
smstoLink=SMS Number
telLink=Telephone Number
InvalidFile=Not a valid file
SendFileToPhone=Send files to your phone.
SendFolderToPhone=Send a folder to your phone.
qrTitle=QR Image Link
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
RememberMyDecision=Remember my decision
qrContextMenu=Send "%s" to Android
FileUploadsDisabled=It's not possible to upload files to the phone.
FileTooBig=The file is too big.
videoTitle=Video Link

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compressing folder">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox to Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "Enviar página a Android">
<!ENTITY sendtophoneContext.label "Enviar enlace a Android">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Enviar imagen a Android">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Enviar el texto a Android">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Enviar página a Android">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Salir">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Opciones de Fox to Phone">
<!ENTITY sendtophoneProtocols.label "Protocolos">
<!ENTITY sendtophoneContextSendFile.label "Enviar ficheros...">
<!ENTITY sendtophoneContextSendFile.accesskey "E">
<!ENTITY sendtophoneContextSendFolder.label "Enviar carpeta...">
<!ENTITY sendtophoneContextSendFolder.accesskey "C">
<!ENTITY sendtophoneContextQrImage.label "Enviar imagen QR a Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Enviar el portapapeles">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Enviar video a Android">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Envía la página actual a su teléfono Android
SendToPhoneTitle=Enviar a teléfono
InvalidScheme=Esquema no válido, por favor, envíe sólo enlaces http:// o https://.
InfoSent=El enlace ha sido enviado a su teléfono.
ErrorOnSend=Se ha producido un error al enviar:
LoginRequired=Es necesario identificarse para enviar el enlace.
LoginSuccessful=Se ha identificado correctamente.
DeviceNotRegistered=Debe instalar la aplicación en su teléfono y registrar la misma cuenta de correo
LogoutSuccessful=Ha cerrado su sesión
marketLink=Market link
smsLink=Número SMS
smstoLink=Número SMS
telLink=Número de teléfono
InvalidFile=No es un fichero válido.
SendFileToPhone=Envía ficheros al teléfono.
SendFolderToPhone=Envía una carpeta al teléfono.
qrTitle=Imagen QR
ConfirmQR=Se ha detectado una imagen QR\n"%s"\n¿Quiere enviarlo en lugar de la página?
RememberMyDecision=Recordar mi decisión
qrContextMenu=Enviar "%s" a Android
FileUploadsDisabled=No se pueden enviar ficheros al teléfono.
FileTooBig=El fichero que quiere enviar es demasiado grande.
videoTitle=Video Link

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Comprimiendo carpeta">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Envoyer vers un téléphone">
<!ENTITY sendtophoneToolbarButton.tooltip "Envoyer cette page à votre portable Android">
<!ENTITY sendtophoneContext.label "Envoyer ce lien vers Android">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Envoyer cette image vers Android">
<!ENTITY sendtophoneContextImage.accesskey "i">
<!ENTITY sendtophoneContextText.label "Envoyer ce texte vers Android">
<!ENTITY sendtophoneContextText.accesskey "t">
<!ENTITY sendtophoneContextPage.label "Envoyer cette page vers Android">
<!ENTITY sendtophoneContextPage.accesskey "e">
<!ENTITY sendtophoneContextLogout.label "Déconnexion">
<!ENTITY sendtophoneContextLogout.accesskey "D">
<!ENTITY sendtophoneOptions.title "Envoyer vers les préférences du portable">
<!ENTITY sendtophoneProtocols.label "Protocoles">
<!ENTITY sendtophoneContextSendFile.label "Send files...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Envoie la page en cours sur votre téléphone Android
SendToPhoneTitle=Envoyer vers un téléphone portable
InvalidScheme=Format d'adresse invalide, veuillez envoyer uniquement des liens http:// ou https://.
InfoSent=Le lien a été envoyé à votre mobile.
ErrorOnSend=Une erreur s'est produite au cours de l'envoi :
LoginRequired=Connexion nécessaire pour envoyer ce lien.
LoginSuccessful=Vous êtes connecté(e).
DeviceNotRegistered=Vous devez installer le chrometophone.apk sur votre téléphone inscrit à ce compte GMail
LogoutSuccessful=Vous êtes déconnecté(e)
marketLink=Lien commercial
smsLink=Nombre de SMS
smstoLink=Nombre de SMS
telLink=Numéro de téléphone
InvalidFile=Not a valid file
SendFileToPhone=Send files to your phone.
SendFolderToPhone=Send a folder to your phone.
qrTitle=QR Image Link
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
RememberMyDecision=Se souvenir de mon choix
qrContextMenu=Send "%s" to Android
FileUploadsDisabled=It's not possible to upload files to the phone.
FileTooBig=The file is too big.
videoTitle=Video Link

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compressing folder">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Sionnach chuig Fón">
<!ENTITY sendtophoneToolbarButton.tooltip "Seol an leathanach seo le do Android Seol an leathanach seo le do Android Fón">
<!ENTITY sendtophoneContext.label "Seol an nasc seo chun Android">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Send this image to Android">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Send this text to Android">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Send this page to Android">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Logout">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Fox to Phone Preferences">
<!ENTITY sendtophoneProtocols.label "Protocols">
<!ENTITY sendtophoneContextSendFile.label "Seol files...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Seol folder...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Seol nasc QR chun Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Seol Clipboard">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Seol Video chun Android">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Cuireann an leathanach reatha ar do ghuthán Android
SendToPhoneTitle=Sionnach Chun Fón
InvalidScheme=Scéim neamhbhailí, le do thoil seol http:// amháin nó http:// naisc.
InfoSent=Tá nasc chuig do ghuthán.
ErrorOnSend=Tharla earráid agus a sheoladh:
LoginRequired=Logáil isteach ag teastáil chun a sheoladh chuig an nasc.
LoginSuccessful=Tá tú logáilte isteach
DeviceNotRegistered=Ní mór duit a shuiteáil ar do ghuthán chrometophone.apk cláraithe leis an gcuntas seo Gmail
LogoutSuccessful=Tá tú logáilte amach
marketLink=Nasc chuig an Margadh
smsLink=Uimhir SMS
smstoLink=Uimhir SMS
telLink=Uimhir Theileafóin
InvalidFile=Gan comhad bailí
SendFileToPhone=Seol comhad ar do ghuthán.
SendFolderToPhone=Seol an fhillteáin le do ghuthán.
qrTitle=Nasc íomhá QR
ConfirmQR=Tá an íomhá QR a bhraitear\n"%s"\nAn bhfuil tú ag iarraidh a sheoladh go in ionad an leathanach seo?
RememberMyDecision=Cuimhnigh mo chinneadh
qrContextMenu=Seol "%s" ar do ghuthán.
FileUploadsDisabled=Níl sé indéanta chun comhaid a uaslódáil chuig an bhfón.
FileTooBig=Tá an comhad ró-mhór.
videoTitle=Nasc Video

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compressing folder">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "फोन पर भेजें">
<!ENTITY sendtophoneToolbarButton.tooltip "अपने Android फोन करने के लिए इस पृष्ठ को भेजें">
<!ENTITY sendtophoneContext.label "भेजें Android के लिए इस कड़ी">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Send this image to Android">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Send this text to Android">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Send this page to Android">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Logout">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Fox to Phone Preferences">
<!ENTITY sendtophoneProtocols.label "Protocols">
<!ENTITY sendtophoneContextSendFile.label "Send files...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,22 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=अपने Android फोन करने के लिए वर्तमान पृष्ठ पर भेजता है
SendToPhoneTitle=भेजने के लिए फोन
InvalidScheme=अवैध योजना, केवल http:// या https: / / लिंक: भेजें.
InfoSent=लिंक आपके फोन करने के लिए भेजा गया है.
ErrorOnSend=वहाँ एक भेजने में त्रुटि थी:
LoginRequired=लॉगइन करने के लिए लिंक भेज आवश्यक है.
LoginSuccessful=तुम अंदर लॉग इन किया है
DeviceNotRegistered=आप अपने फोन पर स्थापित chrometophone.apk इस जीमेल खाते में दर्ज करना होगा
LogoutSuccessful=तुम बाहर लॉग इन किया है
marketLink=बाजार के लिए लिंक
smsLink=एसएमएस संख्या
smstoLink=एसएमएस संख्या
telLink=टेलीफोन नंबर
InvalidFile=Not a valid file
SendFileToPhone=Send files to your phone.
SendFolderToPhone=Send a folder to your phone.
qrTitle=QR Image Link
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
qrContextMenu=Send "%s" to Android
FileUploadsDisabled=It's not possible to upload files to the phone.
FileTooBig=The file is too big.
videoTitle=Video Link

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compressing folder">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox to Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "Ezt az oldalt elküldi az Android telefonodra">
<!ENTITY sendtophoneContext.label "Link küldése az Androidra">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Kép küldése az Androidra">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Szöveg küldése az Androidra">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Oldal küldése az Androidra">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Kijelentkezés">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Küldés a Telefon beállításaiba">
<!ENTITY sendtophoneProtocols.label "Protocols">
<!ENTITY sendtophoneContextSendFile.label "Fájlok küldése...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Mappa küldése...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Dekódolt QR link küldése az Androidra">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Vágólap küldése">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Videó küldése az Androidra">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Jelenlegi oldal küldése az Android telefonra
SendToPhoneTitle=Fox To Phone
InvalidScheme=Hibás formátum, kérlek csak http:// vagy https:// linkeket küldj.
InfoSent=A link el lett küldve a telefonodra.
ErrorOnSend=Hiba a küldésnél:
LoginRequired=A link küldéshez szükséges a bejelentkezés.
LoginSuccessful=Előbb jelentkezz be.
DeviceNotRegistered=Először telepítsd a chrometophone.apk fájlt a telefonodra, majd regisztráld a GMail fiókodat.
LogoutSuccessful=Kijelentkeztél.
marketLink=Market link
smsLink=SMS szám
smstoLink=SMS szám
telLink=Telefon szám
InvalidFile=Nem valós fájl
SendFileToPhone=Fájlok küldése a telefonodra.
SendFolderToPhone=Mappa küldése a telefonodra.
qrTitle=QR kép link
ConfirmQR=QR kép észéeéve\n"%s"\nEzt akartod küldeni az oldallal együtt?
RememberMyDecision=Emlékezzen, hogyan döntöttem
qrContextMenu="%s" küldése az Androidra
FileUploadsDisabled=Fájlok feltöltése nem lehetséges a telefonra.
FileTooBig=A fájl mérete túl nagy.
videoTitle=Videó Link

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Mappa tömörítése">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Invia A Cellulare">
<!ENTITY sendtophoneToolbarButton.tooltip "Invia questa pagina al tuo telefono Android">
<!ENTITY sendtophoneContext.label "Invia questo link per Android">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Invia questa immagine per Android">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Invia questo testo per Android">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Invia questa pagina ad Android">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Logout">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Fox To Phone Preferences">
<!ENTITY sendtophoneProtocols.label "Protocols">
<!ENTITY sendtophoneContextSendFile.label "Send files...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,22 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Invia la pagina corrente al vostro telefono Android
SendToPhoneTitle=Fox a Cellulare
InvalidScheme=Schema non valido, si prega di inviare solo http:// o https: / / link.
InfoSent=Il link è stato inviato al tuo telefono cellulare.
ErrorOnSend=Si è verificato un errore durante l'invio:
LoginRequired=Accesso necessario per inviare il link.
LoginSuccessful=Hai loggato
DeviceNotRegistered=È necessario installare il chrometophone.apk sul telefono registrato a questo account GMail
LogoutSuccessful=Sei disconnesso
marketLink=Mercato Link
smsLink=Numero di SMS
smstoLink=Numero di SMS
telLink=Numero di telefono
InvalidFile=Not a valid file
SendFileToPhone=Send files to your phone.
SendFolderToPhone=Send a folder to your phone.
qrTitle=QR Image Link
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
qrContextMenu=Send "%s" to Android
FileUploadsDisabled=It's not possible to upload files to the phone.
FileTooBig=The file is too big.
videoTitle=Video Link

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compressing folder">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "このページを Android に送信">
<!ENTITY sendtophoneContext.label "リンクを Android に送信">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "画像を Android に送信">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "選択したテキストを Android に送信">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "このページを Android に送信">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "ログアウト">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Fox to Phone の設定">
<!ENTITY sendtophoneProtocols.label "プロトコル">
<!ENTITY sendtophoneContextSendFile.label "送信するファイル...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "送信するフォルダ...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "解読した QR リンクを Android に送信">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "クリップボードを Android に送信">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "動画を Android に送信">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=読んでいるページを Android 携帯へ送信します
SendToPhoneTitle=Fox To Phone
InvalidScheme=無効なスキームです。http:// か https:// のリンクを送って下さい。
InfoSent=リンクを携帯電話に送信しています。
ErrorOnSend=送信エラーが発生:
LoginRequired=リンクを送信するためにログインが必要です。
LoginSuccessful=ログインしました。
DeviceNotRegistered=この Gmail アカウントを登録している携帯電話に chrometophone.apk をインストールして下さい
LogoutSuccessful=ログアウトしました
marketLink=マーケットへのリンク
smsLink=SMS番号
smstoLink=SMS番号
telLink=電話番号
InvalidFile=無効なファイル
SendFileToPhone=ファイルを携帯電話へ送信します。
SendFolderToPhone=フォルダを携帯電話へ送信します。
qrTitle=QR 画像リンク
ConfirmQR=QR 画像が解読されました\n"%s"\nこれをページの代わりに送信しますか
RememberMyDecision=決定を記憶
qrContextMenu="%s" を Android に送信
FileUploadsDisabled=このファイルは携帯電話へアップロード出来ません。
FileTooBig=このファイルは大きすぎます。
videoTitle=動画リンク

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "フォルダを圧縮">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox to Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "Verzend deze pagina naar uw Android-telefoon">
<!ENTITY sendtophoneContext.label "Deze koppeling naar Android verzenden">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Deze afbeelding naar Android verzenden">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Deze tekst naar Android verzenden">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Deze pagina naar Android verzenden">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Afmelden">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Fox to Phone-voorkeuren">
<!ENTITY sendtophoneProtocols.label "Protocollen">
<!ENTITY sendtophoneContextSendFile.label "Bestanden verzenden…">
<!ENTITY sendtophoneContextSendFile.accesskey "z">
<!ENTITY sendtophoneContextSendFolder.label "Map verzenden…">
<!ENTITY sendtophoneContextSendFolder.accesskey "M">
<!ENTITY sendtophoneContextQrImage.label "Gedecodeerde QR-koppeling naar Android verzenden">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Klembord verzenden">
<!ENTITY sendtophoneContextSendClipboard.accesskey "K">
<!ENTITY sendtophoneContextVideo.label "Video naar Android verzenden">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Verzendt de huidige pagina naar uw Android-telefoon
SendToPhoneTitle=Fox to Phone
InvalidScheme=Ongeldig protocol, verzend a.u.b. alleen koppelingen van het type http:// of https://.
InfoSent=De koppeling is verzonden naar uw telefoon.
ErrorOnSend=Er is een fout opgetreden bij het verzenden:
LoginRequired=U dient aangemeld te zijn om een koppeling te verzenden.
LoginSuccessful=U bent aangemeld.
DeviceNotRegistered=U dient chrometophone.apk te installeren op uw bij deze Gmail-account geregistreerde telefoon
LogoutSuccessful=U bent afgemeld
marketLink=Marktkoppeling
smsLink=SMS-nummer
smstoLink=SMS-nummer
telLink=Telefoonnummer
InvalidFile=Geen geldig bestand
SendFileToPhone=Bestanden naar uw telefoon verzenden.
SendFolderToPhone=Een map naar uw telefoon verzenden.
qrTitle=QR-afbeeldingskoppeling
ConfirmQR=Er is een QR-afbeelding gedetecteerd\n“%s”\nWilt u deze verzenden in plaats van de pagina?
RememberMyDecision=Mijn keuze onthouden
qrContextMenu=“%s” naar Android verzenden
FileUploadsDisabled=Het is niet mogelijk om bestanden naar de telefoon te uploaden.
FileTooBig=Het bestand is te groot.
videoTitle=Videokoppeling

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compressing folder">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "Envia esta página para seu celular Android">
<!ENTITY sendtophoneContext.label "Enviar este link para o Android">
<!ENTITY sendtophoneContext.accesskey "l">
<!ENTITY sendtophoneContextImage.label "Enviar esta imagem para o Android">
<!ENTITY sendtophoneContextImage.accesskey "i">
<!ENTITY sendtophoneContextText.label "Enviar este texto para o Android">
<!ENTITY sendtophoneContextText.accesskey "t">
<!ENTITY sendtophoneContextPage.label "Enviar esta página para o Android">
<!ENTITY sendtophoneContextPage.accesskey "g">
<!ENTITY sendtophoneContextLogout.label "Logout">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Preferências do Fox To Phone">
<!ENTITY sendtophoneProtocols.label "Protocolos">
<!ENTITY sendtophoneContextSendFile.label "Enviar arquivos...">
<!ENTITY sendtophoneContextSendFile.accesskey "a">
<!ENTITY sendtophoneContextSendFolder.label "Enviar pasta...">
<!ENTITY sendtophoneContextSendFolder.accesskey "p">
<!ENTITY sendtophoneContextQrImage.label "Enviar link QR decodificado para o Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Enviar área de transferência">
<!ENTITY sendtophoneContextSendClipboard.accesskey "t">
<!ENTITY sendtophoneContextVideo.label "Enviar vídeo para o Android">
<!ENTITY sendtophoneContextVideo.accesskey "v">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Envia a página atual para seu celular Android
SendToPhoneTitle=Fox To Phone
InvalidScheme=Esquema inválido. Por favor, só envie links http:// ou https://
InfoSent=O link foi enviado para seu celular.
ErrorOnSend=Houve um erro ao enviar:
LoginRequired=É necessário fazer login para enviar o link.
LoginSuccessful=Você se logou.
DeviceNotRegistered=Você deve instalar o chrometophone.apk no celular registrado com essa conta do GMail
LogoutSuccessful=Você se deslogou
marketLink=Link de mercado
smsLink=Número SMS
smstoLink=Número SMS
telLink=Número do celular
InvalidFile=Não é um arquivo válido
SendFileToPhone=Enviar arquivos para seu celular.
SendFolderToPhone=Enviar uma pasta para seu celular.
qrTitle=Link de imagem QR
ConfirmQR=Uma imagem QR foi detectada\n"%s"\nVocê quer enviá-la ao invés da página?
RememberMyDecision=Lembrar minha decisão
qrContextMenu=Enviar "%s" para o Android
FileUploadsDisabled=Não é possível enviar arquivos para o celular.
FileTooBig=O arquivo é grande demais.
videoTitle=Link para vídeo

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compactando pasta">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
<!ENTITY sendtophoneToolbarButton.tooltip "Отправить страницу в телефон">
<!ENTITY sendtophoneContext.label "Отправить ссылку в телефон">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Послать картинку в телефон">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Отправить текст в телефон">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Отправить страницу в телефон">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Выйти">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Настройки Fox To Phone">
<!ENTITY sendtophoneProtocols.label "Протоколы">
<!ENTITY sendtophoneContextSendFile.label "Отправить файл(ы)…">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Отправить папку…">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Отправить QR-ссылку в телефон">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Отправить содержимое буфера обмена в телефон">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Отправить видео в телефон">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Отправляет страницу в телефон
SendToPhoneTitle=Отправить в телефон
InvalidScheme=Неверная ссылка. Отправлять можно только http и https ссылки
InfoSent=Ссылка была отправлен в телефон
ErrorOnSend=Ошибка отправки:
LoginRequired=Необходимо войти на сайт Google для отправки ссылки
LoginSuccessful=Вы вошли на сайт Google
DeviceNotRegistered=Установите chrometophone.apk на Ваш телефон и зарегистрируйте в нем ваш Google-аккаунт
LogoutSuccessful=Вы вышли из системы
marketLink=Ссылка на Market
smsLink=Телефон для отправки SMS
smstoLink=Телефон для отправки SMS
telLink=Номер телефона
InvalidFile=Неправильный файл
SendFileToPhone=Отправить файл(ы) в телефон
SendFolderToPhone=Отправить папку в телефон
qrTitle=QR-ссылка
ConfirmQR=Обнаружена картинка с QR-ссылкой.\n"%s"\nВы хотите отправить ссылку вместо страницы?
RememberMyDecision=Запомнить выбор
qrContextMenu=Отправить "%s" в телефон
FileUploadsDisabled=Невозможно загрузить файл(ы) на телефон
FileTooBig=Файл слишком большой
videoTitle=Ссылка на видео

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Сжатие папки">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Пошаљи на телефон">
<!ENTITY sendtophoneToolbarButton.tooltip "Пошаљи ову страницу на свој телефон Андроид">
<!ENTITY sendtophoneContext.label "Пошаљи ову везу на Андроид">
<!ENTITY sendtophoneContext.accesskey "А">
<!ENTITY sendtophoneContextImage.label "Пошаљи ову слику на Андроид">
<!ENTITY sendtophoneContextImage.accesskey "С">
<!ENTITY sendtophoneContextText.label "Пошаљи овај текст на Андроид">
<!ENTITY sendtophoneContextText.accesskey "Т">
<!ENTITY sendtophoneContextPage.label "Пошаљи ову страницу на свој телефон Андроид">
<!ENTITY sendtophoneContextPage.accesskey "Р">
<!ENTITY sendtophoneContextLogout.label "Одјави се">
<!ENTITY sendtophoneContextLogout.accesskey "О">
<!ENTITY sendtophoneOptions.title "Подешавања слања у телефон">
<!ENTITY sendtophoneProtocols.label "Протоколи">
<!ENTITY sendtophoneContextSendFile.label "Пошаљи датотеке...">
<!ENTITY sendtophoneContextSendFile.accesskey "Д">
<!ENTITY sendtophoneContextSendFolder.label "Пошаљи фасциклу...">
<!ENTITY sendtophoneContextSendFolder.accesskey "Ф">
<!ENTITY sendtophoneContextQrImage.label "Пошаљи декодирану QR везу на Андроид">
<!ENTITY sendtophoneContextQrImage.accesskey "В">
<!ENTITY sendtophoneContextSendClipboard.label "Пошаљи садржај оставе">
<!ENTITY sendtophoneContextSendClipboard.accesskey "Т">
<!ENTITY sendtophoneContextVideo.label "Пошаљи видео на Андроид">
<!ENTITY sendtophoneContextVideo.accesskey "Д">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Пошаљи тренутну страницу на свој телефон Андроид
SendToPhoneTitle=Пошаљи на телефон
InvalidScheme=Неважећа шема. Пошаљите само http:// или https:// везе.
InfoSent=Веза је послата на телефон.
ErrorOnSend=Дошло је до грешке приликом слања:
LoginRequired=Потребно је да се пријавите да бисте послали везу.
LoginSuccessful=Пријавили сте се.
DeviceNotRegistered=Морате да инсталирате chrometophone.apk на телефон са регистрованим налогом за GMail
LogoutSuccessful=Одјављени сте
marketLink=Тржишна веза
smsLink=SMS број
smstoLink=SMS број
telLink=Број телефона
InvalidFile=Неважећа датотека
SendFileToPhone=Пошаљите датотеке на свој телефон
SendFolderToPhone=Пошаљите фасциклу на свој телефон
qrTitle=QR веза до слике
ConfirmQR=Препозната је QR слика\n„%s”\nЖелите ли да је пошаљете уместо ове странице?
RememberMyDecision=Упамти мој одговор
qrContextMenu=Пошаљи „%s” у Андроид
FileUploadsDisabled=Није могуће слати слике на телефон.
FileTooBig=Датотека је превелика.
videoTitle=Веза до видео снимка

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Сажимање фасцикле">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Skicka till Telefon">
<!ENTITY sendtophoneToolbarButton.tooltip "Skicka denna sida till din Android Telefonerna">
<!ENTITY sendtophoneContext.label "Skicka denna länk till Android">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "Skicka denna bild till Android">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "Skicka denna text till Android">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "Skicka denna sida till Android">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "Logga ut">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Fox To Phone Preferences">
<!ENTITY sendtophoneProtocols.label "Protocols">
<!ENTITY sendtophoneContextSendFile.label "Send files...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=Skickar den aktuella sidan till din Android telefonen
SendToPhoneTitle=Fox till Telefon
InvalidScheme=Ogiltig, vänligen skicka bara http:// eller https: / / länkar.
InfoSent=Länken har skickats till telefonen.
ErrorOnSend=Det uppstod ett fel sändning:
LoginRequired=Kräver inloggning för att skicka länken.
LoginSuccessful=Du har loggat in
DeviceNotRegistered=Du måste installera chrometophone.apk på telefonen registrerad i detta Gmail-konto
LogoutSuccessful=Du är utloggad
marketLink=Market Link
smsLink=SMS nummer
smstoLink=SMS nummer
telLink=Telefonnummer
InvalidFile=Not a valid file
SendFileToPhone=Send files to your phone.
SendFolderToPhone=Send a folder to your phone.
qrTitle=QR Image Link
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
RememberMyDecision=Remember my decision
qrContextMenu=Send "%s" to Android
FileUploadsDisabled=It's not possible to upload files to the phone.
FileTooBig=The file is too big.
videoTitle=Video Link

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label "Compressing folder">

View File

@@ -1,24 +0,0 @@
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone<6E><65><EFBFBD><EFBFBD>">
<!ENTITY sendtophoneToolbarButton.tooltip "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><E6B5BD><EFBFBD>İ<EFBFBD>׿<EFBFBD>ֻ<EFBFBD>">
<!ENTITY sendtophoneContext.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>İ<EFBFBD>׿<EFBFBD>ֻ<EFBFBD>">
<!ENTITY sendtophoneContext.accesskey "A">
<!ENTITY sendtophoneContextImage.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>׿<EFBFBD>ֻ<EFBFBD>">
<!ENTITY sendtophoneContextImage.accesskey "A">
<!ENTITY sendtophoneContextText.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>׿<EFBFBD>ֻ<EFBFBD>">
<!ENTITY sendtophoneContextText.accesskey "A">
<!ENTITY sendtophoneContextPage.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><E6B5BD><EFBFBD>İ<EFBFBD>׿<EFBFBD>ֻ<EFBFBD>">
<!ENTITY sendtophoneContextPage.accesskey "A">
<!ENTITY sendtophoneContextLogout.label "<22>˳<EFBFBD><CBB3><EFBFBD>¼">
<!ENTITY sendtophoneContextLogout.accesskey "L">
<!ENTITY sendtophoneOptions.title "Fox To Phone <20><><EFBFBD><EFBFBD>">
<!ENTITY sendtophoneProtocols.label <><D0AD>">
<!ENTITY sendtophoneContextSendFile.label "<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>...">
<!ENTITY sendtophoneContextSendFile.accesskey "S">
<!ENTITY sendtophoneContextSendFolder.label "<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>...">
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
<!ENTITY sendtophoneContextQrImage.label "<22>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD>QR<51><52><EFBFBD>ӷ<EFBFBD><D3B7>͵<EFBFBD><CDB5><EFBFBD>׿<EFBFBD>ֻ<EFBFBD>">
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
<!ENTITY sendtophoneContextSendClipboard.label "<22><><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>">
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
<!ENTITY sendtophoneContextVideo.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>׿<EFBFBD>ֻ<EFBFBD>">
<!ENTITY sendtophoneContextVideo.accesskey "V">

View File

@@ -1,23 +0,0 @@
extensions.sendtophone@martinezdelizarrondo.com.description=发送当前页面到您的Android手机
SendToPhoneTitle=Fox To Phone
InvalidScheme=无效的计划请只发送http://或https/ /链接。
InfoSent=该链接已发送到您的手机。
ErrorOnSend=发生一个错误发送:
LoginRequired=登录后才可发送链接。
LoginSuccessful=您已登录
DeviceNotRegistered=您必须安装chrometophone.apk在您的手机从而注册此Gmail帐户
LogoutSuccessful=您已经登出
marketLink=市场链接
smsLink=SMS号码
smstoLink=SMS号码
telLink=电话号码
InvalidFile=不是一个有效的文件
SendFileToPhone=发送文件到您的手机。
SendFolderToPhone=发送到您的手机文件夹。
qrTitle=QR图像链接
ConfirmQR=一个QR图像被检测到了\n"%s"\n发送QR图像代替此页
RememberMyDecision=记住我的决定
qrContextMenu=发送“s”给Android
FileUploadsDisabled=不能上传文件到手机上。
FileTooBig=该文件太大了。
videoTitle=视频链接

View File

@@ -1 +0,0 @@
<!ENTITY compressing.label <><D1B9><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -1,32 +0,0 @@
#sendtophone-toolbar-button
{
list-style-image: url("chrome://sendtophone/skin/toolbar-button.png");
-moz-image-region: rect(0px 24px 24px 0px);
}
#sendtophone-toolbar-button:hover
{
-moz-image-region: rect(24px 24px 48px 0px);
}
[iconsize="small"] #sendtophone-toolbar-button
{
-moz-image-region: rect( 0px 40px 16px 24px);
}
[iconsize="small"] #sendtophone-toolbar-button:hover
{
-moz-image-region: rect(24px 40px 40px 24px);
}
#sendtophone-toolbar-button:-moz-drag-over {
border: 1px solid black;
}
#context-sendtophone-link,
#context-sendtophone-image,
#context-sendtophone-qrimage,
#context-sendtophone-text,
#context-sendtophone-page
{
-moz-binding: url(chrome://global/content/bindings/menu.xml#menuitem-iconic) !important;
list-style-image: url("chrome://sendtophone/skin/toolbar-button.png") !important;
-moz-image-region: rect( 0px 40px 16px 24px) !important;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,63 +0,0 @@
#UploadsBox {
-moz-appearance: none;
margin: 0;
padding: 0;
border-width: 0;
}
/* Upload View Items */
richlistitem[type="upload"] {
padding: 5px;
min-height: 44px !important;
border: 1px solid transparent;
}
richlistitem[type="upload"]:not([selected="true"]):nth-child(odd) {
background-color: -moz-oddtreerow;
}
richlistitem[type="upload"] .status {
font-size: smaller;
color: #555;
}
richlistitem[selected="true"][type="upload"] {
outline: none;
}
richlistbox:focus > richlistitem[selected="true"][type="upload"] .status {
color: highlighttext;
}
richlistitem[type="upload"] button {
-moz-appearance: none;
min-height: 16px;
min-width: 16px;
max-height: 16px;
max-width: 16px;
padding: 0;
margin: 0 1px 0 1px;
}
/**
* Images for buttons in the interface
*/
richlistitem[type="upload"] button {
list-style-image: url(chrome://mozapps/skin/downloads/buttons.png);
}
.cancel {
-moz-image-region: rect(0px, 16px, 16px, 0px);
}
.cancel:hover {
-moz-image-region: rect(0px, 32px, 16px, 16px);
}
.cancel:hover:active {
-moz-image-region: rect(0px, 48px, 16px, 32px);
}
/* prevent flickering when changing states */
.uploadTypeIcon {
min-height: 32px;
min-width: 32px;
-moz-padding-end: 2px;
}

View File

@@ -1,15 +0,0 @@
pref("extensions.sendtophone.installedButton", false);
pref("extensions.sendtophone.appUrl", "https://chrometophone.appspot.com");
pref("extensions.sendtophone.proxyUrl", "http://foxtophone.com/f2p.php?link=");
pref("extensions.sendtophone.fileServerUrl", "");
pref("extensions.sendtophone.fileUploadMaxKb", 50000);
pref("extensions.sendtophone.SearchQR", 0); // 0: search and prompt, 1: search and launch automatically, 2: don't search
pref("extensions.sendtophone.protocols.market", true);
pref("extensions.sendtophone.protocols.sms", true);
pref("extensions.sendtophone.protocols.smsto", true);
pref("extensions.sendtophone.protocols.tel", true);
// https://developer.mozilla.org/en/Localizing_extension_descriptions
pref("extensions.sendtophone@martinezdelizarrondo.com.description", "chrome://sendtophone/locale/overlay.properties");

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>sendtophone@martinezdelizarrondo.com</em:id>
<em:type>2</em:type>
<em:name>Fox To Phone</em:name>
<em:version>1.1.2beta4</em:version>
<em:creator>Alfonso &amp; Patrick</em:creator>
<em:description>Send links to your Android 2.2 phone using the new C2DM service. Based on the ChromeToPhone extension.</em:description>
<em:iconURL>chrome://sendtophone/skin/icon.png</em:iconURL>
<em:homepageURL>http://www.foxtophone.com</em:homepageURL>
<em:optionsURL>chrome://sendtophone/content/options.xul</em:optionsURL>
<em:contributor>Anil K Solanki (icons)</em:contributor>
<em:contributor>BabelZilla translators:</em:contributor>
<em:contributor>markh van BabelZilla.org (Dutch)</em:contributor>
<em:contributor>Goofy (French)</em:contributor>
<em:contributor>Emanuel S. (German)</em:contributor>
<em:contributor>ДакСРБИЈА (Serbian)</em:contributor>
<em:contributor>Martin Zubek (Czech)</em:contributor>
<em:contributor>mjy (Japanese)</em:contributor>
<em:contributor>Marcelo Ghelman (ghelman.net) (Portuguese (Brazilian))</em:contributor>
<em:contributor>LA (Russian)</em:contributor>
<em:contributor>yongdong7 (Chinese simplified)</em:contributor>
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!-- Firefox -->
<em:minVersion>3.5</em:minVersion>
<em:maxVersion>6.0a1</em:maxVersion>
</Description>
</em:targetApplication>
</Description>
</RDF>

View File

@@ -1,137 +0,0 @@
/* This js module doesn't export anything, it's meant to handle the protocol registration/unregistration */
var EXPORTED_SYMBOLS = [];
const Cc = Components.classes;
const Ci = Components.interfaces;
var manager = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
var strings = Cc["@mozilla.org/intl/stringbundle;1"]
.getService(Ci.nsIStringBundleService)
.createBundle("chrome://sendtophone/locale/overlay.properties");
// Utility function to handle the preferences
// https://developer.mozilla.org/en/Code_snippets/Preferences
function PrefListener(branchName, func) {
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Ci.nsIPrefService);
var branch = prefService.getBranch(branchName);
branch.QueryInterface(Components.interfaces.nsIPrefBranch2);
this.register = function() {
branch.addObserver("", this, false);
branch.getChildList("", { })
.forEach(function (name) { func(branch, name); });
};
this.unregister = function unregister() {
if (branch)
branch.removeObserver("", this);
};
this.observe = function(subject, topic, data) {
if (topic == "nsPref:changed")
func(branch, data);
};
}
// our XPCOM components to handle the protocols
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
function SendToPhone_ProtocolWrapper( properties )
{
var myHandler = function() {};
myHandler.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolHandler]),
_xpcom_factory: {
singleton: null,
createInstance: function (aOuter, aIID) {
if (aOuter) throw Components.results.NS_ERROR_NO_AGGREGATION;
if (!this.singleton) this.singleton = new myHandler();
return this.singleton.QueryInterface(aIID);
}
},
// nsIProtocolHandler implementation:
// default attributes
protocolFlags : Ci.nsIProtocolHandler.URI_LOADABLE_BY_ANYONE,
defaultPort : -1,
newURI : function(aSpec, aCharset, aBaseURI)
{
var uri = Components.classes["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI);
uri.spec = aSpec;
return uri;
},
newChannel : function(aURI)
{
var myURI = decodeURI(aURI.spec);
// Core functions loaded on demand
if (typeof sendtophoneCore == "undefined")
Components.utils.import("resource://sendtophone/sendtophone.js");
sendtophoneCore.send(this.linkTitle, myURI, "")
// return a fake empty channel so current window doesn't change
return Components.classes[ "@mozilla.org/network/input-stream-channel;1" ].createInstance(Ci.nsIChannel);
},
scheme : properties.scheme,
classDescription : "SendToPhone handler for " + properties.scheme,
classID : Components.ID( properties.ID ),
contractID : "@mozilla.org/network/protocol;1?name=" + properties.scheme,
linkTitle : strings.GetStringFromName( properties.scheme + "Link" ) // Translations
}
return myHandler;
}
// This function takes care of register/unregister the protocol handlers as requested
// It's called when the preferences change.
function toggleProtocolHandler(branch, name)
{
// Get the value in preferences
var register = branch.getBoolPref(name);
// Retrieve the object for that protocol
var protocolHandler = sendToPhoneProtocols[ name ];
// If someone did change the defaults for mms or mmsto this
// function will be called, but the handlers have been removed.
if (!protocolHandler)
return;
var proto = protocolHandler.prototype;
if (register)
{
if (!protocolHandler.registered)
manager.registerFactory(proto.classID,
proto.classDescription,
proto.contractID,
proto._xpcom_factory);
protocolHandler.registered = true;
}
else
{
if (protocolHandler.registered)
manager.unregisterFactory(proto.classID, proto._xpcom_factory);
protocolHandler.registered = false;
}
}
// Each protocol handler
var sendToPhoneProtocols = {
market: SendToPhone_ProtocolWrapper( { scheme: "market", ID: "{751de080-95d1-11df-981c-0800200c9a66}" } ) ,
sms: SendToPhone_ProtocolWrapper( { scheme: "sms", ID: "{345de080-95d1-11df-981c-0800200c9a66}" } ) ,
smsto: SendToPhone_ProtocolWrapper( { scheme: "smsto", ID: "{854de080-95d1-11df-981c-0800200c9a66}" } ) ,
tel: SendToPhone_ProtocolWrapper( { scheme: "tel", ID: "{948de080-95d1-11df-981c-0800200c9a66}" } )
};
// Listen for changes in the preferences and register the protocols as needed.
var preferencesListener = new PrefListener("extensions.sendtophone.protocols.", toggleProtocolHandler);
preferencesListener.register();

View File

@@ -1,522 +0,0 @@
/*
Copyright 2010 Alfonso Martínez de Lizarrondo & Patrick O'Reilly
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.
*/
// https://developer.mozilla.org/en/JavaScript_code_modules/Using_JavaScript_code_modules
var EXPORTED_SYMBOLS = ["sendtophoneCore"];
const Cc = Components.classes;
const Ci = Components.interfaces;
var sendtophoneCore = {
req : null,
apiVersion : 4,
loggedInUrl : "http://code.google.com/p/chrometophone/logo?login",
loggedOutUrl : "http://code.google.com/p/chrometophone/logo?logout",
apkUrl : "http://code.google.com/p/chrometophone/wiki/AndroidApp",
retryCount : 0,
init: function()
{
this.strings = Cc["@mozilla.org/intl/stringbundle;1"]
.getService(Ci.nsIStringBundleService)
.createBundle("chrome://sendtophone/locale/overlay.properties");
this.prefs = Cc["@mozilla.org/preferences-service;1"]
.getService(Ci.nsIPrefService)
.getBranch("extensions.sendtophone.") ;
// Allow the people to use their own server if they prefer to not trust this server
var baseUrl = this.prefs.getCharPref( "appUrl" ) ;
this.sendUrl = baseUrl + '/send?ver=' + this.apiVersion;
this.logInUrl = baseUrl + '/signin?ver=' + this.apiVersion + '&extret=' + encodeURIComponent(this.loggedInUrl);
this.logOutUrl = baseUrl + '/signout?ver=' + this.apiVersion + '&extret=' + encodeURIComponent(this.loggedOutUrl);
},
getString: function(name)
{
return this.strings.GetStringFromName(name);
},
// Shows a message in a modal alert
alert: function(text)
{
var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Ci.nsIPromptService);
promptService.alert(null, this.getString("SendToPhoneTitle"),
text);
},
// Shows a message in a growl-like notification
popupNotification: function(text)
{
var title = this.getString("SendToPhoneTitle");
var image = "chrome://sendtophone/skin/icon.png";
try {
// Avoid crash on Fedora 12.
// Reported on 8th June https://addons.mozilla.org/en-US/firefox/reviews/display/161941
var listener = {
observe: function(subject, topic, data) {}
};
Cc['@mozilla.org/alerts-service;1']
.getService(Ci.nsIAlertsService)
.showAlertNotification(image, title, text, false, '', listener);
} catch(e)
{
// prevents runtime error on platforms that don't implement nsIAlertsService
var win = Cc['@mozilla.org/embedcomp/window-watcher;1']
.getService(Ci.nsIWindowWatcher)
.openWindow(null, 'chrome://global/content/alerts/alert.xul',
'_blank', 'chrome,titlebar=no,popup=yes', null);
win.arguments = [image, title, text, false, ''];
}
},
// For use while debugging
toConsole: function(text)
{
var aConsoleService = Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService);
aConsoleService.logStringMessage( text );
},
processXHR: function(url, method, data, callback)
{
var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Ci.nsIXMLHttpRequest);
req.open(method, url, true);
req.setRequestHeader('X-Same-Domain', 'true'); // XSRF protector
if (method=='POST')
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.onreadystatechange = function()
{
// here this == req
if (this.readyState == 4)
{
var body = req.responseText;
if (req.status == 200)
{
// Check if the body is a html redirect
var redirectMatch = body.match(/<meta http-equiv="refresh" content="\d;\s*url=(&#39;)?(.*)\1">/);
if (redirectMatch)
{
var redirectUrl = redirectMatch[2].replace(/&amp;/g, '&');
if (redirectUrl == sendtophoneCore.loggedOutUrl)
{
sendtophoneCore.logoutSuccessful();
return;
}
// Do the redirect and use the original callback
sendtophoneCore.processXHR( redirectUrl, 'GET', null, callback);
}
else
callback.call( sendtophoneCore, req );
}
else
{
if (req.status==500 && body.substr(0,27) =="ERROR (Unable to send link)"){
sendtophoneCore.openTab( "http://www.foxtophone.com/help/error-500/" );
}
else if (req.status==400&&this.retryCount<4){
this.retryCount++;
this.processXHR(this.sendUrl, 'POST', this.pendingMessage, this.processSentData);
}
else
sendtophoneCore.alert(sendtophoneCore.getString("ErrorOnSend") + ' (status ' + req.status + ')\r\n' + body);
}
}
};
// To send correctly cookies.
// Force the request to include cookies even though this chrome code
// is seen as a third-party, so the server knows the user for which we are
// requesting favorites (or anything else user-specific in the future).
// This only works in Firefox 3.6; in Firefox 3.5 the request will instead
// fail to send cookies if the user has disabled third-party cookies.
try {
req.channel.QueryInterface(Ci.nsIHttpChannelInternal).
forceAllowThirdPartyCookie = true;
}
catch(ex) { /* user is using Firefox 3.5 */ }
req.send( data );
},
// Main function
// This is method that has to be called from outside this module
// The other available method is sendFile
send: function(title, url, selection)
{
if (!this.sendUrl)
this.init();
// Local files: upload them to a web server
if ((/^file:/i).test(url))
{
var nsFile = Cc["@mozilla.org/network/io-service;1"]
.getService(Ci.nsIIOService)
.getProtocolHandler("file")
.QueryInterface(Ci.nsIFileProtocolHandler)
.getFileFromURLSpec(url);
this.sendFile(nsFile);
return;
}
if (!(/^(https?|market|tel|sms(to)?|mailto|ftp):/i).test( url ))
{
this.alert(this.getString("InvalidScheme"));
return;
}
var max_length = 1024;
if (selection.length > max_length)
selection = selection.substring(0, max_length);
// Send the protocols that aren't currently whitelisted through a proxy server
if (!(/^(https?):/i).test( url ))
{
// Rewrite the URI so it's send first to the proxy
var proxyUrl;
proxyUrl = this.prefs.getCharPref( "proxyUrl" );
if (proxyUrl)
url = proxyUrl + encodeURIComponent( url);
}
var data = 'title=' + encodeURIComponent(title) +
'&url=' + encodeURIComponent(url) + '&sel=' + encodeURIComponent(selection);
this.pendingMessage = data;
this.processXHR(this.sendUrl, 'POST', data, this.processSentData);
},
processSentData : function(req)
{
var body = req.responseText;
if (body.substring(0, 2) == 'OK')
{
delete this.pendingMessage;
this.retryCount=0;
this.popupNotification(this.getString("InfoSent"));
return;
}
if (body.indexOf('LOGIN_REQUIRED') == 0)
{
this.popupNotification( this.getString("LoginRequired") );
//Open Google login page and close tab when done
this.openTab(this.logInUrl, this.loggedInUrl, function() {sendtophoneCore.loginSuccessful();} );
return;
}
if (body.indexOf('DEVICE_NOT_REGISTERED') == 0)
{
this.popupNotification(this.getString("DeviceNotRegistered"));
// Open tab with apk download
this.openTab(this.apkUrl);
return;
}
this.alert(this.getString("ErrorOnSend") + '\r\n' + body);
},
logout: function()
{
if (!this.prefs)
this.init();
// Open Google logout page, and close tab when finished
this.openTab(this.logOutUrl, this.loggedOutUrl, function() {sendtophoneCore.logoutSuccessful();} );
/*
// This doesn't work if third party cookies are bloqued. Why???
this.processXHR(this.logOutUrl, 'GET', null, function(req)
{
// This will be called only if there's a problem
this.alert(this.getString("LogoutError") + '\r\n' + req.responseText );
});
*/
},
openTab: function(url, successUrl, callback)
{
var gBrowser = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator)
.getMostRecentWindow("navigator:browser")
.gBrowser;
var lastTabIndex = gBrowser.tabContainer.selectedIndex;
var tab = gBrowser.addTab(url);
gBrowser.selectedTab = tab;
if (successUrl && callback)
{
var c2pTab = gBrowser.getBrowserForTab(tab);
//Add listener for callback URL
c2pTab.addEventListener("load", function () {
if(successUrl==c2pTab.currentURI.spec){
callback();
// Close tab
gBrowser.removeTab(tab);
// ReFocus on tab being sent
gBrowser.selectedTab = gBrowser.tabContainer.childNodes[lastTabIndex];
}
}, true);
}
},
logoutSuccessful: function()
{
this.popupNotification(this.getString("LogoutSuccessful"));
},
loginSuccessful: function()
{
this.popupNotification( this.getString("LoginSuccessful") );
// Send pending message
this.processXHR(this.sendUrl, 'POST', this.pendingMessage, this.processSentData);
},
toUTF8: function(str)
{
var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
.createInstance(Ci.nsIScriptableUnicodeConverter);
converter.charset = "utf-8";
var data = converter.ConvertFromUnicode(str);
return data + converter.Finish();
},
sendFile: function( nsFile, callback )
{
if (!this.prefs)
this.init();
let uri = this.prefs.getCharPref( "fileServerUrl" );
if (!uri)
{
this.alert( this.getString("FileUploadsDisabled") );
return;
}
if (typeof sendtophoneUploadsManager == "undefined")
Components.utils.import("resource://sendtophone/uploadsManager.js");
if (nsFile.isDirectory())
{
// There's no progress notification while compressing, only on end.
let progressId = sendtophoneUploadsManager.addZip(nsFile);
// Compress the contents to a zip file
zipFolder(nsFile, function(nsZip)
{
sendtophoneUploadsManager.finishedUpload( progressId );
// Send the zip and delete it afterwards
sendtophoneCore.sendFile(nsZip, function() { nsZip.remove(false) });
}
)
return;
}
if (!nsFile.isFile())
{
this.alert(this.getString("InvalidFile"));
return;
}
let size = Math.round(nsFile.fileSize / 1024);
let maxSize = this.prefs.getIntPref( "fileUploadMaxKb" );
if (maxSize>0 && size>maxSize)
{
this.alert( this.getString("FileTooBig") );
return;
}
let uploadName = nsFile.leafName;
// Try to determine the MIME type of the file
var mimeType = "text/plain";
try {
var mimeService = Cc["@mozilla.org/mime;1"]
.getService(Ci.nsIMIMEService);
mimeType = mimeService.getTypeFromFile(nsFile); // nsFile is an nsIFile instance
}
catch(e) { /* eat it; just use text/plain */ }
// Buffer the upload file
var inStream = Cc["@mozilla.org/network/file-input-stream;1"]
.createInstance(Ci.nsIFileInputStream);
inStream.init(nsFile, 1, 1, inStream.CLOSE_ON_EOF);
var bufInStream = Cc["@mozilla.org/network/buffered-input-stream;1"]
.createInstance(Ci.nsIBufferedInputStream);
bufInStream.init(inStream, 4096);
//Setup the boundary start stream
var boundary = "--SendToPhone-------------" + Math.random();
var startBoundryStream = Cc["@mozilla.org/io/string-input-stream;1"]
.createInstance(Ci.nsIStringInputStream);
startBoundryStream.setData("\r\n--"+boundary+"\r\n",-1);
// Setup the boundary end stream
var endBoundryStream = Cc["@mozilla.org/io/string-input-stream;1"]
.createInstance(Ci.nsIStringInputStream);
endBoundryStream.setData("\r\n--"+boundary+"--",-1);
// Setup the mime-stream - the 'part' of a multi-part mime type
var mimeStream = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(Ci.nsIMIMEInputStream);
mimeStream.addContentLength = false;
mimeStream.addHeader("Content-disposition","form-data; charset: utf-8; name=\"upload\"; filename=\"" + this.toUTF8(uploadName) + "\"");
mimeStream.addHeader("Content-type", mimeType);
mimeStream.setData(bufInStream);
// Setup a multiplex stream
var multiStream = Cc["@mozilla.org/io/multiplex-input-stream;1"]
.createInstance(Ci.nsIMultiplexInputStream);
multiStream.appendStream(startBoundryStream);
multiStream.appendStream(mimeStream);
multiStream.appendStream(endBoundryStream);
var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Ci.nsIXMLHttpRequest);
// Show the progress of uploads
sendtophoneUploadsManager.addUpload(nsFile, req);
req.open('POST', uri, true);
req.setRequestHeader("Content-length",multiStream.available());
req.setRequestHeader("Content-type","multipart/form-data; charset: utf-8; boundary="+boundary);
req.addEventListener("load", function(event)
{
// If there's a callback (to delete temporary files) we call it now
if (callback)
callback();
var body = event.target.responseXML;
var uploads;
if (body && (uploads = body.documentElement.getElementsByTagName("upload")))
{
var data = uploads[0].firstChild.data;
// sendtophoneCore.toConsole(data);
sendtophoneCore.send(uploadName, data, "");
return;
}
// error.
sendtophoneCore.alert(uri + "\r\n" + event.target.responseText);
}, false);
// Handle errors or aborted uploads
req.addEventListener("error", function(evt)
{
sendtophoneCore.alert("Error while sending the file to the server:\r\n" + uri);
// If there's a callback (to delete temporary files) we call it now
if (callback)
callback();
}, false);
req.addEventListener("abort", function(evt)
{
// Silent.
// If there's a callback (to delete temporary files) we call it now
if (callback)
callback();
}, false);
/*
if required for cookies... don't think so.
try {
req.channel.QueryInterface(Ci.nsIHttpChannelInternal).
forceAllowThirdPartyCookie = true;
}
catch(ex) {}
*/
req.send(multiStream);
}
};
/* Zipping functions */
const PR_RDONLY = 0x01;
const PR_WRONLY = 0x02;
const PR_RDWR = 0x04;
const PR_CREATE_FILE = 0x08;
const PR_APPEND = 0x10;
const PR_TRUNCATE = 0x20;
const PR_SYNC = 0x40;
const PR_EXCL = 0x80;
/**
* folder is a nsFile pointing to a folder
* callback is a function that it's called after the zip is created. It has one parameter: the nsFile created
*/
function zipFolder(folder, callback)
{
// get TMP directory
var nsFile = Cc["@mozilla.org/file/directory_service;1"].
getService(Ci.nsIProperties).
get("TmpD", Ci.nsIFile);
// Create a new file
nsFile.append( folder.leafName + ".zip");
nsFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
var zipWriter = Components.Constructor("@mozilla.org/zipwriter;1", "nsIZipWriter");
var zipW = new zipWriter();
zipW.open(nsFile, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE);
addFolderContentsToZip(zipW, folder, "");
// We don't want to block the main thread, so the zipping is done asynchronously
// and here we get the notification that it has finished
var observer = {
onStartRequest: function(request, context) {},
onStopRequest: function(request, context, status)
{
zipW.close();
// Notify that we're done. Now it must be sent and deleted afterwards
callback(nsFile);
}
}
zipW.processQueue(observer, null);
}
/**
* function to add the contents of a folder recursively
* zipW a nsIZipWriter object
* folder a nsFile object pointing to a folder
* root a string defining the relative path for this folder in the zip
*/
function addFolderContentsToZip(zipW, folder, root)
{
var entries = folder.directoryEntries;
while(entries.hasMoreElements())
{
var entry = entries.getNext();
entry.QueryInterface(Ci.nsIFile);
zipW.addEntryFile(root + entry.leafName, Ci.nsIZipWriter.COMPRESSION_DEFAULT, entry, true);
if (entry.isDirectory())
addFolderContentsToZip(zipW, entry, root + entry.leafName + "/");
}
}

View File

@@ -1,278 +0,0 @@
var EXPORTED_SYMBOLS = ["sendtophoneUploadsManager"];
const Cc = Components.classes;
const Ci = Components.interfaces;
var sendtophoneUploadsManager = {
uploads: {},
_counter : 0,
_listeners: [],
// Add a listener that will be called when there's any change on the uploads
addListener: function( obj )
{
this._listeners.push( obj );
},
// Remove an existing listener object
removeListener: function( obj )
{
for(let i=0, listener; listener = this._listeners[i]; i++)
{
if (obj == listener)
{
this._listeners.splice(i, 1);
return;
}
}
},
/**
* Adds a new upload
* nsFile: The file that it's being send
* req: the XmlHttpRequest that will send that file
*/
addUpload: function(nsFile, req)
{
let id = this._addToUploads( {file:nsFile, req:req, state:0, percent:0,
startTime: Date.now() - 100, currBytes: 0, maxBytes: nsFile.fileSize} );
req.upload.addEventListener("progress", function(evt)
{
if (evt.lengthComputable) {
sendtophoneUploadsManager.updateProgress(id, evt.loaded, evt.total);
}
}, false);
req.upload.addEventListener("load", function(evt)
{
sendtophoneUploadsManager.updateProgress(id, evt.loaded, evt.total);
}, false);
// Clear row when it has finished
req.addEventListener("load", function(evt)
{
sendtophoneUploadsManager.finishedUpload(id);
}, false);
// If there's an error or it's aborted, finish its tracking.
req.addEventListener("error", function(evt)
{
sendtophoneUploadsManager.finishedUpload(id);
}, false);
req.addEventListener("abort", function(evt)
{
sendtophoneUploadsManager.finishedUpload(id);
}, false);
},
/**
* Adds a zip (it's not an upload, but this way we can show that something is going on)
* nsFolder: a nsFile object pointing to the folder being compressed
* When the compression has finished, the external code has to call .finishedUpload(id)
* with the id returned in this method.
*/
addZip: function(nsFolder)
{
return this._addToUploads( {file:nsFolder, state:1} );
},
_addToUploads: function( obj )
{
initShowTest();
// Creates a counter to automatically assign new ids to each upload
let id = this._counter++;
obj.id = id;
this.uploads[id] = obj;
for(let i=0, listener; listener = this._listeners[i]; i++)
listener.fileAdded( obj );
return id;
},
showWindow: function()
{
// Open the tab
openAndReuseOneTabPerURL("chrome://sendtophone/content/uploads.xul");
},
updateProgress: function(id, loaded, total)
{
let upload = this.uploads[id];
// The progress events are fired when the data is sent,
// but that leads to wrong speed because we don't know how long
// it has really taken to process the packet
// As long as the upload progress the speed converges to a more correct value
// But here we will try to adjust it (fake it) sooner
if (!upload.firstPacket)
upload.firstPacket = Date.now();
else
if (!upload.adjusted)
{
upload.adjusted = true;
// let elapsed = Date.now() - upload.firstPacket; // time to send a packet to the server and get back
let elapsed = Date.now() - upload.startTime; //
upload.startTime = upload.startTime - elapsed;
}
upload.currBytes = loaded;
upload.maxBytes = total;
this._listeners.forEach( function( listener ) {
listener.progressUpdate( upload );
});
},
finishedUpload: function(id)
{
let upload = this.uploads[id];
delete this.uploads[id];
// Review if there are pending files to cancel the show timer
let count = 0;
for(let id in this.uploads)
count++;
if (count == 0)
cancelShowTimer();
// Notify the listeners
this._listeners.forEach( function( listener ) {
listener.fileFinished( upload );
});
},
cancelUpload: function(id)
{
let upload = this.uploads[id];
upload.req.abort();
},
// For use while debugging
toConsole: function(text)
{
var aConsoleService = Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService);
aConsoleService.logStringMessage( text );
},
// Check if we might need to show the window.
// Either some folder is being compressed,
// or there's some file that might take longer than 2 seconds.
// If there's some file that we still don't know the speed
// then consider it also as needed.
isWindowNeeded: function()
{
for (let id in this.uploads)
{
let upload = this.uploads[id] ;
// zipping folder: if takes so long to compress it, it will also take some time to upload it
if (upload.state==1)
return true;
// If it still hasn't uploaded anything then something might be wrong
if (upload.currBytes==0)
return true;
let elapsedTime = (Date.now() - upload.startTime) / 1000;
let speed = upload.currBytes/elapsedTime;
let remainingSecs = (upload.maxBytes - upload.currBytes) / speed;
// this.toConsole(elapsedTime + " " + speed + " " + remainingSecs);
if (remainingSecs > 2)
return true;
// if (remainingSecs > 1 && elapsedTime> 2)
// return true;
}
}
}
/**
* Internal function
* Instead of poping up the uploads window inmediately wait a little
* trying to avoid flicker for small files
*/
let showTimer = null;
// we need a nsITimerCallback compatible...
// ... interface for the callbacks.
var showTimerEvent =
{
notify: function(timer)
{
if (sendtophoneUploadsManager.isWindowNeeded())
{
cancelShowTimer();
sendtophoneUploadsManager.showWindow();
}
}
}
function initShowTest()
{
if (showTimer)
return;
// Now it is time to create the timer...
showTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
showTimer.initWithCallback(showTimerEvent, 400, Ci.nsITimer.TYPE_REPEATING_SLACK);
}
function cancelShowTimer()
{
if (!showTimer)
return;
showTimer.cancel();
showTimer = null
}
// https://developer.mozilla.org/en/Code_snippets/Tabbed_browser#Reusing_tabs
function openAndReuseOneTabPerURL(url) {
var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator);
var browserEnumerator = wm.getEnumerator("navigator:browser");
// Check each browser instance for our URL
var found = false;
while (!found && browserEnumerator.hasMoreElements()) {
var browserWin = browserEnumerator.getNext();
var tabbrowser = browserWin.gBrowser;
// Check each tab of this browser instance
var numTabs = tabbrowser.browsers.length;
for (var index = 0; index < numTabs; index++) {
var currentBrowser = tabbrowser.getBrowserAtIndex(index);
if (url == currentBrowser.currentURI.spec) {
// The URL is already opened. Select this tab.
tabbrowser.selectedTab = tabbrowser.tabContainer.childNodes[index];
// Focus *this* browser-window
browserWin.focus();
found = true;
break;
}
}
}
// Our URL isn't open. Open it now.
if (!found) {
var recentWindow = wm.getMostRecentWindow("navigator:browser");
if (recentWindow) {
// Use an existing browser window
recentWindow.delayedOpenTab(url, null, null, null, null);
}
else {
// No browser windows are open, so open a new one.
window.open(url);
}
}
}

View File

@@ -1,28 +0,0 @@
Browser to Phone for Opera 11+
-----------------------------------
The Opera to Phone extension is available from the following URL:
https://addons.opera.com/addons/extensions/details/opera-to-phone
* Details *
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.
* Features *
- Click the Opera to Phone button to open the current page on your Android browser.
- Click the Opera to Phone button on Google Maps to launch the Android Google Maps App.
- Click the Opera to Phone button on YouTube to launch the Android YouTube app.
- Select a phone number on the current web page and click the Opera to Phone button to launch the Android Dialer.
- Select some text on the current web page and click the Opera to Phone button to copy the selected text to the Android clipboard (long-press on text boxes to get the paste option in Android).
* Further information *
If you have any feedback on this extension please feel free to drop me an email:
richDOTtibREMOVEbettATgmailDOTcom

View File

@@ -1,22 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<widget xmlns="http://www.w3.org/ns/widgets" id="https://addons.opera.com/addons/extensions/details/opera-to-phone/" version="1.3.4">
<name>Opera to Phone</name>
<access origin="https://chrometophone.appspot.com"/>
<icon src="icon_64x64.png"/>
<license>Copyright 2010 Rich Tibbett
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.</license>
<author href="http://my.opera.com/richtr/blog/2010/12/13/opera-to-phone-extension-support-page">Rich Tibbett</author>
<update-description href="https://extension-updates.opera.com/api/w3c-wd1/update/f128c3fa-3357-4e76-8b14-5561a568337c/"/>
<description xml:lang="en">Seamlessly push links, maps, youtube videos, phone numbers and text to copy to the clipboard directly to your Android device.</description>
</widget>

View File

@@ -1,30 +0,0 @@
/*
* 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&ver=' + apiVersion;
var signOutUrl = baseUrl + '/signout?extret=' +
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?logout&ver=' + apiVersion;
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_CAPTURE_SELECTION = 'capture_selection';
var ACTION_OPEN_TAB = 'open_tab';
var ACTION_CLOSE_TAB = 'close_tab';
var STATUS_SUCCESS = 'success';
var STATUS_LOGIN_REQUIRED = 'login_required';
var STATUS_DEVICE_NOT_REGISTERED = 'device_not_registered';
var STATUS_NO_TAB_ACCESS = 'no_tab_access';
var STATUS_GENERAL_ERROR = 'general_error';
var BROWSER_CHANNEL_RETRY_INTERVAL_MS = 10000 * (1 + Math.random() - 0.5);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -1,80 +0,0 @@
// ==UserScript==
// @include http://*
// @include https://*
// ==/UserScript==
if ( window.location === window.parent.location) {
var ACTION_CAPTURE_SELECTION = 'capture_selection';
var ACTION_SEND_PAGE = 'send_to_phone';
var ACTION_CLOSE_TAB = 'close_tab';
var currentUrl = document.location.href;
opera.extension.addEventListener( 'message', function( message ) {
if( message.data.action === ACTION_CAPTURE_SELECTION ) {
var pageInfo = {
action: ACTION_SEND_PAGE,
data: {
link: currentUrl,
title: document.title,
selection: window.getSelection() ? window.getSelection().toString() : null
}
};
// URL overrides
if ( currentUrl.match( /^http[s]?:\/\/maps\.google\./i ) ||
currentUrl.match( /^http[s]?:\/\/www\.google\.[a-z]{2,3}(\.[a-z]{2})\/maps/i ) ) {
var link = document.getElementById('link');
if (link && link.href)
pageInfo.data.link = link.href;
}
opera.extension.postMessage( pageInfo );
}
}, false);
function findAndReplace(searchText, replacement, searchNode) {
if (!searchText || typeof replacement === 'undefined') {
// Throw error here if you want...
return;
}
var regex = typeof searchText === 'string' ?
new RegExp(searchText, 'g') : searchText,
childNodes = (searchNode || document.body).childNodes,
cnLength = childNodes.length,
excludes = 'html,head,style,title,link,meta,script,object,iframe';
while (cnLength--) {
var currentNode = childNodes[cnLength];
if (currentNode.nodeType === 1 &&
(excludes + ',').indexOf(currentNode.nodeName.toLowerCase() + ',') === -1) {
arguments.callee(searchText, replacement, currentNode);
}
if (currentNode.nodeType !== 3 || !regex.test(currentNode.data) ) {
continue;
}
var parent = currentNode.parentNode,
frag = (function(){
var html = currentNode.data.replace(regex, replacement),
wrap = document.createElement('div'),
frag = document.createDocumentFragment();
wrap.innerHTML = html;
while (wrap.firstChild) {
frag.appendChild(wrap.firstChild);
}
return frag;
})();
parent.insertBefore(frag, currentNode);
parent.removeChild(currentNode);
}
}
window.addEventListener( 'DOMContentLoaded', function() {
if( currentUrl.match( /^http[s]?:\/\/www\.google\.com\/accounts\/ServiceLogin\?(.*)?ahname=Chrome\+to\+Phone(.*)?$/i ) ) {
// Opera log in message so users know what they are logging in to.
findAndReplace('Chrome', 'Opera', document.body);
} else if (currentUrl.match( /^http:\/\/code\.google\.com\/p\/chrometophone\/logo(.*)?$/i )) {
opera.extension.postMessage({
action: ACTION_CLOSE_TAB
});
}
}, false);
}

View File

@@ -1,103 +0,0 @@
<!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: true,
title: "Opera to Phone",
icon: "icon_18x18.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 timoutTimer = null;
function onMessage( message ) {
var currentTab = opera.extension.tabs.getFocused();
switch( message.data.action ) {
case ACTION_START_SEND:
if( currentTab ) {
var captureSelection = {
action: ACTION_CAPTURE_SELECTION
};
currentTab.postMessage(captureSelection);
}
timeoutTimer = window.setTimeout( function() {
message.data.action = ACTION_SEND_PAGE;
onMessage( message );
}, 1000);
break;
case ACTION_SEND_PAGE:
window.clearTimeout( timeoutTimer ); // Cancel timeout error timer
var pageData = message.data.data || {};
if( currentTab ) {
var data = {
title: pageData.title || currentTab.title,
url: pageData.link || currentTab.url,
sel: pageData.selection || null,
type: pageData.selection ? 'selection' : 'page'
};
sendToPhone( data, function( status ) {
// Display sendToPhone result in Popup
opera.extension.broadcastMessage({
action: status
});
} );
} else {
opera.extension.broadcastMessage({
action: STATUS_NO_TAB_ACCESS
});
}
break;
case ACTION_OPEN_TAB:
if(message.data.data && message.data.data.url) {
var tabData = {
url: message.data.data.url,
focused: true
};
opera.extension.tabs.create( tabData );
}
break;
case ACTION_CLOSE_TAB:
if( currentTab )
currentTab.close();
break;
}
}
opera.extension.addEventListener( 'message' , onMessage, false );
function enableButton() {
var tab = opera.extension.tabs.getFocused();
if (tab) {
operaBtn.disabled = false;
}
else {
operaBtn.disabled = true;
}
}
//Enable the button when a tab is ready.
opera.extension.addEventListener( 'connect', function() {
enableButton();
}, false );
opera.extension.tabs.addEventListener( 'focus', function() {
enableButton();
}, false );
opera.extension.tabs.addEventListener( 'blur', function() {
enableButton();
}, false );
</script>
</head>
<body>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -1,105 +0,0 @@
<html>
<head>
<style type="text/css">
body {
padding: 0px;
margin: 1px;
min-width: 320px;
overflow: hidden;
}
a, a:visited, a:active {
color: blue;
}
td {
font-family: Verdana, Arial;
font-size: 12px;
color: black;
}
</style>
<script type="text/javascript" src="constants.js"></script>
<script>
function loadHandler() {
var msg = document.getElementById('msg'),
helpLink = document.getElementById('help'),
signOutLink = document.getElementById('signout');
helpLink.addEventListener( 'click', function() {
opera.extension.postMessage({
action: ACTION_OPEN_TAB,
data: {
url: '/o2p_help.html?' + Math.floor(Math.random()*1e10) // to prevent caching issue
}
});
}, false );
signOutLink.href = signOutUrl;
// Callback from the background process
opera.extension.addEventListener( 'message', function( message ) {
var msgRcvd = false;
switch(message.data.action) {
case STATUS_SUCCESS:
msg.innerHTML = "Sent to phone."
setSignoutVisibility(true);
msgRcvd = true;
break;
case STATUS_LOGIN_REQUIRED:
var signinLink = '<a href="' + signInUrl + '" target="_o2pTab_ext">sign in</a>';
msg.innerHTML = "Please " + signinLink + " to Opera to Phone.";
setSignoutVisibility(false);
msgRcvd = true;
break;
case STATUS_DEVICE_NOT_REGISTERED:
opera.extension.postMessage({
action: ACTION_OPEN_URL,
data: {
url: apkUrl
}
});
msg.innerHTML = "Device not registered for user.";
setSignoutVisibility(true);
msgRcvd = true;
break;
case STATUS_NO_TAB_ACCESS:
msg.innerHTML = "Cannot access the current tab.";
msgRcvd = true;
break;
case STATUS_GENERAL_ERROR:
msg.innerHTML = "Error sending to phone: " + message.data.action;
setSignoutVisibility(false);
msgRcvd = true;
break;
}
if(msgRcvd) {
window.setTimeout(function() {
window.close();
}, 3000);
}
}, false);
function setSignoutVisibility(visible) {
signOutLink.style.visibility = visible ? 'visible' : 'hidden';
signOutLink.style.color = visible ? 'blue' : 'gray';
document.getElementById('sep').style.visibility = visible ? 'visible' : 'hidden';
}
opera.extension.postMessage({
action: ACTION_START_SEND
});
}
window.addEventListener("load", loadHandler, false);
</script>
</head>
<body>
<table>
<tr>
<td valign="top" width="48px"><img src="/icon_64x64.png" width="48px" height="48px" style="margin-right: 4px;"/></td>
<td valign="middle">
<b><div id="msg">Sending to phone...</div></b>
<p><a id="help" href="#">Help</a> <span id="sep" style="visibility:hidden;">|</span>
<a id="signout" href="#" target="_o2ptab_ext" style="color: gray; visibility: hidden;">Sign out</a></p>
</td>
</tr>
</table>
</body>
</html>

View File

@@ -1,41 +0,0 @@
/*
* 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( data, 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);
}
}
};
var postData = '';
for(var key in data) {
if(postData.length > 1)
postData += '&';
if( data[key] !== null )
postData += key + '=' + encodeURIComponent( data[key] );
}
req.send(postData);
}