1/*********************************************** 2 needShareButton 3 - Version 1.0.0 4 - Copyright 2015 Dzmitry Vasileuski 5 - Licensed under MIT (http://opensource.org/licenses/MIT) 6***********************************************/ 7 8(function () { 9 10 // find closest 11 function closest(elem, parent) { 12 if (typeof (parent) == "string") { 13 var matchesSelector = elem.matches || elem.webkitMatchesSelector || 14 elem.mozMatchesSelector || elem.msMatchesSelector; 15 16 if (!!matchesSelector) { 17 while (elem) { 18 if (matchesSelector.bind(elem)(parent)) { 19 return elem; 20 } else { 21 elem = elem.parentElement; 22 } 23 } 24 } 25 return false; 26 } else { 27 while (elem) { 28 if (elem == parent) { 29 return elem; 30 } else { 31 elem = elem.parentElement; 32 } 33 } 34 return false; 35 } 36 } 37 38 // share button class 39 window.needShareButton = function (elem, options) { 40 // create element reference 41 var root = this; 42 root.elem = elem || "need-share-button"; 43 44 /* Helpers 45 ***********************************************/ 46 47 // get title from html 48 root.getTitle = function () { 49 var content; 50 // check querySelector existance for old browsers 51 if (document.querySelector) { 52 content = document.querySelector("title"); 53 if (content) { 54 return content.innerText; 55 } 56 } 57 return document.title; 58 }; 59 60 // get image from html 61 root.getImage = function () { 62 var content; 63 // check querySelector existance for old browsers 64 if (document.querySelector) { 65 content = document.querySelector("meta[property=\"og:image\"]") || 66 document.querySelector("meta[name=\"twitter:image\"]"); 67 if (content) { 68 return content.getAttribute("content"); 69 } else { 70 return ""; 71 } 72 } else { 73 return ""; 74 } 75 }; 76 77 // get description from html 78 root.getDescription = function () { 79 var content; 80 // check querySelector existance for old browsers 81 if (document.querySelector) { 82 content = document.querySelector("meta[property=\"og:description\"]") || 83 document.querySelector("meta[name=\"twitter:description\"]") || 84 document.querySelector("meta[name=\"description\"]"); 85 if (content) { 86 return content.getAttribute("content"); 87 } else { 88 return ""; 89 } 90 } else { 91 content = document.getElementsByTagName("meta").namedItem("description"); 92 if (content) { 93 return content.getAttribute("content"); 94 } else { 95 return ""; 96 } 97 } 98 }; 99 100 // share urls for all networks 101 root.share = { 102 "weibo": function (el) { 103 var myoptions = getOptions(el); 104 var url = "http://v.t.sina.com.cn/share/share.php?title=" + 105 encodeURIComponent(myoptions.title) + 106 "&url=" + encodeURIComponent(myoptions.url) + 107 "&pic=" + encodeURIComponent(myoptions.image); 108 root.popup(url); 109 }, 110 "wechat": function (el) { 111 var myoptions = getOptions(el); 112 var imgSrc = "https://pan.baidu.com/share/qrcode?w=400&h=400&url=" + encodeURIComponent(myoptions.url); 113 var dropdownEl = el.querySelector(".need-share-button_dropdown"); 114 var img = dropdownEl.getElementsByClassName("need-share-wechat-code-image")[0]; 115 if (img) { 116 img.remove(); 117 } else { 118 img = document.createElement("img"); 119 img.src = imgSrc; 120 img.alt = "loading wechat image..."; 121 img.setAttribute("class", "need-share-wechat-code-image"); 122 123 if (root.options.position == 'middleRight') { 124 dropdownEl.insertBefore(img, dropdownEl.children[0]); 125 } 126 else { 127 dropdownEl.appendChild(img); 128 } 129 } 130 }, 131 "douban": function (el) { 132 var myoptions = getOptions(el); 133 var url = "https://www.douban.com/share/service?name=" +
134 encodeURIComponent(myoptions.title) + 135 "&href=" + encodeURIComponent(myoptions.url) + 136 "&image=" + encodeURIComponent(myoptions.image); 137 root.popup(url); 138 }, 139 "qqzone": function (el) { 140 var myoptions = getOptions(el); 141 var url = "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?title=" + 142 encodeURIComponent(myoptions.title) + 143 "&url=" + encodeURIComponent(myoptions.url) + 144 "&pics=" + encodeURIComponent(myoptions.image) + 145 "&desc=" + encodeURIComponent(myoptions.description); 146 root.popup(url); 147 }, 148 "renren": function (el) { 149 var myoptions = getOptions(el); 150 var url = "http://widget.renren.com/dialog/share?title=" + 151 encodeURIComponent(myoptions.title) + 152 "&resourceUrl=" + encodeURIComponent(myoptions.url) + 153 "&pic=" + encodeURIComponent(myoptions.image) + 154 "&description=" + encodeURIComponent(myoptions.description); 155 root.popup(url); 156 }, 157 "mailto": function (el) { 158 var myoptions = getOptions(el); 159 var url = "mailto:?subject=" + encodeURIComponent(myoptions.title) + 160 "&body=Thought you might enjoy reading this: " + encodeURIComponent(myoptions.url) + 161 " - " + encodeURIComponent(myoptions.description); 162 163 window.location.href = url; 164 }, 165 "twitter": function (el) { 166 var myoptions = getOptions(el); 167 var url = myoptions.protocol + "twitter.com/intent/tweet?text="; 168 url += encodeURIComponent(myoptions.title) + "&url=" + encodeURIComponent(myoptions.url); 169 170 root.popup(url); 171 }, 172 "pinterest": function (el) { 173 var myoptions = getOptions(el); 174 var url = myoptions.protocol + "pinterest.com/pin/create/bookmarklet/?is_video=false"; 175 url += "&media=" + encodeURIComponent(myoptions.image); 176 url += "&url=" + encodeURIComponent(myoptions.url); 177 url += "&description=" + encodeURIComponent(myoptions.title); 178 179 root.popup(url); 180 }, 181 "facebook": function (el) { 182 var myoptions = getOptions(el); 183 var url = myoptions.protocol + "www.facebook.com/share.php?"; 184 url += "u=" + encodeURIComponent(myoptions.url); 185 url += "&title=" + encodeURIComponent(myoptions.title); 186 187 root.popup(url); 188 }, 189 "googleplus": function (el) { 190 var myoptions = getOptions(el); 191 var url = myoptions.protocol + "plus.google.com/share?"; 192 url += "url=" + encodeURIComponent(myoptions.url); 193 194 root.popup(url); 195 }, 196 "reddit": function (el) { 197 var myoptions = getOptions(el); 198 var url = myoptions.protocol + "www.reddit.com/submit?"; 199 url += "url=" + encodeURIComponent(myoptions.url); 200 url += "&title=" + encodeURIComponent(myoptions.title); 201 202 root.popup(url); 203 }, 204 "delicious": function (el) { 205 var myoptions = getOptions(el); 206 var url = myoptions.protocol + "del.icio.us/post?"; 207 url += "url=" + encodeURIComponent(myoptions.url); 208 url += "&title=" + encodeURIComponent(myoptions.title); 209 url += "¬es=" + encodeURIComponent(myoptions.description); 210 211 root.popup(url); 212 }, 213 "stumbleupon": function (el) { 214 var myoptions = getOptions(el); 215 var url = myoptions.protocol + "www.stumbleupon.com/submit?"; 216 url += "url=" + encodeURIComponent(myoptions.url); 217 url += "&title=" + encodeURIComponent(myoptions.title); 218 219 root.popup(url); 220 }, 221 "linkedin": function (el) { 222 var myoptions = getOptions(el); 223 var url = myoptions.protocol + "www.linkedin.com/shareArticle?mini=true"; 224 url += "&url=" + encodeURIComponent(myoptions.url); 225 url += "&title=" + encodeURIComponent(myoptions.title); 226 url += "&source=" + encodeURIComponent(myoptions.source); 227 228 root.popup(url); 229 }, 230 "slashdot": function (el) { 231 var myoptions = getOptions(el); 232 var url = myoptions.protocol + "slashdot.org/bookmark.pl?";
233 url += "url=" + encodeURIComponent(myoptions.url); 234 url += "&title=" + encodeURIComponent(myoptions.title); 235 236 root.popup(url); 237 }, 238 "technorati": function (el) { 239 var myoptions = getOptions(el); 240 var url = myoptions.protocol + "technorati.com/faves?"; 241 url += "add=" + encodeURIComponent(myoptions.url); 242 url += "&title=" + encodeURIComponent(myoptions.title); 243 244 root.popup(url); 245 }, 246 "posterous": function (el) { 247 var myoptions = getOptions(el); 248 var url = myoptions.protocol + "posterous.com/share?"; 249 url += "linkto=" + encodeURIComponent(myoptions.url); 250 251 root.popup(url); 252 }, 253 "tumblr": function (el) { 254 var myoptions = getOptions(el); 255 var url = myoptions.protocol + "www.tumblr.com/share?v=3"; 256 url += "&u=" + encodeURIComponent(myoptions.url); 257 url += "&t=" + encodeURIComponent(myoptions.title); 258 259 root.popup(url); 260 }, 261 "googlebookmarks": function (el) { 262 var myoptions = getOptions(el); 263 var url = myoptions.protocol + "www.google.com/bookmarks/mark?op=edit"; 264 url += "&bkmk=" + encodeURIComponent(myoptions.url); 265 url += "&title=" + encodeURIComponent(myoptions.title); 266 url += "&annotation=" + encodeURIComponent(myoptions.description); 267 268 root.popup(url); 269 }, 270 "newsvine": function (el) { 271 var myoptions = getOptions(el); 272 var url = myoptions.protocol + "www.newsvine.com/_tools/seed&save?"; 273 url += "u=" + encodeURIComponent(myoptions.url); 274 url += "&h=" + encodeURIComponent(myoptions.title); 275 276 root.popup(url); 277 }, 278 "evernote": function (el) { 279 var myoptions = getOptions(el); 280 var url = myoptions.protocol + "www.evernote.com/clip.action?"; 281 url += "url=" + encodeURIComponent(myoptions.url); 282 url += "&title=" + encodeURIComponent(myoptions.title); 283 284 root.popup(url); 285 }, 286 "friendfeed": function (el) { 287 var myoptions = getOptions(el); 288 var url = myoptions.protocol + "www.friendfeed.com/share?"; 289 url += "url=" + encodeURIComponent(myoptions.url); 290 url += "&title=" + encodeURIComponent(myoptions.title); 291 292 root.popup(url); 293 }, 294 "vkontakte": function (el) { 295 var myoptions = getOptions(el); 296 var url = myoptions.protocol + "vkontakte.ru/share.php?"; 297 url += "url=" + encodeURIComponent(myoptions.url); 298 url += "&title=" + encodeURIComponent(myoptions.title); 299 url += "&description=" + encodeURIComponent(myoptions.description); 300 url += "&image=" + encodeURIComponent(myoptions.image); 301 url += "&noparse=true"; 302 303 root.popup(url); 304 }, 305 "odnoklassniki": function (el) { 306 var myoptions = getOptions(el); 307 var url = myoptions.protocol + "www.odnoklassniki.ru/dk?st.cmd=addShare&st.s=1"; 308 url += "&st.comments=" + encodeURIComponent(myoptions.description); 309 url += "&st._surl=" + encodeURIComponent(myoptions.url); 310 311 root.popup(url); 312 }, 313 "mailru": function (el) { 314 var myoptions = getOptions(el); 315 var url = myoptions.protocol + "connect.mail.ru/share?"; 316 url += "url=" + encodeURIComponent(myoptions.url); 317 url += "&title=" + encodeURIComponent(myoptions.title); 318 url += "&description=" + encodeURIComponent(myoptions.description); 319 url += "&imageurl=" + encodeURIComponent(myoptions.image); 320 321 root.popup(url); 322 } 323 324 }; 325 326 // open share link in a popup 327 root.popup = function (url) { 328 // set left and top position 329 var popupWidth = 600, 330 popupHeight = 500, 331 // fix dual screen mode 332 dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left, 333 dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top, 334 width = window.innerWidth ? 335 window.innerWidth : 336 document.documentElement.clientWidth ? 337 document.documentElement.clientWidth : 338 screen.width, 339 height = window.innerHeight ? 340 window.innerHeight : 341 document.documentElement.clientHeight ? 342 document.documentElement.clientHeight : 343 screen.height, 344 // calculate top and left position 345 left = ((width / 2) - (popupWidth / 2)) + dualScreenLeft, 346 top = ((height / 2) - (popupHeight / 2)) + dualScreenTop, 347 348 // show popup 349 shareWindow = window.open(url, "targetWindow", 350 "toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width="
350+ popupWidth + 351 ", height=" + popupHeight + ", top=" + top + ", left=" + left); 352 353 // Puts focus on the newWindow 354 if (window.focus) { 355 shareWindow.focus(); 356 } 357 }; 358 359 /* Set options 360 ***********************************************/ 361 362 // create default options 363 root.options = { 364 iconStyle: "default", // default or box 365 boxForm: "horizontal", // horizontal or vertical 366 position: "bottomCenter", // top / middle / bottom + Left / Center / Right 367 protocol: ["http", "https"].indexOf(window.location.href.split(":")[0]) === -1 ? "https://" : "//", 368 networks: "Weibo,Wechat,Douban,QQZone,Twitter,Pinterest,Facebook,GooglePlus,Reddit,Linkedin,Tumblr,Evernote" 369 }; 370 371 // integrate custom options 372 for (var i in options) { 373 if (options.hasOwnProperty(i)) { 374 root.options[i] = options[i]; 375 } 376 } 377 // convert networks string into array 378 //root.options.networks = root.options.networks.toLowerCase().split(","); 379 root.options.networks = root.options.networks.split(","); 380 381 function getOptions(el) { 382 // integrate data attribute options 383 var ret = {}; 384 for (var i in root.options) { 385 if (root.options.hasOwnProperty(i)) { 386 ret[i] = root.options[i]; 387 } 388 } 389 390 // these attrs must get dynamically. 391 ret.url = window.location.href; 392 ret.title = root.getTitle(); 393 ret.image = root.getImage(); 394 ret.description = root.getDescription(); 395 396 for (var option in el.dataset) { 397 // replace only 'share-' prefixed data-attributes 398 if (option.match(/share/)) { 399 var newOption = option.replace(/share/, ""); 400 if (!newOption.length) { 401 continue; 402 } 403 newOption = newOption.charAt(0).toLowerCase() + newOption.slice(1); 404 var val = el.dataset[option]; 405 if (newOption === "networks") { 406 //val = val.toLowerCase().split(","); 407 val = val.split(","); 408 } else if (newOption === "url" && val && val[0] === "/") { 409 // fix relative url problem. 410 val = location.origin + val; 411 } 412 ret[newOption] = val; 413 } 414 } 415 return ret; 416 } 417 418 function createDropdown(el) { 419 // create dropdown 420 var dropdownEl = document.createElement("span"); 421 dropdownEl.className = "need-share-button_dropdown"; 422 if (el.querySelector(".need-share-button_dropdown")) { 423 return; 424 } 425 var myoptions = getOptions(el); 426 427 // set dropdown row length 428 if (myoptions.iconStyle == "default" && myoptions.boxForm == "vertical") { 429 dropdownEl.className += " need-share-button_dropdown-box-vertical"; 430 } else if (myoptions.iconStyle == "box" && myoptions.boxForm == "horizontal") { 431 dropdownEl.className += " need-share-button_dropdown-box-horizontal"; 432 } else if (myoptions.iconStyle == "box" && myoptions.boxForm == "vertical") { 433 dropdownEl.className += " need-share-button_dropdown-box-vertical"; 434 } 435 436 // set dropdown position 437 setTimeout(function () { 438 switch (myoptions.position) { 439 case "topLeft": 440 dropdownEl.className += " need-share-button_dropdown-top-left"; 441 break; 442 case "topRight": 443 dropdownEl.className += " need-share-button_dropdown-top-right"; 444 break; 445 case "topCenter": 446 dropdownEl.className += " need-share-button_dropdown-top-center"; 447 dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px"; 448 break; 449 case "middleLeft": 450 dropdownEl.className += " need-share-button_dropdown-middle-left"; 451 dropdownEl.style.marginTop = -dropdownEl.offsetHeight / 2 + "px"; 452 break; 453 case "middleRight": 454 dropdownEl.className += " need-share-button_dropdown-middle-right"; 455 dropdownEl.style.marginTop = -dropdownEl.offsetHeight / 2 + "px"; 456 break; 457 case "bottomLeft": 458 dropdownEl.className += " need-share-button_dropdown-bottom-left"; 459 break; 460 case "bottomRight": 461 dropdownEl.className += " need-share-button_dropdown-bottom-right"; 462 break; 463 case "bottomCenter": 464 dropdownEl.className += " need-share-button_dropdown-bottom-center"; 465 dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px"; 466 break; 467 default: 468 dropdownEl.className += " need-share-button_dropdown-bottom-center"; 469 dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px"; 470 break; 471 } 472 }, 1); 473 474
475 // fill fropdown with buttons 476 var iconClass = myoptions.iconStyle == "default" ? 477 "need-share-button_link need-share-button_" : 478 "need-share-button_link-" + myoptions.iconStyle + " need-share-button_link need-share-button_"; 479 for (var network in myoptions.networks) { 480 if (myoptions.networks.hasOwnProperty(network)) { 481 var link = document.createElement("span"); 482 network = myoptions.networks[network].trim(); 483 var networkLC = network.toLowerCase(); 484 link.className = iconClass + networkLC; 485 var fontello = ["weibo", "wechat", "douban", "qqzone", "renren"]; 486 if (fontello.indexOf(networkLC) === -1) { 487 link.className += " social-" + networkLC; 488 } else { 489 link.className += " icon-" + networkLC; 490 } 491 link.dataset.network = networkLC; 492 link.title = network; 493 dropdownEl.appendChild(link); 494 } 495 } 496 497 dropdownEl.addEventListener("click", function (event) { 498 if (closest(event.target, ".need-share-button_link")) { 499 event.preventDefault(); 500 event.stopPropagation(); 501 502 root.share[event.target.dataset.network](el); 503 return false; 504 } 505 }); 506 507 el.appendChild(dropdownEl); 508 } 509 510 // close on click outside 511 document.addEventListener("click", function (event) { 512 var openedEl = document.querySelector(".need-share-button-opened"); 513 if (!closest(event.target, ".need-share-button-opened")) { 514 if (openedEl) { 515 openedEl.classList.remove("need-share-button-opened"); 516 517 // hide wechat code image when close the dropdown. 518 if (openedEl.querySelector(".need-share-wechat-code-image")) { 519 openedEl.querySelector(".need-share-wechat-code-image").remove(); 520 } 521 } else { 522 var el = closest(event.target, root.elem); 523 if (el) { 524 if (!el.classList.contains("need-share-button-opened")) { 525 createDropdown(el); 526 setTimeout(function () { 527 el.classList.add("need-share-button-opened"); 528 }, 1); 529 } 530 } 531 } 532 } else { 533 setTimeout(function () { 534 openedEl.classList.remove("need-share-button-opened"); 535 536 // hide wechat code image when close the dropdown. 537 if (openedEl.querySelector(".need-share-wechat-code-image")) { 538 openedEl.querySelector(".need-share-wechat-code-image").remove(); 539 } 540 }, 1); 541 } 542 }); 543 544 }; 545})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.