var dHelp = function()
{
	this.time = new Array ;
	
	
	this.buffer_check =
	{
		'on_screen': {},
		'will_remove': {},
		'will_download': {}
	} ;
	
	
	
	this.buffer_mon_vars =
	{
		out: "",
		showed_block: ""
	} ;
	
	/**
	 * buffer monitoring	
	 **/
	this.buffer_monitoring = function ()
	{
		var out = "" ;
		
		out +=
			"<b>current<br />&nbsp;&nbsp;&nbsp;&nbsp;block:</b> " + 
			dTimeline.current.block +
			", <b>line:</b> " + dTimeline.current.line + 
			"<br />" ;  

		out +=
			"&nbsp;&nbsp;&nbsp;&nbsp;<b>output:</b> " +
			dTimeline.current.show.blocks[0] + ", " + dTimeline.current.show.lines[1] +
			" -- " + 
			dTimeline.current.show.blocks[1] + ", " + dTimeline.current.show.lines[0] +
			"<br />" ;

		out +=
			"<b>check</b><br />" +
			"&nbsp;&nbsp;&nbsp;&nbsp;<b>blocks:</b> " +
			dBuffer.checks.ranges[1].blocks[0] + ", " + dBuffer.checks.ranges[1].blocks[1] +
			", <b>lines:</b> " +
			dBuffer.checks.ranges[1].lines[0] + ", " + dBuffer.checks.ranges[1].lines[1] +
			"<br />" ;


		out += "<hr />" ;

		if ( out != this.buffer_mon_vars.out )
		{
			out += this.buffer_monitoring_showed() ;

			out += "<hr />" ;
			
//			if ( dTimeline.current.block == -8 && dTimeline.current.line == 0 )
//				out += this.buffer_monitoring_block_test () ;
			
			document.getElementById("temp1").innerHTML = out  ;
			this.buffer_mon_vars.out = out ;
		} ;
		
	} ;
	
	
	/**
	 * 
	 *
	 * @param	Object		v:
	 * 					
	 * 
	 * @return	
	 **/
	this.buffer_monitoring_block_test = function ( v )
	{
		var out = "**: " ;
		
		out += "<b>block_id:</b> " + dTimeline.current.block_ids[dTimeline.current.block].str + "<br \>";
		out +=
			"<b>id:<\b> " + 
			dHelp.view
			(
				dBuffer.blocks[0][dTimeline.current.block_ids[dTimeline.current.block].str ]
			) +
			"<br \>" ;
		
		return out ;
	} ;
	
	
	/**
	 * buffer monitoring showed
	 * @return 		String
	 **/
	this.buffer_monitoring_showed = function ()
	{
		var out = "<b>showed</b>" ;
		
		var showed_block = dTimeline.current.show.blocks.toString()+"_"+dTimeline.current.show.lines.toString() ;
		
		if ( showed_block != this.buffer_mon_vars.showed_block )
		{
			var missed_txt = "" ;
			for ( var block = dTimeline.current.show.blocks[0]; block <= dTimeline.current.show.blocks[1]; block++ )
				for ( var line = dTimeline.current.show.lines[0]; line <= dTimeline.current.show.lines[1]; line++ )
					if ( dTimeline.current.block_scr[block+"_"+line] != 1 )
						missed_txt += block+"_"+line + ", " ;
			missed_txt = missed_txt.substrn(0,-2) ;
			
			odd_txt = "" ;
			for ( var i in dTimeline.current.block_scr )
			{
				i = i.num_split();
				if
				(
					i[0] < dTimeline.current.show.blocks[0] ||
					i[0] > dTimeline.current.show.blocks[1] ||
					i[1] < dTimeline.current.show.lines[0] ||
					i[1] > dTimeline.current.show.lines[1]
				)
					odd_txt += i.join("_") + ", " ;
			} ;
			odd_txt = odd_txt.substrn(0,-2);
			
			if ( missed_txt != "" || odd_txt != "" )
			{
				out += "<br />&nbsp;&nbsp;&nbsp;&nbsp;" ;
				if ( missed_txt != "" )
					out += "<b>missing:</b> " + missed_txt + ", ";
				if ( odd_txt != "" )
					out += "<b>odd:</b> " + odd_txt ;
				else
					out = out.substrn(0,-2);
			}
			else 			
				out += ": OK" ;

			out += "<br />" ;
		} ;
		
		return out ;
	} ;
	
	
//	http://xoumer/?&action=first&query=0-2:-2,1;
//	http://xoumer/?&action=query&query=5_0_728187_43200_1+0-7:-6,6;
	/**
	 * out grids
	 **/
	this.out_grids = function ()
	{
		var grids = "" ;
		var bg = "" ;
		
		//hor
		for ( var i=-10; i <= 10; i++ )
		{
			bg = ( i == 0 ) ? "background:#f00;" : "" ;
			grids += "<div class=\"temp_vert\" style=\"left: "+ ( zoom_data.bl_w * i ) +"px;"+bg+"\"></div>" ;
		};
		
		//vert
		for ( var i=1; i <= 20; i++ )
		{
			grids += "<div class=\"temp_hor\" style=\"top: "+ ( - zoom_data.bl_h * i ) +"px;"+bg+"\"></div>" ;
		};
		
		
		$("#grids").html(  grids );
		
	} ;
	
	
	//-------------------------------------
	// tests
	//-------------------------------------
	
	
	
		////////////////////////////////		
//		// -1 second = 29.01.2008 23:59:50
//		var date = dScale.date_parser( "01.03.2008 00:00:00" ) ;
//		var deep = "second" ;
//		var offset = -1 ;
//		var out = dScale.get_next_date ( deep, offset, date ) ;
//		$("#temp1")[0].innerHTML =
//			dScale.date_format ( date ) + "<br />" +
//			"<hr />" +
//			"<b>deep:</b> " + deep + "<br />" +
//			"<b>offset:</b> " + offset + "<br />" +
//			"<hr />" +
//			dScale.date_format ( out ) + "<br />" +
//			"" ;
//		$("#temp3")[0].innerHTML = dHelp.test_dScale_get_next_date () ;
		////////////////////////////////


	/**
	 * test_func_mod
	 **/
	this.test_func_mod = function ()
	{
		var out = "" ;
		
		var d = 3 ;
		
		for ( var i=-20; i <= 20; i++ )
		{
			out += i + " % " + d + " = " + dMain.mod ( i, d ) + "<br />";
		} ;
		
		$("#temp3")[0].innerHTML = out ;
		
	} ;
	
	
	//====   test   dScale.get_next_date
	
	/**
	 * 
	 *
	 * @param	Object		v:
	 * 					
	 * 
	 * @return	
	 **/
	this.test_dScale_get_next_date = function ()
	{
		var test =
		{
			'leap year' :
			[
				"29.02.2008 23:59:50", "+1 second",
				"01.03.2008 00:00:00",
				"29.02.2008 23:55:00", "+1 minute",
				"01.03.2008 00:00:00",
				"29.02.2008 22:00:00", "+1 hour",
				"01.03.2008 00:00:00",
				"29.02.2008 00:00:00", "+1 day",
				"01.03.2008 00:00:00",
				"29.02.2008 00:00:00", "+1 month",
				"29.03.2008 00:00:00",

				"01.03.2008 00:00:00", "-1 second",
				"29.02.2008 23:59:50",
				"01.03.2008 00:00:00", "-1 minute",
				"29.02.2008 23:55:00",
				"01.03.2008 00:00:00", "-1 hour",
				"29.02.2008 22:00:00",
				"01.03.2008 00:00:00", "-1 day",
				"29.02.2008 00:00:00",
				"01.03.2008 00:00:00", "-1 month",
			 	"01.02.2008 00:00:00",

				"28.02.2008 22:00:00", "+1 hour",
				"29.02.2008 00:00:00",

				"29.02.2008 20:00:00", "+1 hour",
				"29.02.2008 22:00:00"
			],

			'non leap year' :
			[
				"28.02.2007 23:59:50", "+1 second",
				"01.03.2007 00:00:00",
				"28.02.2007 23:55:00", "+1 minute",
				"01.03.2007 00:00:00",
				"28.02.2007 22:00:00", "+1 hour",
				"01.03.2007 00:00:00",
				"28.02.2007 00:00:00", "+1 day",
				"01.03.2007 00:00:00",
				"28.02.2007 00:00:00", "+1 month",
				"28.03.2007 00:00:00",

				"01.03.2007 00:00:00", "-1 second",
				"28.02.2007 23:59:50",
				"01.03.2007 00:00:00", "-1 minute",
				"28.02.2007 23:55:00",
				"01.03.2007 00:00:00", "-1 hour",
				"28.02.2007 22:00:00",
				"01.03.2007 00:00:00", "-1 day",
				"28.02.2007 00:00:00",
				"01.03.2007 00:00:00", "-1 month",
				"01.02.2007 00:00:00",

				"29.02.2007 20:00:00", "+1 hour",
				"29.02.2007 22:00:00"
			],
			
			'new year' :
			[
				"31.12.2007 23:59:50", "+1 second",
				"01.01.2008 00:00:00",
				"31.12.2007 23:55:00", "+1 minute",
				"01.01.2008 00:00:00",
				"31.12.2007 23:00:00", "+1 hour",
				"01.01.2008 00:00:00",
				"31.12.2007 00:00:00", "+1 day",
				"01.01.2008 00:00:00",
				"05.12.2007 00:00:00", "+1 month",
				"05.01.2008 00:00:00",

				"01.01.2008 00:00:00", "-1 second",
				"31.12.2007 23:59:50",
				"01.01.2008 00:00:00", "-1 minute",
				"31.12.2007 23:55:00",
				"01.01.2008 00:00:00", "-1 hour",
				"31.12.2007 22:00:00",
				"01.01.2008 00:00:00", "-1 day",
				"31.12.2007 00:00:00",
				"03.01.2008 00:00:00", "-1 month",
				"03.12.2007 00:00:00",

				"31.12.2007 23:59:40", "+1 second",
				"31.12.2007 23:59:50"
			],	
			
			
			'new month' :
			[
				"30.06.2007 23:59:50", "+1 second",
				"01.07.2007 00:00:00",
				"30.06.2007 23:55:00", "+1 minute",
				"01.07.2007 00:00:00",
				"30.06.2007 22:00:00", "+1 hour",
				"01.07.2007 00:00:00",
				"30.06.2007 00:00:00", "+1 day",
				"01.07.2007 00:00:00",

				"01.11.2007 00:00:00", "-1 second",
				"31.10.2007 23:59:50",
				"01.11.2007 00:00:00", "-1 minute",
				"31.10.2007 23:55:00",
				"01.11.2007 00:00:00", "-1 hour",
				"31.10.2007 22:00:00",
				"01.11.2007 00:00:00", "-1 day",
				"31.10.2007 00:00:00",

				"08.04.2007 20:00:00", "+1 hour",
				"08.04.2007 22:00:00"
			],
			
			'new day' :
			[
				
			],
			
			'new hour' :
			[
				
			],

			'new minute' :
			[
				
			],
			
			//*******************************************************
			'negative' :
			//*******************************************************
			[
				"-31.12.1 23:59:50", "+1 second",
				"01.01.0 00:00:00",

				"01.01.0 00:00:00", "-1 second",
				"-31.12.1 23:59:50",

				"-29.02.16 22:00:00", "+1 hour",
				"-01.03.16 00:00:00",
				
				"-01.03.2008 00:00:00", "-1 minute",
				"-29.02.2008 23:55:00",
				
				"-01.03.2008 00:00:00", "-1 day",
				"-29.02.2008 00:00:00",

				///-------------------

				"-31.12.2007 23:00:00", "+1 hour",
				"-01.01.2006 00:00:00",

				"-03.01.2008 00:00:00", "-1 month",
				"-03.12.2009 00:00:00",

				///-------------------

				"-30.06.2007 23:59:50", "+1 second",
				"-01.07.2007 00:00:00",

				"-01.11.2007 00:00:00", "-1 day",
				"-31.10.2007 00:00:00"
			]
			
		} ;
		
		
		//========================
		//========================
		
		var out = "" ;
		
		var i = 0 ;
		var t = [] ;
		var date = new Object ;
		var deep = "" ;
		var offset = 1 ;
		var done ;
		
		var part ;
		for ( part in test )
		{
			count = test[part].length ;
			
			out += "<hr /><b>" + part + ":</b><br />" ; 	
			t = [] ;
			i = 0 ;
			while ( i < count )
			{
				t[0] = test[part][i] ; i++ ;		
				t[1] = test[part][i] ; i++ ;	
				t[2] = test[part][i] ; i++ ;
				
				date = dScale.date_parser( t[0] ) ;
				deep = t[1].split(" ") ;
				offset = Number ( deep[0] ) ;
				deep = deep[1] ;
				date = dScale.date_format ( dScale.get_next_date ( deep, offset, date ) ) ;
				if ( date != t[2] )
					out +=
						"<b>" + (i-3) + ":</b> " +
						t[0] + " " + t[1] + " = " + date +
						"<br />" ; 				
			}
			
		}
		
		out += "<hr />" ;
		
		return out ;
	} ;	
		
	
	
	//====================================================
	
	/**
	 * view Object as HTML 
	 *
	 * @param	Object		o:
	 * @param	Number		level: level of enclosure view (default=2)
	 * 
	 * @return	String		out: formatted view of Object as HTML
	 **/
	this.view = function ( o, level, cur_level )
	{	
		if ( typeof ( o ) != "object" )
			return o ;
 
		if ( level == undefined )
			level = 2 ;
		if ( cur_level == undefined )
			cur_level = 0 ;
		
		var out = "" ;
		
		var var_str ;
		var tab_str ;
		
		for ( var i in o )
		{
			if ( typeof ( o[i] ) == "object" && level > cur_level )
				var_str = "<br />" + this.view ( o[i], level, cur_level + 1 ) ;
			else
				var_str = o[i] ;
			tab_str = "&nbsp;&nbsp;&nbsp;&nbsp;".repeat ( cur_level ) ;
			
			if ( this.type ( var_str ) == "array" )
				var_str = "[ " + var_str + " ]" ;
			
			out += tab_str + "<b>" + i + "</b>: " + var_str + "<br />" ;
		}
		out = out.substrn(0,-6);
		
		return out ;
	};


	this.view_o = function ( o )
	{
		var out = "" ;
		for ( var i in o )
			out += "<b>" + i + "</b>:" + o[i] + "<br>" ;
		out = out.substrn(0,-4);
		return out ;
	};


	/**
	 * get "right" type of Object 
	 *
	 * @param	Object		o: 
	 * 
	 * @return	String		t: type of Object (for "right" array type)
	 **/
	this.type = function ( o )
	{
		var t = typeof( o ) ;
//		if ( o )
//		if ( t == "object" && o.constructor.toString().indexOf("Array") > 0 )
//			t = "array" ;
		return t ;
	};


	this.pr = function ( o, f, tabplus )
	{
		var out = "" ; var s = ["",""] ; var oo = "" ;
	
		var br = "<br />" ;
		var tab = "&nbsp;&nbsp;&nbsp;&nbsp;" ;
		
		if ( tabplus == undefined )
			tabplus = "" ;
	
		if ( this.type ( o ) == "object" )
			s = ["{","}"] ;
		else  if ( this.type ( o ) == "array" )
			s = ["[","]"] ;
	
		for ( var i in o )	
		{
			if ( this.type ( o[i] ) == "object" || this.type ( o[i] ) == "array" )
				oo = this.pr ( o[i], f, tabplus + tab ) ;
			else 
				oo = o[i] ;
			out += tabplus + tab + "<b>" + i + "</b>: " + oo + ", " + br ;
		} ;
		
		out = out.substr ( o, out.length - 2 - br.length )  ;
		
		if ( out.length < 400 )
		{
			var re = new RegExp("("+tab+"|"+br+")","g");
			out = s[0] + out.replace(re,"") + s[1] ;
		}
		else 
			out = br + tabplus + s[0] + br + out + tabplus + s[1] ;
	
		return out ;
	};
	
	this.out_all_vars = function ()
	{
	 	var out = "" ;	 	
//	 	
//	 	out += 
//	 		"<b>ширина окна (<span class='kl001'>dMain.w_width</span>):</b> " + dMain.w_width + "<br />" +
//		 	"<b>dTimeline.current_scroll:</b> " + dTimeline.current_scroll + "<br />" +
//		 	"<b>курсор скролллера (<span class='kl001'>#scale_c.left</span>)</b>: " + $("#scale_c").css("left") + "<br />" +
//		 	"<b>sc2: (<span class='kl001'>#tl_points.width</span>):</b> " + $("#tl_points").css("width") + "<br />" +
//		 	"<b>координаты timline (<span class='kl001'>#timeline.left</span>):</b> " + $("#timeline").css("left") + "<br />" +
//		 	"==========<br />" +
//		 	"<b>#timeline.left + dMain.w_width</b> = " + ( - Number ( $("#timeline").css("left").substrn(0,-2) ) + dMain.w_width ) + "<br />" +
//		 	"==========<br />" +
//			"-------------<br /><b style='color:#248BB5;'>dMain.help_vars</b>:<br />" +
// 			dHelp.view_o ( dMain.help_vars ) + "<br />" +
// 			"-------------<br />" +
////		 	"<b>duration</b>: " + zoom_data.periods[dMain.server_data.zoom].dur + "<br />" +
////		 	"<b>dur_width</b>: " + dBlocks.getX ({ t: zoom_data.periods[dMain.server_data.zoom].dur, z: dMain.server_data.zoom }) + "<br />" +
// 			
// 			
// 			"";
//	 	
	 	
	 	return out ;
	};


//	this.pr = function ( o, f )
//	{
//		var out = "" ; var s = ["",""] ; var oo = "" ;
//	
//		if ( this.type ( o ) == "object" )
//			s = ["{","}"] ;
//		else  if ( this.type ( o ) == "array" )
//			s = ["[","]"] ;
//	
//		for ( var i in o )	
//		{
//			if ( this.type ( o[i] ) == "object" || this.type ( o[i] ) == "array" )
//				oo = this.pr ( o[i] ) ;
//			else 
//				oo = o[i] ;
//			out += "<b>" + i + "</b>:" + oo + "," ;
//		}
//		
//		out = s[0] + out.substr ( 0, out.length - 1 ) + s[1] ;
//	
//		return out ;
//	}

	this.view_events = function ( ev )
	{
		var out = "" ;
		for ( var i=0; i < ev.length; i++ )
			out += "id: " + ev[i].id + "\n" ;
		return out ;
	};
};

dHelp = new dHelp ;
