// Clipper.js
// 2009 (c) MizunoTomoaki <info@mizunotomoaki.com>

function ClipperInit() {
	if( typeof ClipperButtonImage   == "undefined" ) ClipperButtonImage   = '';
	if( typeof ClipperButtonWidth   == "undefined" ) ClipperButtonWidth   = 140;
	if( typeof ClipperButtonHeight  == "undefined" ) ClipperButtonHeight  =  20;
	if( typeof ClipperIconImageBase == "undefined" ) ClipperIconImageBase = './icon';
	if( typeof ClipperDocumentTitle == "undefined" ) ClipperDocumentTitle = escape(document.title);
	if( typeof ClipperDocumentUri   == "undefined" ) ClipperDocumentUri   = encodeURIComponent(location.href);
	ClipperServiceList = new Array();
	ClipperServiceList[0] = new Array(
		'hatena',
		'はてなブックマーク', 
		'javascript:ClipperOpenPopupWindow(\'http://b.hatena.ne.jp/add?mode=confirm&title=' + ClipperDocumentTitle + '&url=' + ClipperDocumentUri + '\',520,400);',
		'<img src="http://b.hatena.ne.jp/entry/image/small/' + location.href + '">'
	);
	ClipperServiceList[1] = new Array(
		'livedoor',
		'livedoorクリップ', 
		'javascript:ClipperOpenBlankWindow(\'http://clip.livedoor.com/redirect?link=' + ClipperDocumentUri + '&title=' + ClipperDocumentTitle + '&ie=utf-8\');',
		'<img src="http://image.clip.livedoor.com/counter/' + location.href + '">'
	);
	ClipperServiceList[2] = new Array(
		'buzzurl',
		'Buzzurl', 
		'javascript:ClipperOpenBlankWindow(\'http://buzzurl.jp/entry/' + ClipperDocumentUri + '\');',
		'<img src="http://api.buzzurl.jp/api/counter/v1/image?url=' + ClipperDocumentUri + '">'
	);
	ClipperServiceList[3] = new Array(
		'delicious',
		'del.icio.us', 
		'javascript:ClipperOpenPopupWindow(\'http://delicious.com/save?v=5&noui&jump=close&url=' + ClipperDocumentUri + '&title=' + ClipperDocumentTitle + '\',560,400);',
		''
	);
	ClipperServiceList[4] = new Array(
		'yahoo',
		'Yahoo!ブックマーク', 
		'javascript:ClipperOpenBlankWindow(\'http://bookmarks.yahoo.co.jp/action/bookmark?t=' + ClipperDocumentTitle + '&u=' + ClipperDocumentUri + '\');',
		'<img src="http://num.bookmarks.yahoo.co.jp/image/small/' + location.href + '">'
	);
	ClipperServiceList[5] = new Array(
		'favorite',
		'お気に入りに追加', 
		'javascript:ClipperAddFavorite(\'' + location.href + '\',\'' + document.title + '\');',
		''
	);
}

function ClipperLoad() {
	// ボタンの描画
	var btn;
	btn  = '<a href="#" onMouseOver="return ClipperonMouseOver(this);" onMouseOut="return ClipperonMouseOut();" onClick="ClipperonMouseOver(this);">';
	btn += '<img src="' + ClipperButtonImage + '" border="0" alt="ブックマークに追加">';
	btn += '</a>';
	document.write( btn );

	// メニューの描画
	var popup;
	popup  = '<div id="clipper_popup" style="width: 280px; position: absolute; top: 0px; left: 0px; z-index: 100; display: none; background-color: #eeeeff; border: 1px #999999 solid; font-size: 12px;" onMouseOver="return ClipperCancelClosePopup()" onMouseOut="return ClipperonMouseOut();">';
	popup += '<div style="margin: 10px 8px 15px 8px;">';
	popup += '<div style="margin-bottom: 5px;">このページをブックマークできます</div>';
	popup += '<table cellpadding="0" cellspacing="0" border="0">';

	for( var i = 0; i < ClipperServiceList.length; i++ ) {
		var id     = ClipperServiceList[i][0];
		var name   = ClipperServiceList[i][1];
		var uri    = ClipperServiceList[i][2];
		var counts = ClipperServiceList[i][3];
		popup += '<tr align="left" valign="middle">';
		popup += '<td style="padding: 5px 5px 0 0;">';
		popup += '<img src="' + ClipperIconImageBase + '/' + id + '.gif">';		popup += '</td>';
		popup += '<td style="padding: 5px 5px 0 0;">';
		popup += '<a href="' + uri + '">';
		popup += name;
		popup += '</a>';
		popup += '</td>';
		popup += '<td style="padding: 5px 0 0 0;">';
		popup += counts;
		popup += '</td>';
		popup += '</tr>';
	}
	popup += '</table>';
	popup += '</div>';
	popup += '</div>';

	var pdiv = document.createElement('div');
	pdiv.innerHTML = popup;
	document.body.insertBefore( pdiv, document.body.firstChild );
}


function ClipperonMouseOver( obj ) {
	// このボタンの座標を得る
	var position = ClipperPosition( obj );
	// alert( position.top + ',' + position.left );

	// ポップアップメニューを取得
	var popup = ClipperPopup();

	// ポップアップメニューを表示
	popup.style.display = 'block';

	// ポップアップメニューの位置を調整
	var psize  = ClipperGetPopupSize();
	var wsize  = ClipperGetWindowSize();
	var offset = ClipperGetWindowOffset();
	//alert( psize.width + 'x' + psize.height );
	//alert( wsize.width + 'x' + wsize.height );
	//alert( offset.top + ',' + offset.left );

	// 上側に表示させる
	if( position.top + psize.height - offset.top > wsize.height ) {
		position.top = position.top - psize.height;

	// 下側に表示させる
	} else {
		position.top = position.top + ClipperButtonHeight;
	}
	// 右寄せで表示させる
	if( position.left + psize.width - offset.left > wsize.width ) {
		position.left = position.left - psize.width + ClipperButtonWidth;

	// 左寄せで表示させる
	} else {
		// position.left;
	}

	// 位置が決まった
	popup.style.top  = position.top  + 'px';
	popup.style.left = position.left + 'px';

	// 終わり
	return false;
}

function ClipperonMouseOut( obj ) {
	// クローズをキャンセルできる猶予を与えて実行する
	ClipperClosePopupTimer = setTimeout( "ClipperClosePopup()", 100 );

	// 終わり
	return false;
}

function ClipperGetPopupSize() {
	var popup = ClipperPopup();
	var size = {
		'height'	: popup.clientHeight,
		'width'		: popup.clientWidth
	};
	return size;
}

function ClipperGetWindowSize() {
	var size = {
		'height'	: 0,
		'width'		: 0
	};
	if( typeof( window.innerHeight )== 'number' ) {
		size.height = window.innerHeight;
		size.width  = window.innerWidth;
	} else if( document.documentElement
		&& (document.documentElement.clientWidth || document.documentElement.clientHeight) ) {
		size.height = document.documentElement.clientHeight;
		size.width  = document.documentElement.clientWidth;
	} else if( document.body && (document.body.clientWidth || document.body.clientHeight ) ) {
		size.height = document.body.clientHeight;
		size.width  = document.body.clientWidth;
	}
	return size;
}

function ClipperGetWindowOffset() {
	var offset = {
		'top'	: 0,
		'left'	: 0
	};
	if( typeof( window.pageYOffset ) == 'number' ) {
		offset.top  = window.pageYOffset;
		offset.left = window.pageXOffset;
	} else if( document.body && (document.body.scrollLeft || document.body.scrollTop) ) {
		offset.top  = document.body.scrollTop;
		offset.left = document.body.scrollLeft;
	} else if( document.documentElement
		&& (document.documentElement.scrollLeft || document.documentElement.scrollTop) ) {
		offset.top  = document.documentElement.scrollTop;
		offset.left = document.documentElement.scrollLeft;
	}
	return offset;
}

function ClipperCancelClosePopup() {
	if( typeof ClipperClosePopupTimer != 'undefined' ) {
		clearTimeout( ClipperClosePopupTimer );
	}
}

function ClipperClosePopup() {
	var popup = ClipperPopup();
	popup.style.display = 'none';
	return;
}

function ClipperPopup() {
	return document.getElementById('clipper_popup')
}

function ClipperPosition( obj ) {
	var position = {
		'top'	: 0,
		'left'	: 0
	};
	while( obj ) {
		position.top  += obj.offsetTop  || 0;
		position.left += obj.offsetLeft || 0;
		obj = obj.offsetParent;
	}
	return position;
}

function ClipperOpenPopupWindow( uri, width, height ) {
	if( ! width )  { width  = 400; }
	if( ! height ) { height = 400; }
	window.open( uri, 'popup', 'width=' + width + ',height=' + height + ',scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0' );
}

function ClipperOpenBlankWindow( uri ) {
	window.open( uri );
}

function ClipperAddFavorite( uri, title ) {
	if( document.all ) {
		window.external.AddFavorite( uri, title );
	} else if( navigator.userAgent.indexOf("Firefox") != -1 ) {
		window.sidebar.addPanel( title, uri,'' );
	}
}

ClipperInit();
ClipperLoad();

