/*
 * vil - vioma information layer
 * 
 */
if (window.console && window.console.info) {
	console.info('vioma information layer');
	console.info('Version 0.6');
}

if (typeof vil_indexes == 'undefined') {
	var vil_indexes = 1005,
		vil_timer = {},
		vil_settings = {},
		vil_counter = 0,
		vil_defaults = {
			effect : 'fade',
			delay : 750,
			clickable : false,
			width : 350,
			posX : false,
			posY : false,
			table : false
		};

	jQuery.fn.extend({
		vil: function(settings) {
			var link = jQuery(this),
				identifier = vil_counter++,
				options = {},
				settings = settings || link.attr('rev');
	
			if (!link[0]) return;
	
			if (link.attr('rev')) {
				var parts = settings.split(';'),
					length = parts.length;
	
				for ( var j = 0; j < length; j++) {
					var cur = parts[j].split(':');
					
					cur[0] = cur[0].replace(/^\s+/, '').replace(/\s+$/, '');
					cur[1] = cur[1].replace(/^\s+/, '').replace(/\s+$/, '');
	
					options[cur[0]] = cur[1];
				}
			}
	
			vil_settings[identifier] = jQuery.extend(false, vil_defaults, options);
	
			if (!vil_settings[identifier].table) {
				var table = jQuery( 'table:first.vil_content:not(.vil_table)' );
				
				if ( table.size() == 0 ) {
					table = jQuery(this).siblings( 'table:first:not(.vil_table)')
				}
				
				table.attr('id', 'vil_element' + identifier + '_table');
				vil_settings[identifier].table = '#vil_element' + identifier + '_table';
			} else {
				var table = jQuery(vil_settings[identifier].table);
			}
	
			table
				.hide()
				.appendTo('body')
				.css({
					position : 'absolute',
					opacity : 0
				})
				.addClass('vil_table')
				.bind('mouseenter', function() {
					if (vil_timer[vil_settings[identifier].table .substring(1)]) {
						window.clearTimeout(vil_timer[jQuery(this).attr('id')]);
					}
				})
				.bind( 'mouseleave', function() {
					vil_timer[vil_settings[identifier].table.substring(1)] = window.setTimeout(
						function() {
							delete vil_timer[vil_settings[identifier].table.substring(1)];
	
							if (vil_settings[identifier].effekt == 'none') {
								table.css('display','none');
							} else {
								table.animate({ opacity : 0 }, { duration: 650, queue: false }, 'linear' );
									
								window.setTimeout(function(){
									table.css('z-index',-1);
								}, 650 );
							}
						},
						vil_settings[identifier].delay);
					});
	
			link
				.attr('vil_element', identifier)
				.unbind('click')
				.bind('click', function() {
					return vil_settings[identifier].clickable;
				})
				.bind( 'mouseenter', function(j) {
					var table = jQuery(vil_settings[identifier].table);
					
					jQuery(this).addClass('vil_link_hover');
					
					if (table.length == -1) return;
	
					if (vil_timer[table.attr('id')]) {
						window.clearTimeout(vil_timer[table.attr('id')]);
					}
					
					if (vil_settings[identifier].height) {
						table.height(vil_settings[identifier].height);
					}
	
					if (vil_settings[identifier].width) {
						table.width(vil_settings[identifier].width);
					}
	
					var offset = jQuery(this).offset(),
						left = offset.left + jQuery(this, j).width() + 10;
	
					if (!vil_settings[identifier].posY) {
						if (vil_settings[identifier].vert) {
						if (vil_settings[identifier].vert == 'top') {
							offset.top -= table.outerHeight();
						} else if (vil_settings[identifier].vert == 'bottom') {
							offset.top += parseInt( jQuery(this, j) .height(), 10);
						}
						} else if ((offset.top + table.outerHeight()) > parseInt( window.pageYOffset + window.innerHeight, 10)) {
							offset.top -= table.outerHeight();
						} else if (vil_settings[identifier].top) {
							offset.top += parseInt( vil_settings[identifier].top, 10);
						}
					} else {
						offset.top = vil_settings[identifier].posY;
					}
	
					if (!vil_settings[identifier].posX) {
						if (left + table.outerWidth(true) > jQuery( 'body').width()) {
							left = offset.left - table.outerWidth(true) - 10;
							
							if (vil_settings[identifier].horz && vil_settings[identifier].horz == 'left') {
								left += link.outerWidth();
							}
						} else {
							if (vil_settings[identifier].horz && vil_settings[identifier].horz == 'left') {
								left -= link.outerWidth();
							}
							if (vil_settings[identifier].left) {
								left += parseInt( vil_settings[identifier].left, 10);
							}
						}
					} else {
						left = vil_settings[identifier].posX;
					}
	
					offset_y = 20;
					offset_x = 20;
	
					// wenn die box über den unteren rand
					// gehen würde
					if (j.screenY + table.height() > $(
						window).height()) {
						offset_y = -table.height();
					}
	
					var top_value = j.pageY + offset_y;
					
					if (j.pageY + offset_y < $(window).scrollTop()) {
						top_value = $(window).scrollTop() + 10;
					}
	
					var left_value = j.pageX + offset_x;
					
					if (left_value + table.width() > $(window).width()) {
						left_value = j.pageX - offset_x - table.width()
					}
					if (left_value < 0) {
						left_value = 0
					}
	
					table.css({
						'top' : top_value + 'px',
						'left' : left_value + 'px',
						'z-index' : vil_indexes++
					})
	
					if (vil_settings[identifier].effect == 'none') {
						table.css({
							opacity : 1,
							display : 'block'
						});
					} else {
						table.css({
							opacity : 0,
							display : 'block'
						});
						table.animate({ opacity : 1 }, { duration: 150, queue: false });
					}
				})
				.bind('mouseleave',function(j) {
					var table = jQuery(vil_settings[identifier].table);
					jQuery(this).removeClass('vil_link_hover');
					
					vil_timer[table.attr('id')] = window.setTimeout(function() {
						delete vil_timer[table.attr('id')];
	
						if (vil_settings[identifier].effect == 'none') {
							table.css( 'display', 'none' );
						} else {
							table.animate({ opacity : 0 }, { duration: 650, queue: false }, 'linear' );
	
							window.setTimeout(function(){
								table.css('z-index',-1);
							}, 650 );
						}
					},
					vil_settings[identifier].delay);
				});
		}
	});
}

jQuery(function() {
	jQuery('.vil_link').each(function() {
		jQuery(this).vil();
	});
});

