NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Baidu & Google Button
// @description Fast Switch Baidu & Google Search Engine
// @author waisir
// @include http://www.baidu.com/s*
// @include http://www.baidu.com/baidu*
// @include https://www.google.com.hk/search*
// @include http://www.google.com.hk/search*
// @include https://www.google.com/search*
// @include http://www.google.com/search*
// @include http://www.google.com/webhp*
// @include https://www.google.com/webhp*
// @include http://www.google.com.hk/webhp*
// @include https://www.google.com.hk/webhp*
// @version 1.4
// @grant none
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// ==/UserScript==
;
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD available; use anonymous module
if (typeof jQuery !== 'undefined') {
define(['jquery'], factory);
} else {
define([], factory);
}
} else {
// No AMD available; mutate global vars
if (typeof jQuery !== 'undefined') {
factory(jQuery);
} else {
factory();
}
}
}) (function ($, undefined) {
var tag2attr = {
a: 'href',
img: 'src',
form: 'action',
base: 'href',
script: 'src',
iframe: 'src',
link: 'href'
},
key = [
'source',
'protocol',
'authority',
'userInfo',
'user',
'password',
'host',
'port',
'relative',
'path',
'directory',
'file',
'query',
'fragment'
],
// keys available to query
aliases = {
'anchor': 'fragment'
},
// aliases for backwards compatability
parser = {
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
//less intuitive, more accurate to the specs
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
// more intuitive, fails on relative paths and deviates from specs
},
toString = Object.prototype.toString,
isint = /^[0-9]+$/;
function parseUri(url, strictMode) {
var str = decodeURI(url),
res = parser[strictMode || false ? 'strict' : 'loose'].exec(str),
uri = {
attr: {
},
param: {
},
seg: {
}
},
i = 14;
while (i--) {
uri.attr[key[i]] = res[i] || '';
}
// build query and fragment parameters
uri.param['query'] = parseString(uri.attr['query']);
uri.param['fragment'] = parseString(uri.attr['fragment']);
// split path and fragement into segments
uri.seg['path'] = uri.attr.path.replace(/^\/+|\/+$/g, '') .split('/');
uri.seg['fragment'] = uri.attr.fragment.replace(/^\/+|\/+$/g, '') .split('/');
// compile a 'base' domain attribute
uri.attr['base'] = uri.attr.host ? (uri.attr.protocol ? uri.attr.protocol + '://' + uri.attr.host : uri.attr.host) + (uri.attr.port ? ':' + uri.attr.port : '') : '';
return uri;
};
function getAttrName(elm) {
var tn = elm.tagName;
if (typeof tn !== 'undefined') return tag2attr[tn.toLowerCase()];
return tn;
}
function promote(parent, key) {
if (parent[key].length == 0) return parent[key] = {
};
var t = {
};
for (var i in parent[key]) t[i] = parent[key][i];
parent[key] = t;
return t;
}
function parse(parts, parent, key, val) {
var part = parts.shift();
if (!part) {
if (isArray(parent[key])) {
parent[key].push(val);
} else if ('object' == typeof parent[key]) {
parent[key] = val;
} else if ('undefined' == typeof parent[key]) {
parent[key] = val;
} else {
parent[key] = [
parent[key],
val
];
}
} else {
var obj = parent[key] = parent[key] || [];
if (']' == part) {
if (isArray(obj)) {
if ('' != val) obj.push(val);
} else if ('object' == typeof obj) {
obj[keys(obj) .length] = val;
} else {
obj = parent[key] = [
parent[key],
val
];
}
} else if (~part.indexOf(']')) {
part = part.substr(0, part.length - 1);
if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
parse(parts, obj, part, val);
// key
} else {
if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
parse(parts, obj, part, val);
}
}
}
function merge(parent, key, val) {
if (~key.indexOf(']')) {
var parts = key.split('['),
len = parts.length,
last = len - 1;
parse(parts, parent, 'base', val);
} else {
if (!isint.test(key) && isArray(parent.base)) {
var t = {
};
for (var k in parent.base) t[k] = parent.base[k];
parent.base = t;
}
set(parent.base, key, val);
}
return parent;
}
function parseString(str) {
return reduce(String(str) .split(/&|;/), function (ret, pair) {
try {
pair = decodeURIComponent(pair.replace(/\+/g, ' '));
} catch (e) {
// ignore
}
var eql = pair.indexOf('='),
brace = lastBraceInKey(pair),
key = pair.substr(0, brace || eql),
val = pair.substr(brace || eql, pair.length),
val = val.substr(val.indexOf('=') + 1, val.length);
if ('' == key) key = pair,
val = '';
return merge(ret, key, val);
}, {
base: {
}
}) .base;
}
function set(obj, key, val) {
var v = obj[key];
if (undefined === v) {
obj[key] = val;
} else if (isArray(v)) {
v.push(val);
} else {
obj[key] = [
v,
val
];
}
}
function lastBraceInKey(str) {
var len = str.length,
brace,
c;
for (var i = 0; i < len; ++i) {
c = str[i];
if (']' == c) brace = false;
if ('[' == c) brace = true;
if ('=' == c && !brace) return i;
}
}
function reduce(obj, accumulator) {
var i = 0,
l = obj.length >> 0,
curr = arguments[2];
while (i < l) {
if (i in obj) curr = accumulator.call(undefined, curr, obj[i], i, obj);
++i;
}
return curr;
}
function isArray(vArg) {
return Object.prototype.toString.call(vArg) === '[object Array]';
}
function keys(obj) {
var keys = [
];
for (prop in obj) {
if (obj.hasOwnProperty(prop)) keys.push(prop);
}
return keys;
}
function purl(url, strictMode) {
if (arguments.length === 1 && url === true) {
strictMode = true;
url = undefined;
}
strictMode = strictMode || false;
url = url || window.location.toString();
return {
data: parseUri(url, strictMode),
// get various attributes from the URI
attr: function (attr) {
attr = aliases[attr] || attr;
return typeof attr !== 'undefined' ? this.data.attr[attr] : this.data.attr;
},
// return query string parameters
param: function (param) {
return typeof param !== 'undefined' ? this.data.param.query[param] : this.data.param.query;
},
// return fragment parameters
fparam: function (param) {
return typeof param !== 'undefined' ? this.data.param.fragment[param] : this.data.param.fragment;
},
// return path segments
segment: function (seg) {
if (typeof seg === 'undefined') {
return this.data.seg.path;
} else {
seg = seg < 0 ? this.data.seg.path.length + seg : seg - 1;
// negative segments count from the end
return this.data.seg.path[seg];
}
},
// return fragment segments
fsegment: function (seg) {
if (typeof seg === 'undefined') {
return this.data.seg.fragment;
} else {
seg = seg < 0 ? this.data.seg.fragment.length + seg : seg - 1;
// negative segments count from the end
return this.data.seg.fragment[seg];
}
}
};
};
if (typeof $ !== 'undefined') {
$.fn.url = function (strictMode) {
var url = '';
if (this.length) {
url = $(this) .attr(getAttrName(this[0])) || '';
}
return purl(url, strictMode);
};
$.url = purl;
} else {
window.purl = purl;
}
});
$(document) .ready(function () {
var ggprefix = 'https://www.google.com.hk/search?q=',
bdprefix = 'http://www.baidu.com/s?wd=';
$('.s_btn_wr') .after('<div class="s_btn_wr bg" style="display:inline-block"><input type="button" id="ggyx" value="Google" class="bg s_btn" ></div>');
$('#ggyx') .on({
click: function () {
location.href = ggprefix + $('#kw') .val();
}
});
var url = new $.url();
function attachBaiduBtn() {
$('#sblsbb') .after('<div id="sblsbb_bd" class="lsbb kpbb" style="position: relative; left: 80px;top:-31px;height:27px"><button id="bdyx" class="lsb" style="background: none repeat scroll 0 0 rgba(0, 0, 0, 0);color: white;font-size: 13px;overflow: hidden;position: relative;width: 100%;cursor:pointer">百度/button></div>');
$('#bdyx') .off('click') .on({
click: function () {
// var kwg = url.param('q');
var kwg = kwg = $('#lst-ib') .val();
location.href = bdprefix + kwg;
return false;
}
});
}
$('.lsb') .on({
click: function () {
setTimeout(attachBaiduBtn, 2000);
}
});
attachBaiduBtn();
});