function sml(){};

sml.settings = {
	color: 'white',
	position_x: 'auto',
	position_y: 'auto'
}

sml.init = function(){
	var body_classes = 'social-media-shadow';

	if( location.hash == '#social-dark' || sml.settings.color == 'dark' ) {
		body_classes = 'social-media-shadow-dark';
	}
	
	// browser die transparent png's beherrschen
	if ( ( jQuery.browser.msie && parseInt( jQuery.browser.version.substr( 0, 1 ), 10 ) >= 7 )
		|| ( jQuery.browser.mozilla && parseInt( jQuery.browser.version, 10 ) <= 1 && jQuery.browser.version.substr( 0, 3 ) != '1.9' )
		|| ( jQuery.browser.safari && parseInt( jQuery.browser.version, 10 ) <= 4 ) ) {

		body_classes = 'social-media-png';
	}
	// ie6
	else if ( jQuery.browser.msie && jQuery.browser.version.substr( 0, 1 ) == 6 ) {
		body_classes = 'social-media-none';
	}
	
	jQuery( 'html:first' ).addClass( document.compatMode == 'BackCompat' ? ' quirks' : ' noquirks' );
	
	sml.body = jQuery( 'body' ).addClass( body_classes );
	sml.layer = jQuery( sml.settings.layer, sml.body )
		.eq(0)
		.appendTo( sml.body )
		.end()
		.filter(':gt(0)')
		.remove()
		.end();
	sml.links = jQuery( 'div.social-media-source-icon a[rel="nofollow"]', sml.body )
		.unbind( 'click' )
		.bind( 'click', function(){
			sml.layer_load( this );
			return false;
		});
					
	jQuery( 'a.social-media-source-layer-close', sml.body )
		.unbind()
		.click(function(){
			sml.layer_hide();
			return false;
		});
}

sml.layer_load = function( link ) {
	link = jQuery( link );
	
	if( link.attr( 'rel' ) == 'nofollow' ) {
		jQuery( '#social-media-source-layer-box-content-sources', sml.layer ).load(
			link.attr( 'rev' ) || link.attr( 'href' ),
			function() {
				sml.layer_update( link )
			}
		)
	} else {
		sml.child_show_current( link );
		sml.layer_update( link )
	}
}

sml.layer_update = function( link ){
	var layer_offset = sml.layer.offset(),
		link_offset = link.offset(),
		layer_posY = 'top',
		layer_posX = 'left',
		left = 0,
		top = 0;
	
	if (!sml.link_area) {
		sml.link_area_init();
	}
	
	if ( link.hasClass( 'social-media-source-icon-active' ) ) {
		sml.layer_hide();
		return;
	}
	
	sml.links.removeClass( 'social-media-source-icon-active' );
	link.addClass( 'social-media-source-icon-active' );
	
	if ( jQuery.browser.msie ) {
		link
			.parent()
			.unbind()
			.mouseenter(function(){
				jQuery( this ).addClass('social-media-item-hover');
			})
			.mouseleave(function(){
				jQuery( this ).removeClass('social-media-item-hover');
			});
	}
	
	// left position ermitteln
	// wenn im be eine horizontale position ausgewaehlt ist, diese berechnen
	if ( sml.settings.position_x ) {
		switch( sml.settings.position_x ) {
			case 1:// right
				layer_posX = 'right';
				left = sml.link_area.right - sml.layer.innerWidth();
			break;
			
			case 2:// left
				layer_posX = 'left';
				left = sml.link_area.left - sml.layer.innerWidth();
			break;
		}
	}
	
	// wenn im be keine horizontale position ausgewaehlt wurde oder der berechnete wert ungueltig ist, position (erneut) berechnen
	if ( !left ) {
		left = sml.link_area.left - sml.layer.outerWidth();
		
		if ( left < 0 || sml.link_area.left < sml.layer.outerWidth() || sml.link_area.left < ( sml.body.width() / 2 ) ) {
			left = sml.link_area.right;
		}
		
		if ( left + sml.layer.outerWidth( true ) > sml.body.width() ) {
			left = sml.link_area.right - sml.layer.outerWidth( true );
		}
	}
	
	// ueberpruefen ob die berechnete position breiter als der body ist und ggf. korrigieren
	if ( left + sml.layer.outerWidth() > sml.body.width() ) {
		left = sml.body.width() - sml.layer.outerWidth();
	}
	
	if ( left < 0 ) {
		if ( sml.settings.position_y ) {
			left = sml.link_area.left;
		}
		else {
			left = sml.link_area.right;
		}
	}	

	// top position ermitteln
	// wenn im be eine vertikale position ausgewaehlt ist, diese berechnen
	if ( sml.settings.position_y ) {
		switch( sml.settings.position_y ) {
			case 1:// top
				top = sml.link_area.top - sml.layer.innerHeight();
			break;
			
			case 2:// bottom
				layer_posY = 'bottom';
				top = sml.link_area.bottom;
			break;
		}
	}
	
	// wenn im be keine vertikale position ausgewaehlt wurde oder der berechnete wert ungueltig ist, position (erneut) berechnen
	if ( !top ) {
		var half_height = sml.layer.outerHeight() / 2;
		top = sml.link_area.top - half_height;

		if ( top < 0 ) {
			layer_posY = 'bottom';
			top = sml.link_area.bottom;
		}

		if ( sml.settings.position_x == 0 && sml.link_area.top < half_height ) {
			layer_posY = 'bottom';
			top = sml.link_area.bottom;
		}
	}
	
	if ( top < 0 ) {
		top = 0;
	}
	
	// layer erstmalig einblenden
	if ( sml.layer.css( 'display' ) == 'none' ) {
		sml.layer
			.css({
				left: left,
				top: top,
				zIndex: 1500
			})
			.fadeIn();
	}
	// layer verschieben, wenn schon offen
	else {
		sml.layer.animate({left: left, top: top});
	}

	if ( jQuery.browser.msie ) {
		// der ie bekommt das resizen des layers beim aendern des inhaltes nicht von selbst mit, 
		// somit muessen wir beim neu-positionieren der unteren ecken nachhelfen..
		jQuery( '.social-media-source-layer-box-bottom-left', sml.layer ).hide().show()
		
		// sternchen fuer den ie6 per filter darstellen, steht das direkt im css, funktioniert es nicht
		if ( jQuery.browser.version.substring( 0, 1 ) == 6 ) {
			sml.layer
				.find( 'div.social-media-item-rating-stars' )
				.css({
					background: 'none',
					filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'/%28cms%29/module/static/customer/2/content/social_media/i/stars.png\', sizingMethod=\'scale\')'
				});
		}
	}
}

sml.layer_hide = function(){
	sml.layer.fadeOut();
	sml.links.removeClass( 'social-media-source-icon-active' );
}

/* die position von jedem einzelnen link auslesen und daraus einen bereich mit 10px "margin" generieren, der vom sml nicht ueberdeckt werden darf */
sml.link_area_init = function(){
	sml.link_area = { top: 0, right: 0, bottom: 0, left: 0 };
	
	sml.links.each(function(){
		var element = jQuery( this )
			element_offset = element.offset();
		
		if ( !sml.link_area.top || sml.link_area.top > element_offset.top ) {
			sml.link_area.top = element_offset.top - 10;
		}
		if ( !sml.link_area.right || sml.link_area.right < element_offset.left + element.outerWidth() ) {
			sml.link_area.right = element_offset.left + element.outerWidth() + 10;
		}
		if ( !sml.link_area.bottom || sml.link_area.bottom < element_offset.top + element.outerHeight() ) {
			sml.link_area.bottom = element_offset.top + element.outerHeight() + 10;
		}
		if ( !sml.link_area.left || sml.link_area.left > element_offset.left ) {
			sml.link_area.left = element_offset.left - 10;
		}
	});
}

sml.child_show_current = function( link ){
	sml.layer
		.find( '.social-media-source' )
		.hide()
		.eq( jQuery( 'div.social-media-source-icon a', sml.body ).index( link ) )
		.show();
}
	
jQuery(function(){
	window.setTimeout(function(){
		sml.init();
	}, 10 );
});
