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://api.qinco.me/api/qr?size=400&content=" + 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 dropdownEl.appendChild(img); 123 } 124 }, 125 "douban": function (el) { 126 var myoptions = getOptions(el); 127 var url = "https://www.douban.com/share/service?name=" + 128 encodeURIComponent(myoptions.title) + 129 "&href=" + encodeURIComponent(myoptions.url) + 130 "&image=" + encodeURIComponent(myoptions.image); 131 root.popup(url); 132 }, 133 "qqzone": function (el) { 134 var myoptions = getOptions(el); 135 var url = "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?title=" +
136 encodeURIComponent(myoptions.title) + 137 "&url=" + encodeURIComponent(myoptions.url) + 138 "&pics=" + encodeURIComponent(myoptions.image) + 139 "&desc=" + encodeURIComponent(myoptions.description); 140 root.popup(url); 141 }, 142 "renren": function (el) { 143 var myoptions = getOptions(el); 144 var url = "http://widget.renren.com/dialog/share?title=" + 145 encodeURIComponent(myoptions.title) + 146 "&resourceUrl=" + encodeURIComponent(myoptions.url) + 147 "&pic=" + encodeURIComponent(myoptions.image) + 148 "&description=" + encodeURIComponent(myoptions.description); 149 root.popup(url); 150 }, 151 "mailto": function (el) { 152 var myoptions = getOptions(el); 153 var url = "mailto:?subject=" + encodeURIComponent(myoptions.title) + 154 "&body=Thought you might enjoy reading this: " + encodeURIComponent(myoptions.url) + 155 " - " + encodeURIComponent(myoptions.description); 156 157 window.location.href = url; 158 }, 159 "twitter": function (el) { 160 var myoptions = getOptions(el); 161 var url = myoptions.protocol + "twitter.com/intent/tweet?text="; 162 url += encodeURIComponent(myoptions.title) + "&url=" + encodeURIComponent(myoptions.url); 163 164 root.popup(url); 165 }, 166 "pinterest": function (el) { 167 var myoptions = getOptions(el); 168 var url = myoptions.protocol + "pinterest.com/pin/create/bookmarklet/?is_video=false"; 169 url += "&media=" + encodeURIComponent(myoptions.image); 170 url += "&url=" + encodeURIComponent(myoptions.url); 171 url += "&description=" + encodeURIComponent(myoptions.title); 172 173 root.popup(url); 174 }, 175 "facebook": function (el) { 176 var myoptions = getOptions(el); 177 var url = myoptions.protocol + "www.facebook.com/share.php?"; 178 url += "u=" + encodeURIComponent(myoptions.url); 179 url += "&title=" + encodeURIComponent(myoptions.title); 180 181 root.popup(url); 182 }, 183 "googleplus": function (el) { 184 var myoptions = getOptions(el); 185 var url = myoptions.protocol + "plus.google.com/share?"; 186 url += "url=" + encodeURIComponent(myoptions.url); 187 188 root.popup(url); 189 }, 190 "reddit": function (el) { 191 var myoptions = getOptions(el); 192 var url = myoptions.protocol + "www.reddit.com/submit?"; 193 url += "url=" + encodeURIComponent(myoptions.url); 194 url += "&title=" + encodeURIComponent(myoptions.title); 195 196 root.popup(url); 197 }, 198 "delicious": function (el) { 199 var myoptions = getOptions(el); 200 var url = myoptions.protocol + "del.icio.us/post?"; 201 url += "url=" + encodeURIComponent(myoptions.url); 202 url += "&title=" + encodeURIComponent(myoptions.title); 203 url += "¬es=" + encodeURIComponent(myoptions.description); 204 205 root.popup(url); 206 }, 207 "stumbleupon": function (el) { 208 var myoptions = getOptions(el); 209 var url = myoptions.protocol + "www.stumbleupon.com/submit?"; 210 url += "url=" + encodeURIComponent(myoptions.url); 211 url += "&title=" + encodeURIComponent(myoptions.title); 212 213 root.popup(url); 214 }, 215 "linkedin": function (el) { 216 var myoptions = getOptions(el); 217 var url = myoptions.protocol + "www.linkedin.com/shareArticle?mini=true"; 218 url += "&url=" + encodeURIComponent(myoptions.url); 219 url += "&title=" + encodeURIComponent(myoptions.title); 220 url += "&source=" + encodeURIComponent(myoptions.source); 221 222 root.popup(url); 223 }, 224 "slashdot": function (el) { 225 var myoptions = getOptions(el); 226 var url = myoptions.protocol + "slashdot.org/bookmark.pl?"; 227 url += "url=" + encodeURIComponent(myoptions.url); 228 url += "&title=" + encodeURIComponent(myoptions.title); 229 230 root.popup(url); 231 }, 232 "technorati": function (el) { 233 var myoptions = getOptions(el); 234 var url = myoptions.protocol + "technorati.com/faves?"; 235 url += "add=" + encodeURIComponent(myoptions.url);
236 url += "&title=" + encodeURIComponent(myoptions.title); 237 238 root.popup(url); 239 }, 240 "posterous": function (el) { 241 var myoptions = getOptions(el); 242 var url = myoptions.protocol + "posterous.com/share?"; 243 url += "linkto=" + encodeURIComponent(myoptions.url); 244 245 root.popup(url); 246 }, 247 "tumblr": function (el) { 248 var myoptions = getOptions(el); 249 var url = myoptions.protocol + "www.tumblr.com/share?v=3"; 250 url += "&u=" + encodeURIComponent(myoptions.url); 251 url += "&t=" + encodeURIComponent(myoptions.title); 252 253 root.popup(url); 254 }, 255 "googlebookmarks": function (el) { 256 var myoptions = getOptions(el); 257 var url = myoptions.protocol + "www.google.com/bookmarks/mark?op=edit"; 258 url += "&bkmk=" + encodeURIComponent(myoptions.url); 259 url += "&title=" + encodeURIComponent(myoptions.title); 260 url += "&annotation=" + encodeURIComponent(myoptions.description); 261 262 root.popup(url); 263 }, 264 "newsvine": function (el) { 265 var myoptions = getOptions(el); 266 var url = myoptions.protocol + "www.newsvine.com/_tools/seed&save?"; 267 url += "u=" + encodeURIComponent(myoptions.url); 268 url += "&h=" + encodeURIComponent(myoptions.title); 269 270 root.popup(url); 271 }, 272 "evernote": function (el) { 273 var myoptions = getOptions(el); 274 var url = myoptions.protocol + "www.evernote.com/clip.action?"; 275 url += "url=" + encodeURIComponent(myoptions.url); 276 url += "&title=" + encodeURIComponent(myoptions.title); 277 278 root.popup(url); 279 }, 280 "friendfeed": function (el) { 281 var myoptions = getOptions(el); 282 var url = myoptions.protocol + "www.friendfeed.com/share?"; 283 url += "url=" + encodeURIComponent(myoptions.url); 284 url += "&title=" + encodeURIComponent(myoptions.title); 285 286 root.popup(url); 287 }, 288 "vkontakte": function (el) { 289 var myoptions = getOptions(el); 290 var url = myoptions.protocol + "vkontakte.ru/share.php?"; 291 url += "url=" + encodeURIComponent(myoptions.url); 292 url += "&title=" + encodeURIComponent(myoptions.title); 293 url += "&description=" + encodeURIComponent(myoptions.description); 294 url += "&image=" + encodeURIComponent(myoptions.image); 295 url += "&noparse=true"; 296 297 root.popup(url); 298 }, 299 "odnoklassniki": function (el) { 300 var myoptions = getOptions(el); 301 var url = myoptions.protocol + "www.odnoklassniki.ru/dk?st.cmd=addShare&st.s=1"; 302 url += "&st.comments=" + encodeURIComponent(myoptions.description); 303 url += "&st._surl=" + encodeURIComponent(myoptions.url); 304 305 root.popup(url); 306 }, 307 "mailru": function (el) { 308 var myoptions = getOptions(el); 309 var url = myoptions.protocol + "connect.mail.ru/share?"; 310 url += "url=" + encodeURIComponent(myoptions.url); 311 url += "&title=" + encodeURIComponent(myoptions.title); 312 url += "&description=" + encodeURIComponent(myoptions.description); 313 url += "&imageurl=" + encodeURIComponent(myoptions.image); 314 315 root.popup(url); 316 } 317 318 }; 319 320 // open share link in a popup 321 root.popup = function (url) { 322 // set left and top position 323 var popupWidth = 600, 324 popupHeight = 500, 325 // fix dual screen mode 326 dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left, 327 dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top, 328 width = window.innerWidth ? 329 window.innerWidth : 330 document.documentElement.clientWidth ? 331 document.documentElement.clientWidth : 332 screen.width, 333 height = window.innerHeight ? 334 window.innerHeight : 335 document.documentElement.clientHeight ? 336 document.documentElement.clientHeight : 337 screen.height, 338 // calculate top and left position 339 left = ((width / 2) - (popupWidth / 2)) + dualScreenLeft, 340 top = ((height / 2) - (popupHeight / 2)) + dualScreenTop, 341 342 // show popup 343 shareWindow = window.open(url, "targetWindow", 344 "toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width="
344+ popupWidth + 345 ", height=" + popupHeight + ", top=" + top + ", left=" + left); 346 347 // Puts focus on the newWindow 348 if (window.focus) { 349 shareWindow.focus(); 350 } 351 }; 352 353 /* Set options 354 ***********************************************/ 355 356 // create default options 357 root.options = { 358 iconStyle: "default", // default or box 359 boxForm: "horizontal", // horizontal or vertical 360 position: "bottomCenter", // top / middle / bottom + Left / Center / Right 361 protocol: ["http", "https"].indexOf(window.location.href.split(":")[0]) === -1 ? "https://" : "//", 362 networks: "Weibo,Wechat,Douban,QQZone,Twitter,Pinterest,Facebook,GooglePlus,Reddit,Linkedin,Tumblr,Evernote" 363 }; 364 365 // integrate custom options 366 for (var i in options) { 367 if (options.hasOwnProperty(i)) { 368 root.options[i] = options[i]; 369 } 370 } 371 // convert networks string into array 372 //root.options.networks = root.options.networks.toLowerCase().split(","); 373 root.options.networks = root.options.networks.split(","); 374 375 function getOptions(el) { 376 // integrate data attribute options 377 var ret = {}; 378 for (var i in root.options) { 379 if (root.options.hasOwnProperty(i)) { 380 ret[i] = root.options[i]; 381 } 382 } 383 384 // these attrs must get dynamically. 385 ret.url = window.location.href; 386 ret.title = root.getTitle(); 387 ret.image = root.getImage(); 388 ret.description = root.getDescription(); 389 390 for (var option in el.dataset) { 391 // replace only 'share-' prefixed data-attributes 392 if (option.match(/share/)) { 393 var newOption = option.replace(/share/, ""); 394 if (!newOption.length) { 395 continue; 396 } 397 newOption = newOption.charAt(0).toLowerCase() + newOption.slice(1); 398 var val = el.dataset[option]; 399 if (newOption === "networks") { 400 //val = val.toLowerCase().split(","); 401 val = val.split(","); 402 } else if (newOption === "url" && val && val[0] === "/") { 403 // fix relative url problem. 404 val = location.origin + val; 405 } 406 ret[newOption] = val; 407 } 408 } 409 return ret; 410 } 411 412 function createDropdown(el) { 413 // create dropdown 414 var dropdownEl = document.createElement("span"); 415 dropdownEl.className = "need-share-button_dropdown"; 416 if (el.querySelector(".need-share-button_dropdown")) { 417 return; 418 } 419 var myoptions = getOptions(el); 420 421 // set dropdown row length 422 if (myoptions.iconStyle == "box" && myoptions.boxForm == "horizontal") { 423 dropdownEl.className += " need-share-button_dropdown-box-horizontal"; 424 } else if (myoptions.iconStyle == "box" && myoptions.boxForm == "vertical") { 425 dropdownEl.className += " need-share-button_dropdown-box-vertical"; 426 } 427 428 // set dropdown position 429 setTimeout(function () { 430 switch (myoptions.position) { 431 case "topLeft": 432 dropdownEl.className += " need-share-button_dropdown-top-left"; 433 break; 434 case "topRight": 435 dropdownEl.className += " need-share-button_dropdown-top-right"; 436 break; 437 case "topCenter": 438 dropdownEl.className += " need-share-button_dropdown-top-center"; 439 dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px"; 440 break; 441 case "middleLeft": 442 dropdownEl.className += " need-share-button_dropdown-middle-left"; 443 dropdownEl.style.marginTop = -dropdownEl.offsetHeight / 2 + "px"; 444 break; 445 case "middleRight": 446 dropdownEl.className += " need-share-button_dropdown-middle-right"; 447 dropdownEl.style.marginTop = -dropdownEl.offsetHeight / 2 + "px"; 448 break; 449 case "bottomLeft": 450 dropdownEl.className += " need-share-button_dropdown-bottom-left"; 451 break; 452 case "bottomRight": 453 dropdownEl.className += " need-share-button_dropdown-bottom-right"; 454 break; 455 case "bottomCenter": 456 dropdownEl.className += " need-share-button_dropdown-bottom-center"; 457 dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px"; 458 break; 459 default: 460 dropdownEl.className += " need-share-button_dropdown-bottom-center"; 461 dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px"; 462 break; 463 } 464 }, 1); 465 466
467 // fill fropdown with buttons 468 var iconClass = myoptions.iconStyle == "default" ? 469 "need-share-button_link need-share-button_" : 470 "need-share-button_link-" + myoptions.iconStyle + " need-share-button_link need-share-button_"; 471 for (var network in myoptions.networks) { 472 if (myoptions.networks.hasOwnProperty(network)) { 473 var link = document.createElement("span"); 474 network = myoptions.networks[network].trim(); 475 var networkLC = network.toLowerCase(); 476 link.className = iconClass + networkLC; 477 var fontello = ["weibo", "wechat", "douban", "qqzone", "renren"]; 478 if (fontello.indexOf(networkLC) === -1) { 479 link.className += " social-" + networkLC; 480 } else { 481 link.className += " icon-" + networkLC; 482 } 483 link.dataset.network = networkLC; 484 link.title = network; 485 dropdownEl.appendChild(link); 486 } 487 } 488 489 dropdownEl.addEventListener("click", function (event) { 490 if (closest(event.target, ".need-share-button_link")) { 491 event.preventDefault(); 492 event.stopPropagation(); 493 494 root.share[event.target.dataset.network](el); 495 return false; 496 } 497 }); 498 499 el.appendChild(dropdownEl); 500 } 501 502 // close on click outside 503 document.addEventListener("click", function (event) { 504 var openedEl = document.querySelector(".need-share-button-opened"); 505 if (!closest(event.target, ".need-share-button-opened")) { 506 if (openedEl) { 507 openedEl.classList.remove("need-share-button-opened"); 508 509 // hide wechat code image when close the dropdown. 510 if (openedEl.querySelector(".need-share-wechat-code-image")) { 511 openedEl.querySelector(".need-share-wechat-code-image").remove(); 512 } 513 } else { 514 var el = closest(event.target, root.elem); 515 if (el) { 516 if (!el.classList.contains("need-share-button-opened")) { 517 createDropdown(el); 518 setTimeout(function () { 519 el.classList.add("need-share-button-opened"); 520 }, 1); 521 } 522 } 523 } 524 } else { 525 setTimeout(function () { 526 openedEl.classList.remove("need-share-button-opened"); 527 528 // hide wechat code image when close the dropdown. 529 if (openedEl.querySelector(".need-share-wechat-code-image")) { 530 openedEl.querySelector(".need-share-wechat-code-image").remove(); 531 } 532 }, 1); 533 } 534 }); 535 536 }; 537})();
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.