var navigline = {
	container: '',
	menu: '',
	data: {},

	menu_display: false,
	menu_timeout: 300,
	menu_timer: null,

	setup: function() {
		this.data = window.navigline_data;
		var tmp = $('#navigline');
		if ( !tmp.size() ) {
			$('body').prepend('<div id="navigline"></div>');
		}
		this.container = $('#navigline');
		
		if ( typeof( this.data['menu'] ) != 'undefined' )
			this.setup_menu();

		this.display_weather();
	},

	setup_menu: function() {
		// header
		this.container.append('<ul class="menu"></ul>');
		this.menu = $('#navigline > ul.menu');
		for ( var i = 0; i < this.data['menu'].length; i++ ) {
			var is_folder = typeof( this.data['menu'][i]['url'] ) == 'undefined';
			this.menu.append('<li id="menu_item_' + i + '" class="menu_item'+ ( is_folder ? ' menu_folder' : '' ) +'">'+ this.menu_item( this.data['menu'][ i ] ) + '</li>');
			if ( is_folder && typeof( this.data['menu'][i]['items'] ) != 'undefined' ) {
				this.menu_block( '' + i, this.data['menu'][i]['items'], false );
			}

			(function(){
				var path = '' + i;
				var elem = $( '#menu_item_' + path );
				elem.bind( 'mouseover', function() {
					navigline.clear_timer();
					navigline.menu_display = true;

					folder = $( '#menu_folder_' + path );
					folder.css( 'visibility', 'visible' );
				} ).bind( 'mouseleave', function() {
					navigline.clear_timer();
					navigline.menu_display_timer = setTimeout( navigline.timer_event, navigline.menu_timeout );
				} );

			}) ();
			if ( is_folder ) {
				(function() {
					var path = '' + i
					var elem = $( '#menu_item_' + path );
					elem.bind( 'mouseover', function() {
						if ( navigline.menu_display ) {
							// hide all
							$('#navigline > ul.menu_folder').css( 'visibility', 'hidden' );
							// show current
							folder = $( '#menu_folder_' + path );
							folder.css( 'visibility', 'visible' );
						}
					} );
				})();
			}
		}

		$('#navigline > ul.menu_folder').bind( 'mouseover', function() {
			navigline.clear_timer();
		} ).bind( 'mouseleave', function() {
			if ( navigline.menu_display_timer ) {
				clearTimeout( navigline.menu_display_timer );
			}
			navigline.menu_display_timer = setTimeout( navigline.timer_event, navigline.menu_timeout );
		} );
	},

	menu_block: function( path, items, menu_parent ) {
		var folder_id = 'menu_folder_' + path;
		
		this.container.append('<ul id="' + folder_id + '" class="menu_folder"></ul>');
		var folder = $( '#' + folder_id );
		var subfolders = [];
		for ( var i = 0; i < items.length; i++ ) {
			var is_folder = typeof( items[i]['url'] ) == 'undefined';
			var id = 'menu_item_' + path + "_" + i;

			var style = 'style="';
			if ( typeof( items[i]['background'] ) != 'undefined' )
				style += 'background-color: ' + items[i]['background'] + ";";
			style += '"';

			folder.append( '<li id="' + id + '" class="menu_item ' + ( is_folder ? ' menu_folder' : '' ) + '" ' + style + ' >' + this.menu_item( items[i] ) + '</li>' );
			if ( typeof( items[i]['separator'] ) != 'undefined' ) {
				folder.append('<div class="separator"></div>');
			}
			if ( is_folder && typeof( items[i]['items'] ) != 'undefined' ) {
				subfolders.push( { path: path + '_' + i, items: items[i]['items'], menu_parent: folder_id } );
			}
		}

		var p_left = 0;
		var p_top = 0;
		if ( typeof($('#' + menu_parent).offset) != 'undefined' ) { // new jquery
			p_left = menu_parent ? $( '#' + menu_parent ).offset().left + 2 + $( '#' + menu_parent ).width() - 1 : $( '#menu_item_' + path ).offset().left + 2;
			p_top = menu_parent ? $( '#menu_item_' + path ).offset().top : 21;
		}
		else if ( typeof( $('#' + menu_parent).position ) != 'undefined' ) { // old jquery
			p_left = menu_parent ? $( '#' + menu_parent ).position().left + 2 + $( '#' + menu_parent ).width() - 1 : $( '#menu_item_' + path ).position().left + 2;
			p_top = menu_parent ? $( '#menu_item_' + path ).position().top : 21;
		}

		folder.css( 'left', p_left);
		folder.css( 'top', p_top );

		var subfolders_ids = [];
		for ( var i = 0; i < subfolders.length; i++ ) {
			this.menu_block( subfolders[i]['path'], subfolders[i]['items'], subfolders[i]['menu_parent'] );
			subfolders_ids.push( "#menu_folder_" + subfolders[i]['path'] );
		}

		$('#' + folder_id + " > li").bind('mouseenter', function(){
			for ( var i = 0; i < subfolders_ids.length; i++ ) {
				$( subfolders_ids[i] ).css('visibility', 'hidden');
			}
			var id = $(this).attr('id');
			id = id.replace('menu_item_', '');
			$('#menu_folder_'+id).css('visibility', 'visible');
		});
	},

	menu_item: function( obj ) {
		var img = '';

		var style = 'style="';
		if ( typeof( obj['fontcolor'] ) != 'undefined' )
			style += 'color: ' + obj['fontcolor'] + ";";
		style += '"';

		if ( typeof( obj['icon'] ) != 'undefined' ) {
			img = 'style="background-image: url(\''+obj['icon']+'\')"';
		}
		if ( typeof( obj['url'] ) == 'undefined' )
			return '<span ' + img + ' ' + style + ' >' + obj['label'] + "</span>";

		return '<a href="' + obj['url'] + '" ' + img + ' ' + style + ' >' + obj['label'] + '</a>';
	},

	timer_event: function() {
		if ( navigline.menu_display ) {
			$('#navigline > ul.menu_folder').css( 'visibility', 'hidden' );
			navigline.menu_display = false;
		}
	},
	clear_timer: function() {
		if ( navigline.menu_display_timer ) {
			clearTimeout( navigline.menu_display_timer );
			navigline.menu_display_timer = null;
		}
	},
	display_weather: function() {
	    var n = this;
	    $.getJSON('http://navigline.academ.org/w.php?callback=?', function(data, status){
		n.container.append('<div class="widget" id="weather"><a href="http://academ.info/weather" target="_blank"><img src="' + data.icon + '" height="16" align="absmiddle">' + data.temperature + '</a></div>');
		$('#navigline #weather').css({
		    border: '0px',
		    float: 'right',
		    marginRight: '20px',
		    paddingTop: '3px'
		});
		$('#navigline #weather a').css({
		    textDecoration:'none',
		    color:'#000'
		});
	    });
	}
};

function nv_dump( arr, level ) {
	var dumped_text = "";
	if( !level )
		level = 0;

	var level_padding = "";
	for ( var j = 0; j < level + 1; j++)
		level_padding += "    ";

	if ( typeof( arr ) == 'object' )
		for( var item in arr ) {
			var value = arr[ item ];

			if ( typeof( value ) == 'object' ) {
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += nv_dump( value, level + 1 );
			}
			else
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
		}
	else
		dumped_text = "===>" + arr + "<===(" + typeof( arr ) + ")";
	return dumped_text;
}

$(document).ready(function(){
	if ( typeof( window.navigline_data ) != 'undefined' ) {
		navigline.setup();
	}
});

