﻿/*
* jQuery Floatbox Plugin 1.0.4
* Copyright (c) 2008 Leonardo Rossetti (motw.leo@gmail.com)
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
(function($) {
	
	$.floatbox = function(options) {
		
		var getWidth = function() {
			var version = parseInt($.prototype.jquery.match(/\d/gim)[1]);
			var width;
			if (version > 1) {
				width = $(window).width();
			} else {
				width = document.body.scrollWidth ? document.body.scrollWidth: document.documentElement.scrollWidth;
			}
			return width / 2;
		};
		
		var settings = $.extend({
			
			bg: 'floatbox-background',
			box: 'floatbox-box',
			content: '',
			button: '<p><a role="button" href="javascript:void(0);" class="close-floatbox">Close</a></p>',
			desc: 'This is a popup box, press esc key to close.',
			fade: false,
			ajax: null,
			bgConfig: {
				position: ($.browser.msie) ? 'absolute': 'fixed',
				zIndex: 8,
				width: '100%',
				height: '100%',
				top: '0px',
				left: '0px',
				backgroundColor: '#000',
				opacity: '0.75',
				display: 'none'
			},
			boxConfig: {
				position: ($.browser.msie) ? 'absolute': 'fixed',
				zIndex: 9,
				width: getWidth() + 'px',
				marginLeft: '-' + (getWidth() / 2) + 'px',
				height: 'auto',
				top: '50%',
				left: '50%',
				backgroundColor: '#fff',
				display: 'none'
			}
			
		}, options);
		
		var showBox = function() {
			
			var content = typeof settings.content === 'string' ? settings.content: settings.content.clone();
			
			// floatbox-background
			if ($('#' + settings.bg).length == 0) {
				$('<div></div>')
					.bind('click', function() {
						closeBox();
					})
					.attr('id', settings.bg)
					.css(settings.bgConfig)
					.width(($.browser.msie) ? document.body.clientWidth: '100%')
					.height(($.browser.msie) ? document.body.clientHeight: '100%').appendTo('body');
			}
			
			// floatbox-box
			$('<div></div>')
				.attr({
					id: settings.box,
					role: 'alertdialog'
				})
				.html(content)
				.append(settings.button)
				.css(settings.boxConfig)
				.appendTo('body')
				// .css('margin-top', '-' + $('#' + settings.box).height() / 2 + 'px') Opera でバグあり
				.find('.close-floatbox')
				.bind('click', function() {
					closeBox();
				}).end();
				
			if (settings.fade) {
				$('#' + settings.bg).fadeIn(200, function() {
					$('div#' + settings.box).fadeIn(200);
				});
			} else {
				$('#' + settings.bg).show().parent().find('#' + settings.box).show();
			}
			
			if (settings.ajax) {
				$.ajax({
					type: settings.ajax.params === '' ? 'GET': 'POST',
					url: settings.ajax.url,
					data: settings.ajax.params,
					beforeSend: function() {
						$('#' + settings.box).html(settings.ajax.before);
					},
					success: function(data) {
						$('#' + settings.box).html(data).append(settings.button).find('.close-floatbox').bind('click', function() {
							closeBox();
						});
						settings.ajax.onComplete();
					},
					contentType: 'html'
				});
			}
		};
		
		var closeBox = function() {
			
			if (settings.fade) {
				$('#' + settings.box).fadeOut(200, function() {
					$('#' + settings.bg).fadeOut(200, function() {
						$('#' + settings.box).remove();
						$('#' + settings.bg).remove();
						if (Kaas.isIEVer('6.0')) Kaas.ie6hideSelects.show();
					});
				});
			} else {
				$('#' + settings.box + ',#' + settings.bg).hide();
				setTimeout(function() {
					$('#' + settings.box).remove();
					$('#' + settings.bg).remove();
				}, 500);
			}
			
		};
		
		var init = function() {
			
			showBox();
			
			$(document)
				.one('keypress', function(e) {
					var escKey = $.browser.mozilla ? 0 : 27;
					if (e.which === escKey) {
						closeBox();
					}
				})
				.one('keydown', function(e) {
					var escKey = $.browser.mozilla ? 0 : 27;
					if (e.which === escKey) {
						closeBox();
					}
				});
			
			if ($.browser.msie) {
				$('body, html').css({
					height: '100%',
					width: '100%'
				});
				$(window).bind('scroll', function() {
					$('#' + settings.box).css('top', document.documentElement.scrollTop + ($(window).height() / 2) + 'px');
				});
			}
		};
		
		init();
		
	};
	
})(jQuery);
