PageSourceSearch

https://www.masking-tape.jp/common/js/jquery.socialbutton.js

js masking-tape.jp collected 2026-10-03 20:14:10 UTC 22,771 bytes, 843 lines download raw bytes

1/**
2 * jquery.socialbutton - jQuery plugin for social networking websites
3 * https://itra.jp/jquery_socialbutton_plugin/
4 * 
5 * Copyright 2010, Itrans, Inc. https://itra.jp/
6 * 
7 * Dual licensed under the MIT or GPL Version 2 licenses.
8 * https://jquery.org/license
9 * 
10 * Version: 1.9.1
11 */
12
13/**
14 * SYNOPSIS
15 * 
16 * 
17 * mixi_check
18 * https://developer.mixi.co.jp/connect/mixi_plugin/mixi_check/spec_mixi_check
19 * 
20 * $('#mixi_check').socialbutton('mixi_check', {
21 *     key: 'mixi-check-key'
22 * });
23 * 
24 * $('#mixi_check').socialbutton('mixi_check', {
25 *     key: 'mixi-check-key',
26 *     button: 'button-1',
27 *     url: 'https://itra.jp/'
28 * });
29 * 
30 * 
31 * mixi_like
32 * https://developer.mixi.co.jp/connect/mixi_plugin/favorite_button/spec
33 * 
34 * $('#mixi_like').socialbutton('mixi_like', {
35 *     key: 'mixi-check-key',
36 * });
37 * 
38 * $('#mixi_like').socialbutton('mixi_like', {
39 *     key: 'mixi-check-key',
40 *     url: 'https://itra.jp/',
41 *     width: 450,
42 *     height: 80,
43 *     show_faces: true,
44 *     style: 'additional-style-here'
45 * });
46 * 
47 * 
48 * facebook_like
49 * https://developers.facebook.com/docs/reference/plugins/like
50 * 
51 * $('#facebook_like').socialbutton('facebook_like');
52 * 
53 * $('#facebook_like').socialbutton('facebook_like', {
54 *     button: 'standard', // synonym 'layout'
55 *     url: 'https://itra.jp',
56 *     show_faces: true,
57 *     width: 450,
58 *     height: 80,
59 *     action: 'like',
60 *     locale: 'en_US',
61 *     font: 'arial',
62 *     colorscheme: 'light'
63 * });
64 * 
65 * 
66 * facebook_share
67 * https://developers.facebook.com/docs/share
68 * 
69 * $('#facebook_share').socialbutton('facebook_share');
70 * 
71 * $('#facebook_share').socialbutton('facebook_share', {
72 *     button: 'button_count', // synonym 'type'
73 *     url: 'https://itra.jp',
74 *     text: 'Share'
75 * });
76 * 
77 * 
78 * Twitter
79 * https://twitter.com/goodies/tweetbutton
80 * 
81 * $('#twitter').socialbutton('twitter');
82 * 
83 * $('#twitter').socialbutton('twitter', {
84 *     button: 'vertical', // synonym 'count'
85 *     url: 'https://itra.jp/',
86 *     text: 'tweet text',
87 *     lang: 'ja',
88 *     via: 'ishiiyoshinori',
89 *     related: 'twitter'
90 * });
91 * 
92 * 
93 * GREE Social Feedback
94 * https://developer.gree.co.jp/connect/plugins/sf
95 * 
96 * $('#gree_sf').socialbutton('gree_sf');
97 * 
98 * $('#gree_sf').socialbutton('gree_sf', {
99 *     button: 0, // synonym 'type'
100 *     url: 'https://itra.jp/',
101 *     width: 0, // auto
102 *     height: 20
103 * });
104 * 
105 * 
106 * Evernote Site Memory
107 * https://www.evernote.com/about/developer/sitememory/
108 * 
109 * $('#evernote').socialbutton('evernote');
110 * 
111 * $('#evernote').socialbutton('evernote', {
112 *     button: 'article-clipper',
113 *     url: 'https://itra.jp/',
114 *     provider_name: 'itra.jp',
115 *     suggest_notebook: 'webclip',
116 *     content_id: 'element-id-to-clip',
117 *     code: 'your-affiliate-code',
118 *     title: 'note-title',
119 *     suggest_tags: 'comma-separated-tags,up-to-three-tags',
120 *     styling: 'full'
121 * });
122 * 
123 * 
124 * Hatena Bookmark
125 * https://b.hatena.ne.jp/
126 * 
127 * $('#hatena').socialbutton('hatena');
128 * 
129 * $('#hatena').socialbutton('hatena', {
130 *     button: 'standard',
131 *     url: 'https://itra.jp/',
132 *     title: 'page-title'
133 * });
134 * 
135 * 
136 * Hatena Bookmark (Old Style)
137 * https://b.hatena.ne.jp/
138 * 
139 * $('#hatena').socialbutton('hatena_oldstyle');
140 * 
141 * $('#hatena').socialbutton('hatena_oldstyle', {
142 *     button: '/path/to/your-icon.png',
143 *     url: 'https://itra.jp/',
144 *     padding: 10,
145 *     height: 15
146 * });
147 * 
148 * 
149 * Google +1 Button
150 * https://www.google.com/webmasters/+1/button/
151 * 
152 * $('#google').socialbutton('google_plusone');
153 * 
154 * $('#google').socialbutton('google_plusone', {
155 *     button: 'standard', // synonym 'size'
156 *     url: 'https://itra.jp', // synonym 'href'
157 *     lang: 'ja',
158 *     parsetags: 'explicit',
159 *     callback: 'some_callback_function',
160 *     count: true
161 * });
162 * 
163 *
164 * Pintarest Button
165 * https://pinterest.com/about/goodies/
166 *
167 * $('#pinterest').socialbutton('pintarest', {
168 *     button: 'horizontal', // or 'vertical', 'none'
169 *     url: 'https://itra.jp',
170 *     media: 'https://itra.jp/image.jpg',
171 *     description: 'This is an image.'
172 * });
173 */
174(function($) {
175
176$.fn.socialbutton = function(service, options) {
177
178	options = options || {};
179
180	var defaults = {
181		mixi_check: {
182			key: '',
183			button: 'button-1', // button-1,button-2,button-3,button-4,button-5
184			url: '' // document.URL
185		},
186		mixi_like: {
187			key: '',
188			url: document.URL,
189			width: 0, // auto
190			height: 0, // auto
191			show_faces: true,
192			style: '',
193
194			sizes: {
195				width: {
196					with_faces: 450,
197					without_faces: 140
198				},
199				height: {
200					with_faces_minimum: 80,
201					without_faces_minimum: 20
202				}
203			}
204		},
205		facebook_like: {
206			button: 'standard', // standard / button_count / box_count
207			url: document.URL,
208
209			show_faces: true,
210			width: 0, // auto
211			height: 0, // auto
212
213			width_standard_default: 450, // orig: 450
214			width_standard_minimum: 225,
215			height_standard_without_photo: 35,
216			height_standard_with_photo: 80,
217
218			width_button_count_default: 120, // orig: 90, jp_min: 114
219			width_button_count_minimum: 90,
220			height_button_count: 25, // orig:20, jp_min: 21
221
222			width_box_count_default: 80, // orig:55, jp_min: 75
223			width_box_count_minimum: 55,
224			height_box_count: 70, // orig: 65, jp_min: 66
225
226			action: 'like', // like / recommend
227			locale: '', // auto
228			font: '',
229			colorscheme: 'light' // light / dark
230		},
231		facebook_share: {
232			button: 'button_count', // box_count / button / icon_link / icon
233			url: '', //document.URL
234			text: '' //Share
235		},
236		twitter: {
237			button: 'vertical', // vertical / horizontal / none
238			url: '', // document.URL
239			text: '',
240			lang: 'ja', // ja / en /de / fr / es
241			via: '',
242			related: ''
243		},
244		gree_sf: {
245			button: 0, // 0,1,2,3,4
246			url: document.URL,
247			width: 0, // auto
248			height: 20,
249
250			widths: {
251				type0_16: 58, type0_20: 70, type0_23: 76,
252				type1_16: 58, type1_20: 73, type1_23: 78,
253				type2_16: 58, type2_20: 73, type2_23: 78,
254				type3_16: 49, type3_20: 61, type3_23: 64,
255				type4_16: 16, type4_22: 21, type4_32: 32
256			}
257		},
258		evernote: {
259			button: 'article-clipper', // article-clipper, article-clipper-remember, article-clipper-jp, article-clipper-rus, article-clipper-fr, article-clipper-es, article-clipper-de, article-clipper-vert, site-mem-32, site-mem-36, site-mem-22, site-mem-16
260			url: '', // document.URL
261			provider_name: '', // domain name
262			suggest_notebook: '', // notebook name
263			content_id: '', // element id for clip
264			code: '', // affiliate code
265			title: '',
266			suggest_tags: '',
267			styling: '' // none(text-only), full
268		},
269		hatena: {
270			button: 'standard', // standard, vertical, simple
271			url: document.URL,
272			title: document.title
273		},
274		hatena_oldstyle: {
275			button: 'https://d.hatena.ne.jp/images/b_append.gif',
276			url: document.URL,
277			height: 13,
278			padding: 7
279		},
280		google_plusone: {
281			button: '', // small, standard, medium, tall
282			url: '',
283			lang: '', // en-US
284			parsetags: '', // none(onload), explicit
285			callback: '',
286			count: true // true, false
287		},
288		pinterest: {
289			button: 'horizontal', // horizontal, vertical, none
290			url: document.URL,
291			media: '',
292			description: ''
293		}
294	};
295
296	var max_index = this.size() - 1;
297
298	return this.each(function(index) {
299
300		switch (service) {
301			case 'mixi_check':
302				socialbutton_mixi_check(this, options, defaults.mixi_check, index, max_index);
303				break;
304
305			case 'mixi_like':
306				socialbutton_mixi_like(this, options, defaults.mixi_like, index, max_index);
307				break;
308
309			case 'facebook_like':
310				socialbutton_facebook_like(this, options, defaults.facebook_like, index, max_index);
311				break;
312
313			case 'facebook_share':
314				socialbutton_facebook_share(this, options, defaults.facebook_share, index, max_index);
315				break;
316
317			case 'twitter':
318				socialbutton_twitter(this, options, defaults.twitter, index, max_index);
319				break;
320
321			case 'gree_sf':
322				socialbutton_gree_sf(this, options, defaults.gree_sf, index, max_index);
323				break;
324
325			case 'evernote':
326				socialbutton_evernote(this, options, defaults.evernote, index, max_index);
327				break;
328
329			case 'hatena':
330				socialbutton_hatena(this, options, defaults.hatena, index, max_index);
331				break;
332
333			case 'hatena_oldstyle':
334				socialbutton_hatena_oldstyle(this, options, defaults.hatena_oldstyle, index, max_index);
335				break;
336
337			case 'google_plusone':
338				socialbutton_google_plusone(this, options, defaults.google_plusone, index, max_index);
339				break;
340
341			case 'pinterest':
342				socialbutton_pinterest(this, options, defaults.pinterest, index, max_index);
343				break;
344
345			default:
346				break;
347		}
348
349		return true;
350	});
351}
352
353function socialbutton_mixi_check(target, options, defaults, index, max_index)
354{
355	var key = options.key || defaults.key;
356	var button = options.button || defaults.button;
357	var url = options.url || defaults.url;
358
359	if (key == '') {
360		return;
361	}
362
363	var attr = merge_attributes({
364		'data-key': key,
365		'data-url': htmlspecialchars(url),
366		'data-button': button
367	});
368
369	var tag = '<a href="https://mixi.jp/share.pl" class="mixi-check-button"' + attr + '>Check</a>';
370
371	$(target).html(tag);
372
373	if (index == max_index) {
374		$('body').append('<script type="text/javascript" src="https://static.mixi.jp/js/share.js"></script>');
375	}
376}
377
378function socialbutton_mixi_like(target, options, defaults, index, max_index)
379{
380	var key = options.key || defaults.key;
381	var url = options.url || defaults.url;
382	var width = options.width != undefined ? options.width : defaults.width;
383	var height = options.height != undefined ? options.height : defaults.height;
384	var show_faces = options.show_faces != undefined ? options.show_faces : defaults.show_faces;
385	var style = options.style || defaults.style;
386
387	if (key == '') {
388		return;
389	}
390
391	if (options.url) {
392		url = decodeURIComponent(url);
393	}
394	url = url_encode_rfc3986(url);
395
396	if (width == 0) {
397		width = show_faces ? defaults.sizes.width.with_faces : defaults.sizes.width.without_faces;
398	}
399
400	if (height == 0) {
401		height = show_faces ? defaults.sizes.height.with_faces_minimum : defaults.sizes.height.without_faces_minimum;
402	} else {
403		if (show_faces && height < defaults.sizes.height.with_faces_minimum) {
404			height = defaults.sizes.height.with_faces_minimum;
405		} else if (!show_faces && height < defaults.sizes.height.without_faces_minimum) {
406			height = defaults.sizes.height.without_faces_minimum;
407		}
408	}
409
410	var params = merge_parameters({
411		'href': url,
412		'service_key': key,
413		'width': width,
414		'show_faces': show_faces ? 'true' : 'false'
415	});
416
417	var attr = merge_attributes({
418		src: 'https://plugins.mixi.jp/favorite.pl?' + params,
419		scrolling: 'no',
420		frameborder: '0',
421		allowTransparency: 'true',
422		style: 'border:0; overflow:hidden; width:' + width + 'px; height:' + height + 'px; ' + style
423	});
424
425	var tag = '<iframe' + attr + '></iframe>';
426
427	$(target).html(tag);
428}
429
430function socialbutton_facebook_like(target, options, defaults, index, max_index)
431{
432	var layout = options.layout || options.button || defaults.button;
433	var url = options.url || defaults.url;
434
435	var show_faces = options.show_faces != undefined ? options.show_faces : defaults.show_faces;
436	var width = options.width != undefined ? options.width : defaults.width;
437	var height = options.height != undefined ? options.height : defaults.height;
438	var action = options.action || defaults.action;
439	var locale = options.locale || defaults.locale;
440	var font = options.font || defaults.font;
441	var colorscheme = options.colorscheme || defaults.colorscheme;
442
443	if (options.url) {
444		url = decodeURIComponent(url);
445	}
446	url = url_encode_rfc3986(url);
447
448	switch (layout) {
449		case 'standard':
450			if (width == 0) {
451				width = defaults.width_standard_default;
452			} else if (width < defaults.width_standard_minimum) {
453				width = defaults.width_standard_minimum;
454			}
455			if (height == 0) {
456				height = show_faces ? defaults.height_standard_with_photo : defaults.height_standard_without_photo;
457			} else if (height < defaults.height_standard_without_photo) {
458				height = defaults.height_standard_without_photo;
459			}
460			break;
461		case 'button_count':
462			if (width == 0) {
463				width = defaults.width_button_count_default;
464			} else if (width < defaults.width_button_count_minimum) {
465				width = defaults.width_button_count_minimum;
466			}
467			if (height == 0) {
468				height = defaults.height_button_count;
469			} else if (height < defaults.height_button_count) {
470				height = defaults.height_button_count;
471			}
472			break;
473		case 'box_count':
474			if (width == 0) {
475				width = defaults.width_box_count_default;
476			} else if (width < defaults.width_box_count_minimum) {
477				width = defaults.width_box_count_minimum;
478			}
479			if (height == 0) {
480				height = defaults.height_box_count;
481			} else if (height < defaults.height_box_count) {
482				height = defaults.height_box_count;
483			}
484			break;
485	}
486
487	var params = merge_parameters({
488		'href': url,
489		'layout': layout,
490		'show_faces': show_faces ? 'true' : 'false',
491		'width': width,
492		'action': action,
493		'locale': locale,
494		'font': font,
495		'colorscheme': colorscheme,
496		'height': height
497	});
498
499	var tag = '<iframe src="https://www.facebook.com/plugins/like.php?' + params + '" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:' + width + 'px; height:' + height + 'px;" allowTransparency="true"></iframe>';
500
501	$(target).html(tag);
502}
503
504function socialbutton_facebook_share(target, options, defaults, index, max_index)
505{
506	var type = options.type || options.button || defaults.button;
507	var url = options.url || defaults.url;
508	var text = options.text || defaults.text;
509
510	var attr = merge_attributes({
511		'type': type,
512		'share_url': htmlspecialchars(url)
513	});
514
515	var tag = '<a name="fb_share"' + attr + '>
515' + text + '</a>';
516
517	if(index == 0) {
518		tag += '<script type="text/javascript" src="https://static.ak.fbcdn.net/connect.php/js/FB.Share"></script>';
519	}
520
521	$(target).html(tag);
522}
523
524function socialbutton_twitter(target, options, defaults, index, max_index)
525{
526	var count = options.count || options.button || defaults.button;
527	var url = options.url || defaults.url;
528
529	var text = options.text || defaults.text;
530	var lang = options.lang || defaults.lang;
531	var via = options.via || defaults.via;
532	var related = options.related || defaults.related;
533
534	var attr = merge_attributes({
535		'data-count': count,
536		'data-url': htmlspecialchars(url),
537		'data-text': text,
538		'data-lang': lang,
539		'data-via': via,
540		'data-related': related
541	});
542
543	var tag = '<a href="https://twitter.com/share" class="twitter-share-button"' + attr + '>Tweet</a>';
544
545	$(target).html(tag);
546
547	if (index == max_index) {
548		$('body').append('<script type="text/javascript" src="https://platform.twitter.com/widgets.js"></script>');
549	}
550}
551
552function socialbutton_gree_sf(target, options, defaults, index, max_index)
553{
554	var type = options.type || options.button || defaults.button;
555	var url = options.url || defaults.url;
556
557	var width = options.width != undefined ? options.width : defaults.width;
558	var height = options.height != undefined ? options.height : defaults.height;
559
560	if (options.url) {
561		url = decodeURIComponent(url);
562	}
563	url = url_encode_rfc3986(url);
564
565	switch (type) {
566		case 0:
567		case 1:
568		case 2:
569		case 3:
570			if (height != 16 && height != 20 && height != 23) {
571				height = 20;
572			}
573			break;
574
575		case 4:
576			if (height != 16 && height != 22 && height != 32) {
577				height = 22;
578			}
579			break;
580
581		default:
582			type = 0;
583			width = 0;
584			height = 20;
585			break;
586	}
587
588	if (width == 0) {
589		width = defaults.widths['type' + type + '_' + height];
590	}
591
592	var params = merge_parameters({
593		'url': url,
594		'type': String(type),
595		'height': height
596	});
597
598	var tag = '<iframe src="https://share.gree.jp/share?' + params + '" scrolling="no" frameborder="0" marginwidth="0" marginheight="0" style="border:none; overflow:hidden; width:' + width + 'px; height:' + height + 'px;" allowTransparency="true"></iframe>';
599
600	$(target).html(tag);
601}
602
603function socialbutton_evernote(target, options, defaults, index, max_index)
604{
605	var button = options.button || defaults.button;
606	var url = options.url || defaults.url;
607
608	var provider_name = options.provider_name || defaults.provider_name;
609	var suggest_notebook = options.suggest_notebook || defaults.suggest_notebook;
610	var content_id = options.content_id || defaults.content_id;
611	var code = options.code || defaults.code;
612	var title = options.title || defaults.title;
613	var suggest_tags = options.suggest_tags || defaults.suggest_tags;
614	var styling = options.styling || defaults.styling;
615
616	if (button == 'article-clipper' ||
617		button == 'article-clipper-remember' ||
618		button == 'article-clipper-jp' ||
619		button == 'article-clipper-rus' ||
620		button == 'article-clipper-fr' ||
621		button == 'article-clipper-es' ||
622		button == 'article-clipper-de' ||
623		button == 'article-clipper-vert' ||
624		button == 'site-mem-32' ||
625		button == 'site-mem-36' ||
626		button == 'site-mem-22' ||
627		button == 'site-mem-16'
628		) {
629			button = 'https://static.evernote.com/' + button + '.png';
630	}
631
632	var clipoptions = {
633		'url': url,
634		'providerName': provider_name,
635		'suggestNotebook': suggest_notebook,
636		'contentId': content_id,
637		'code': code,
638		'title': title,
639		'suggestTags': suggest_tags,
640		'styling': styling
641	};
642
643	if (index == 0) {
644		$('body').append('<script type="text/javascript" src="https://static.evernote.com/noteit.js"></script>');
645	}
646
647	var tag = $(document.createElement('a'))
648		.attr({href: '#'})
649		.click(function(){
650			if (Evernote) {
651				Evernote.doClip(clipoptions);
652			}
653			return false;
654		})
655		.append('<img src="' + button + '" alt="Clip to Evernote" style="border: none" />');
656
657	$(target).html(tag);
658}
659
660function socialbutton_hatena(target, options, defaults, index, max_index)
661{
662	var layout = options.layout || options.button || defaults.button;
663	var url = options.url || defaults.url;
664	var title = options.title || defaults.title;
665
666	url = htmlspecialchars(url);
667	title = htmlspecialchars(title);
668
669	var attr = merge_attributes({
670		'href': 'https://b.hatena.ne.jp/entry/' + url,
671		'class': 'hatena-bookmark-button',
672		'data-hatena-bookmark-title': title,
673		'data-hatena-bookmark-layout': layout,
674		'title': '縺薙�繧ィ繝ウ繝医Μ繝シ繧偵�縺ヲ縺ェ繝悶ャ繧ッ繝槭�繧ッ縺ォ霑ス蜉�'
675	});
676	
677	var tag = '<a' + attr + '><img src="https://b.st-hatena.com/images/entry-button/button-only.gif" alt="縺薙�繧ィ繝ウ繝医Μ繝シ繧偵�縺ヲ縺ェ繝悶ャ繧ッ繝槭�繧ッ縺ォ霑ス蜉�" width="20" height="20" style="border: none;" /></a>'
678			+ '<script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>';
679
680	$(target).html(tag);
681}
682
683function socialbutton_hatena_oldstyle(target, options, defaults, index, max_index)
684{
685	var button = options.button || defaults.button;
686	var url = options.url || defaults.url;
687
688	var height = options.height != undefined ? options.height : defaults.height;
689	var padding = options.padding != undefined ? options.padding : defaults.padding;
690
691	url = htmlspecialchars(url);
692
693	var tag = '<span style="font-size: ' + height + 'px; line-height: 100%; ">'
694			+ '<span style="padding-right: ' + padding + 'px"><a href="https://b.hatena.ne.jp/entry/add/' + url + '" target="_blank"><img src="' + button + '" style="border: none; vertical-align: text-bottom" /></a></span>'
695			+ '<a href="https://b.hatena.ne.jp/entry/' + url + '" target="_blank"><img src="https://b.hatena.ne.jp/entry/image/' + url + '" style="border: none; vertical-align: text-bottom" /></a>'
696			+ '</span>';
697
698	$(target).html(tag);
699}
700
701function socialbutton_google_plusone(target, options, defaults, index, max_index)
702{
703	if (!$.support.tbody) {
704		return;
705	}
706
707	var size = options.size || options.button || defaults.button;
708	var href = options.href || options.url || defaults.url;
709
710	var lang = options.lang || defaults.lang;
711	var parsetags = options.parsetags || defaults.parsetags;
712
713	var callback = options.callback || defaults.callback;
714	var count = options.count != undefined ? options.count : defaults.count;
715
716	switch (size) {
717		case 'small':
718		case 'standard':
719		case 'medium':
720			break;
721
722		case 'tall':
723			count = true;
724			break;
725
726		default:
727			size = 'standard';
728			count = true;
729	}
730
731	var tag = $('<div>')
732	.attr({
733		'data-callback': callback,
734		'data-count': count ? 'true' : 'false',
735		'data-href': href,
736		'data-size': size
737	}).addClass('g-plusone');
738	$(target).append(tag);
739
740	if (index == max_index) {
741
742		var script_params = '';
743
744		if (lang != '') {
745			script_params += 'lang: "' + htmlspecialchars(lang) + '"';
746		}
747		if (parsetags != '') {
748			script_params += script_params != '' ? ',' : '';
749			script_params += 'parsetags: "' + htmlspecialchars(parsetags) + "'";
750		}
751		if (script_params != '') {
752			script_params = '{' + script_params + '}';
753		}
754
755		if (typeof gapi === 'undefined' || typeof gapi.plusone === 'undefined') {
756			$('body').append('<script type="text/javascript" src="https://apis.google.com/js/plusone.js">' + script_params + '</script>');
757		} else {
758			gapi.plusone.go();
759		}
760	}
761}
762
763function socialbutton_pinterest(target, options, defaults, index, max_index)
764{
765	var url = options.url || defaults.url;
766	var button = options.button || defaults.button;
767	var media = options.media != undefined ? options.media : defaults.media;
768	var description = options.description != undefined ? options.description : defaults.description;
769
770	url = url_encode_rfc3986(decodeURIComponent(url));
771	media = url_encode_rfc3986(decodeURIComponent(media));
772	description = decodeURIComponent(description);
773
774	var params = merge_parameters({
775		'url': url,
776		'media': media,
777		'description': description
778	});
779
780	var tag = '<a href="https://pinterest.com/pin/create/button/?' + params + '" class="pin-it-button" count-layout="' + button +'"><img border="0" src="//assets.pinterest.com/images/PinExt.png" title="Pin It" /></a>'
781
782	$(target).html(tag);
783
784	if (index == max_index) {
785		$('body').append('<script type="text/javascript" src="//assets.pinterest.com/js/pinit.js"></script>');
786	}
787}
788
789function merge_attributes(attr)
790{
791	var merged = '';
792
793	for (var i in attr) {
794		if (attr[i] == '') {
795			continue;
796		}
797		merged += ' ' + i + '="' + attr[i] + '"';
798	}
799
800	return merged;
801}
802
803function merge_parameters(params)
804{
805	var merged = '';
806
807	for (var i in params) {
808		if (params[i] == '') {
809			continue;
810		}
811		merged += merged != '' ? '&amp;' : '';
812		merged += i + '=' + params[i] + '';
813	}
814
815	return merged;
816}
817
818function htmlspecialchars(string)
819{
820	var table = [
821		[/&/g, '&amp;'],
822		[/</g, '&lt;'],
823		[/>/g, '&gt;'],
824		[/"/g, '&quot;'],
825		[/'/g, '&#039;']
826	];
827
828	for (var i in table) {
829		string = string.replace(table[i][0], table[i][1]);
830	}
831
832	return string;
833}
834
835function url_encode_rfc3986(url)
836{
837	return encodeURIComponent(url).replace(/[!*'()]/g, function(p) {
838		return "%" + p.charCodeAt(0).toString(16);
839	});
840}
841
842})(jQuery);
843// JavaScript Document

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.