/**
 * jquery.socialbutton - jQuery plugin for social networking websites
 * http://itra.jp/jquery_socialbutton_plugin/
 * 
 * Copyright 2010, Itrans, Inc. http://itra.jp/
 * 
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 * 
 * Version: 1.1
 */
(function($) {

$.fn.socialbutton = function(service, options) {

	options = options || {};

	options.defaults = {
		url: document.URL,
		title: document.title,
		mixi_check: {
			button: 'button-1'
		},
		facebook_like: {
			layout: 'standard',
			show_faces: true,

			width_standard_default: 450,
			width_standard_minimum: 225,
			height_standard_without_photo: 35,
			height_standard_with_photo: 80,

			width_button_count_default: 90,
			width_button_count_minimum: 90,
			height_button_count: 20,

			width_box_count_default: 55,
			width_box_count_minimum: 55,
			height_box_count: 65,

			action: 'like',
			font: '',
			colorscheme: 'light'
		},
		twitter: {
			count: 'horizontal', // vertical / horizontal / none
			text: '',
			lang: 'en' // ja / en /de / fr / es
		},
		gree_sf: {
			type: 0,
			height: 20
		}
	};

	var max_index = this.size() - 1;

	return this.each(function(index) {

		switch (service) {
			case 'mixi_check':
			case 'facebook_like':
			case 'twitter':
			case 'gree_sf':
				try {
					eval('socialbutton_' + service + '(this, options, index, max_index);');
				} catch (e) {alert(e)}
				break;

			default:
				break;
		}

		return true;
	});

	function socialbutton_mixi_check(target, options, index, max_index)
	{
		var key = options.key || '';
		var url = options.url || '';
		var button = options.button || options.defaults.mixi_check.button;

		if (key == '') {
			return;
		}

		var attr = merge_attributes({
			'data-key': key,
			'data-url': url_encode(url),
			'data-button': button
		});

		var tag = '<a href="http://mixi.jp/share.pl" class="mixi-check-button"' + attr + '>Check</a>';

		$(target).html(tag);

		if (index == max_index) {
			$('body').append('<script type="text/javascript" src="http://static.mixi.jp/js/share.js"></script>');
		}
	}

	function socialbutton_facebook_like(target, options, index, max_index)
	{
		var url = options.url || options.defaults.url;
		var layout = options.layout || options.defaults.facebook_like.layout;
		var show_faces = options.show_faces || options.defaults.facebook_like.show_faces;
		var width = options.width || 450;
		var action = options.action || options.defaults.facebook_like.action;
		var font = options.font || '';
		var colorscheme = options.colorscheme || options.defaults.facebook_like.colorscheme;

		if (layout != 'standard' && layout != 'button_count' && layout != 'box_count') {
			layout = 'standard';
		}

		var height;
		switch (layout) {
			case 'standard':
				if (width == 0) {
					width = options.defaults.facebook_like.width_standard_default;
				} else if (width < options.defaults.facebook_like.width_standard_minimum) {
					width = options.defaults.facebook_like.width_standard_minimum;
				}
				height = show_faces ? options.defaults.facebook_like.height_standard_with_photo : options.defaults.facebook_like.height_standard_without_photo;
				break;
			case 'button_count':
				if (width == 0) {
					width = options.defaults.facebook_like.width_button_count_default;
				} else if (width < options.defaults.facebook_like.width_button_count_minimum) {
					width = options.defaults.facebook_like.width_button_count_minimum;
				}
				height = options.defaults.facebook_like.height_button_count;
				break;
			case 'box_count':
				if (width == 0) {
					width = options.defaults.facebook_like.width_box_count_default;
				} else if (width < options.defaults.facebook_like.width_box_count_minimum) {
					width = options.defaults.facebook_like.width_box_count_minimum;
				}
				height = options.defaults.facebook_like.height_box_count;
				break;
		}

		var params = merge_parameters({
			'href': url_encode(url),
			'layout': layout,
			'show_faces': show_faces ? 'true' : 'false',
			'width': width,
			'action': action,
			'font': font,
			'colorscheme': colorscheme,
			'height': height
		});

		var tag = '<iframe src="http://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>';

		$(target).html(tag);
	}

	function socialbutton_twitter(target, options)
	{
		var count = options.count || options.defaults.twitter.count;
		var text = options.text || options.defaults.twitter.text;
		var url = options.url || '';
		var lang = options.lang || options.defaults.twitter.lang;
		var via = options.via || '';
		var related = options.related || '';

		var attr = merge_attributes({
			'data-count': count,
			'data-text': text,
			'data-url': url_encode(url),
			'data-lang': lang,
			'data-via': via,
			'data-related': related
		});

		var tag = '<a href="http://twitter.com/share" class="twitter-share-button"' + attr + '>Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>';

		$(target).html(tag);
	}

	function socialbutton_gree_sf(target, options)
	{
		var url = options.url || options.defaults.url;
		var type = options.type || options.defaults.gree_sf.type;
		var height = options.height || options.defaults.gree_sf.height;

		var params = merge_parameters({
			'url': url_encode(url),
			'type': String(type),
			'height': height
		});

		var tag = '<iframe src="http://share.gree.jp/share?' + params + '" scrolling="no" frameborder="0" marginwidth="0" marginheight="0" style="border:none; overflow:hidden; width:100px; height:' + height + 'px;" allowTransparency="true"></iframe>';

		$(target).html(tag);
	}

	function url_encode(url)
	{
		return encodeURI(url);
	}

	function merge_attributes(attr)
	{
		var merged = '';

		for (var i in attr) {
			if (attr[i] == '') {
				continue;
			}
			merged += merged != '' ? ' ' : '';
			merged += i + '="' + attr[i] + '"';
		}

		return merged;
	}

	function merge_parameters(params)
	{
		var merged = '';

		for (var i in params) {
			if (params[i] == '') {
				continue;
			}
			merged += merged != '' ? '&amp;' : '';
			merged += i + '=' + params[i] + '';
		}

		return merged;
	}
}

})(jQuery);

