/*

jQuery Browser Plugin
	* Version 2.3
	* 2008-09-17 19:27:05
	* URL: http://jquery.thewikies.com/browser
	* Description: jQuery Browser Plugin extends browser detection capabilities and can assign browser selectors to CSS classes.
	* Author: Nate Cavanaugh, Minhchau Dang, & Jonathan Neal
	* Copyright: Copyright (c) 2008 Jonathan Neal under dual MIT/GPL license.
	* JSLint: This javascript file passes JSLint verification.
*//*jslint
		bitwise: true,
		browser: true,
		eqeqeq: true,
		forin: true,
		nomen: true,
		plusplus: true,
		undef: true,
		white: true
*//*global
		jQuery
*/

(function ($) {
	$.browserTest = function (a, z) {
		var u = 'unknown', x = 'X', m = function (r, h) {
			for (var i = 0; i < h.length; i = i + 1) {
				r = r.replace(h[i][0], h[i][1]);
			}

			return r;
		}, c = function (i, a, b, c) {
			var r = {
				name: m((a.exec(i) || [u, u])[1], b)
			};

			r[r.name] = true;

			r.version = (c.exec(i) || [x, x, x, x])[3];

			if (r.name.match(/safari/) && r.version > 400) {
				r.version = '2.0';
			}

			if (r.name === 'presto') {
				r.version = ($.browser.version > 9.27) ? 'futhark' : 'linear_b';
			}
			r.versionNumber = parseFloat(r.version, 10) || 0;
			r.versionX = (r.version !== x) ? (r.version + '').substr(0, 1) : x;
			r.className = r.name + r.versionX;

			return r;
		};

		a = (a.match(/Opera|Navigator|Minefield|KHTML|Chrome/) ? m(a, [
			[/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
			['Chrome Safari', 'Chrome'],
			['KHTML', 'Konqueror'],
			['Minefield', 'Firefox'],
			['Navigator', 'Netscape']
		]) : a).toLowerCase();

		$.browser = $.extend((!z) ? $.browser : {}, c(a, /(camino|chrome|firefox|netscape|konqueror|lynx|msie|opera|safari)/, [], /(camino|chrome|firefox|netscape|netscape6|opera|version|konqueror|lynx|msie|safari)(\/|\s)([a-z0-9\.\+]*?)(\;|dev|rel|\s|$)/));

		$.layout = c(a, /(gecko|konqueror|msie|opera|webkit)/, [
			['konqueror', 'khtml'],
			['msie', 'trident'],
			['opera', 'presto']
		], /(applewebkit|rv|konqueror|msie)(\:|\/|\s)([a-z0-9\.]*?)(\;|\)|\s)/);

		$.os = {
			name: (/(win|mac|linux|sunos|solaris|iphone)/.exec(navigator.platform.toLowerCase()) || [u])[0].replace('sunos', 'solaris')
		};

		if (!z) {
			$('html').addClass([$.os.name, $.browser.name, $.browser.className, $.layout.name, $.layout.className].join(' '));
		}
		
	};
	//alert(navigator.userAgent);
	$.browserTest(navigator.userAgent);
	
	// get Coordinates
	$.Coordinates = function() {
		$.browser.coordinates = {
			width: $(window).width(),
			height: $(window).height(),
			docWith: $(document).width(),
			docHeight: $(document).height(),
			center: {x: '', y:''},
			scroll: {
				top: $(window).scrollTop(),
				left: $(window).scrollLeft()
			}
		}
		$.browser.coordinates.center.x = Math.floor($.browser.coordinates.width / 2);
		$.browser.coordinates.center.y = Math.floor($.browser.coordinates.height / 2) + $.browser.coordinates.scroll.top;
		//console.log($.browser.coordinates);
		//console.log('popUp', $.data(window, 'popUp'));
	};
	
	$.fn.extend({
		getSelect: function(){
			
			var self = this;
			
			switch( $.browser.name ){
				case 'msie':
					self:focus();
					return document.selection.createRange().text();
					break;
				case 'safari':
				case 'chrome':
				case 'firefox':
					return window.getSelection();
					break;
			}
			//var word = "" + (window.getSelection ? window.getSelection() : document.getSelection ? document.getSelection() : document.selection.createRange().text);
		}
	});
	
	/** !Growl **/
	$.fn.extend({
		Growl: function( trigger, options ) {
		
			this.config = {
				mode: 'MusicVideo'
			};
		
			var el = this;
			
			this.options = $.extend({}, this.config, options || {});
			var options = this.options;
			
			$.extend({
				Growl: {
					Modes: {}
				},
				
				addGrowlModes: function( name, option ){
					var defaults = {
						style: {},
						effect: {},
						delay: 3000,
						close: {}
					};
					
					var options = $.extend( defaults, option );
					$.Growl.Modes[ name ] = options;
				}
			});
			
			/** add default Modes **/
			$.addGrowlModes('MusicVideo', {
				reset: {
					position: 'fixed',
					bottom: 0,
					left: 0,
					display: 'none',
					width: '100%',
					height: 0,
					backgroundColor: '#000'
				},
				effect: { height: 80, opacity: 1 },
				close: { height: 0, opacity: 0 }
			});
			
			$.addGrowlModes('Bezel', {
				reset: {
					position: 'absolute',
					top: $.browser.coordinates.center.y -75,
					left: $.browser.coordinates.center.x -75,
					width: 150,
					height: 150,
					backgroundColor: '#000',
					opacity: 0
				},
				effect: { opacity: 1 },
				close: { opacity: 0 },
				delay: 'hold'
			});
			
			var Mode = $.Growl.Modes[ this.options.mode ];
			
			/** Attach Mode Style **/
			el.css( Mode.reset );
			
			trigger.click(function(){
				
				el.css({ display: 'block' })
				 /** Attach Mode Effect **/
				.animate( Mode.effect );
				
				switch( Mode.delay ) {
					case 'hold':
						el.css('cursor', 'pointer');
						el.click(function(){
							$(this).animate( Mode.close , { complete: function(){ $(this).css( Mode.reset ).css('display', 'none'); } });
						});
						break;
					default:
						el.delay( Mode.delay );
						/** Attach Mode Close **/
						el.animate( Mode.close , { complete: function(){ $(this).css( Mode.reset ).css('display', 'none'); } });
				}
			});
		}
	});
	
	
	//$.dialog.popup('#popup');
	//$.dialog.close();
	$.extend({
		dialog: {
			config: {
				effect: true,
				overlay: true,
				duration: 1000,
				onStart: function(){},
				onComplete: function(){},
				onClose: function(){},
				zIndex: 9999
			},
			
			popup: function( el, options ){
				
				var el = $(el);
				if( !$('#' + el.attr('id') + '-wrapper').length ) {
					el.wrap('<div id="' + el.attr('id') + '-wrapper" />');
				}
				
				var wrapper = $('#' + el.attr('id') + '-wrapper');
				
				var options = $.extend({}, this.config, options || {});
				
				
				if( $.data(wrapper.get(0), 'dimension') == undefined ) {
					var dimension = this.getCoordinates( el );
					$.data(wrapper.get(0), 'dimension', dimension );
				} else {
					var dimension = $.data(wrapper.get(0), 'dimension');
				}
				
				
				//* popUpイベントを1度だけbind *//
				el.one({
					popUp: function(event, queue) {
						
						if( options.overlay ) {
							$.Overlay({
								duration: options.duration,
								zIndex: options.zIndex -1
							});
						}
						
						wrapper.css({
							position: 'absolute',
							display: 'block',
							top: $.browser.coordinates.center.y - Math.floor(dimension.y/2),
							left: $.browser.coordinates.center.x - Math.floor(dimension.x/2),
							zIndex: options.zIndex
						});
						
						el.css('display', 'block');
						
						// ! effect: true
						if( options.effect ) {
							wrapper.css({
								top: $.browser.coordinates.center.y,
								left: $.browser.coordinates.center.x,
								width: 0,
								height: 0
							})
							.animate({
								top: $.browser.coordinates.center.y - Math.floor(dimension.y/2),
								left: $.browser.coordinates.center.x - Math.floor(dimension.x/2),
								padding: 15,
								width: dimension.w,
								height: dimension.h
							}, { queue: true, duration: options.duration });
						}
						
						wrapper.animate({ opacity: 1 }, { 
							queue: true,
							duration: options.duration
						});
						
						wrapper.queue(function(){
							$.dialog.addCloseBtn( el );
						});

						wrapper.dequeue();
						
						//** onComplete **//
						var timer = setTimeout( function(){
							options.onComplete.call();
							clearTimeout( timer );
						}, options.duration);

						
					},
					
					popDown:function(event, triggerName) {
						
						options.onClose.call();
						
						if( options.effect ) {
							wrapper.animate({
								top: $.browser.coordinates.center.y,
								left: $.browser.coordinates.center.x,
								width: 0,
								height: 0
							}, { queue: true, duration: options.duration });
						}
						
						wrapper.animate({
							opacity: 0
						}, {
							queue: true,
							duration: options.duration,
							complete: function(){
								$(this).css({ 
									display: 'none',
									width: dimension.w,
									height: dimension.h
								});
								
							}
						});
						
						if( options.overlay ) {
						
							$.clearOverlay({ duration: options.duration });
						}
						
						wrapper.dequeue();
						
					}
				});
				
				el.trigger('popUp', false);
				
				//$.data(window, 'dialog', { o:el, option: options } );
				
				$(window).bind({
					scroll: function(){ $.dialog.move( wrapper ); },
					resize: function(){ $.dialog.move( wrapper ); }
				});
				
				return this;
			},
			
			move: function( el ){
				
				var dimension = this.getCoordinates( el );
				
				el.css({
					top: $.browser.coordinates.center.y - Math.floor(dimension.y/2),
					left: $.browser.coordinates.center.x - Math.floor(dimension.x/2)
				});
				
				if( $.browser.className == 'msie6' && $('#overlay').length ) {
					
					$('#overlay').css({
						height: $.browser.coordinates.height
					});
				}
				
			},
			addCloseBtn: function ( el ){

						$('<div>', {
							id: 'close',
							css: {
								position: 'absolute',
								top: 0,
								left: 0,
								display: 'block',
								width: 30,
								height: 30,
								cursor: 'pointer'
							},
							click: function(){
								$(this).remove();
								$.dialog.close( el );
							}
						}).addClass('close').appendTo( el );
			
			},
			close: function( el ){
				el.trigger('popDown', false);
			},
			
			/*===== private functions =====*/
			getCoordinates: function (el){
				
				var w = el.width();
				var h = el.height();
				
				var x = w + parseInt(el.css('padding-left')) + parseInt(el.css('padding-right'));
				var y = h + parseInt(el.css('padding-top')) + parseInt(el.css('padding-bottom'));
				
				//x += parseInt(el.css('margin-left')) + parseInt(el.css('margin-right'));
				//y += parseInt(el.css('margin-top')) + parseInt(el.css('margin-bottom'));
	
				x += parseInt(el.css('borderLeftWidth')) + parseInt(el.css('borderRightWidth'));
				y += parseInt(el.css('borderTopWidth')) + parseInt(el.css('borderBottomWidth'));
				
				return { x:x, y:y, w:w, h:h };
			}
			
		}
	});
	
	// PopUP Element
	$.fn.extend({
		popUp: function( options ){
		
			var el = $(this);
			
			var default_options = {
				zIndex: 9999,
				overlay: true
			};
			
			$.extend(default_options, options || {});
			
			var x = el.width() + parseInt(el.css('padding-left')) + parseInt(el.css('padding-right'));
			var y = el.height() + parseInt(el.css('padding-top')) + parseInt(el.css('padding-bottom'));
			
			//x += parseInt(el.css('margin-left')) + parseInt(el.css('margin-right'));
			//y += parseInt(el.css('margin-top')) + parseInt(el.css('margin-bottom'));

			x += parseInt(el.css('borderLeftWidth')) + parseInt(el.css('borderRightWidth'));
			y += parseInt(el.css('borderTopWidth')) + parseInt(el.css('borderBottomWidth'));
			
			el.css({
				position: 'absolute',
				display: 'block',
				top: $.browser.coordinates.center.y - Math.floor(y/2),
				left: $.browser.coordinates.center.x - Math.floor(x/2)
			})
			.animate({
				opacity: 1
			}, options.duration);
			;
			
			$.data(window, 'popUp', { o:el, option: options } );
			
			$(window).bind({
				scroll: function(){ $(el).move(); },
				resize: function(){ $(el).move(); }
			});
			
			return this;
		},
		move: function(){
			
			var el = $(this);

			var x = el.width() + parseInt(el.css('padding-left')) + parseInt(el.css('padding-right'));
			var y = el.height() + parseInt(el.css('padding-top')) + parseInt(el.css('padding-bottom'));
			
			//x += parseInt(el.css('margin-left')) + parseInt(el.css('margin-right'));
			//y += parseInt(el.css('margin-top')) + parseInt(el.css('margin-bottom'));

			x += parseInt(el.css('borderLeftWidth')) + parseInt(el.css('borderRightWidth'));
			y += parseInt(el.css('borderTopWidth')) + parseInt(el.css('borderBottomWidth'));
			
			el.css({
				top: $.browser.coordinates.center.y - Math.floor(y/2),
				left: $.browser.coordinates.center.x - Math.floor(x/2)
			});
			
		},
		close: function() {
			
			var el = $(this);
			el.animate({
				opacity: 0
			}, {
				duration: options.duration,
				complete: function(){
					$(this).css({ display: 'none' });
				}
			});
		}
	});
	
	/**========== !OVERRAY ==========**/
	$.extend({
		Overlay: function( option ){
			
			var config = {
				opacity: 0.5,
				zIndex: 9999,
				duration: 1000
			};

			var options = $.extend(config, option || {});
			
			var overlay = $('#overlay');
			
			if( ! overlay.length ) {
				var overlay = $('<div>', { id: 'overlay' }).appendTo($('body'));;
			}

			var css = {
					position: 'absolute',
					top: 0,
					left: 0,
					display: 'block',
					width: '100%',
					//height: ( $.browser.className == 'msie6' ) ? $.browser.coordinates.height : $.browser.coordinates.docHeight,
					height: $.browser.coordinates.docHeight,
					backgroundColor: '#000000',
					zIndex: options.zIndex,
					zoom: 1
			};

			if( options.duration <= 0 ) {
				css = $.extend( css, { opacity: options.opacity } );
			}
			
			overlay
				.css( css )
				.bind('clearOverlay', function(){

					if( options.duration > 0 ) {
						$(this).fadeOut( options.duration, function(){
							$(this).css( 'display', 'none' );
						});
						
					} else {
						$(this).hide();
					}

				});
				
			
			if( options.duration > 0 ) {
				
				overlay.css( 'opacity', 0 )
				.animate({ opacity: options.opacity }, { duration: options.duration });
			}	
				
				
		},
		
		clearOverlay: function(){
			if( $('#overlay').length ) {
				$('#overlay').trigger('clearOverlay');
			}
		}
	});


	/**========== !ZOOM ==========**/
	$.fn.extend({
		zoom: function(el, options){
			
		}
	});
	
})(jQuery);

$(document).ready( function(){
	$.Coordinates();
	$('body').addClass($.browser.className);
	
	$(window).bind({
		scroll: function(){ $.Coordinates() },
		resize: function(){ $.Coordinates() }
	});
	
	//console.log($('#content_ifrm').contents().find('body'));
	//console.log($('iframe#content_ifr')[0].contentWindow.selection);
/*
	
	$('iframe').contents().find('body').select(function(){
			d=window.getSelection();
			alert(d);

	});
*/
	
});
