var DynamicObject = function()
{
//privat
	var refresh = null;
	var staticShowFirs;
	var trackingType;
	var realtimeButton;
	var staticButton;
	var periodButton;
	var periodPanel;
	var calendarOne;
	var clockOne;
	var clockOneDisplay;
	var calendarTwo;
	var clockTwo;
	var clockTwoDisplay;
	var setPeriodButton;
	var map;
	var staticObjectsSelect;
	var dynamicObjectsSelect;
	
	var FormatTime = function(value)
	{
		return (value < 10 ? "0" + value : value);
	}

	var InitializeStaticObjectsSelect = function(coordinates)
	{
		var column = [
				{key: "name", label: "Select static objects", sortable: true}
			];
	
		var dataSource = new YAHOO.util.DataSource(coordinates);
		dataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
		dataSource.responseSchema = {
			fields: ["name", "id"]
		};
		
		staticObjectsSelect = new YAHOO.widget.DataTable(staticObjectsSelect, column, dataSource, {selectionMode: "single", scrollable: true, height: "217px", width: "100%"});
		staticObjectsSelect.subscribe("rowMouseoverEvent", staticObjectsSelect.onEventHighlightRow);
		staticObjectsSelect.subscribe("rowMouseoutEvent", staticObjectsSelect.onEventUnhighlightRow);
		staticObjectsSelect.subscribe("rowClickEvent", staticObjectsSelect.onEventSelectRow);
		staticObjectsSelect.subscribe("rowSelectEvent", ChangeStaticObject);
	}

	var InitializeDynamicObjectsSelect = function(users)
	{
		var column = [
				{key: "name", label: "Select dynamic objects", sortable: true}
			];
	
		var dataSource = new YAHOO.util.DataSource(users);
		dataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
		dataSource.responseSchema = {
			fields: ["name", "id"]
		};

		dynamicObjectsSelect = new YAHOO.widget.DataTable(dynamicObjectsSelect, column, dataSource, {selectionMode: "single", scrollable: true, height: "217px", width: "100%"});
		dynamicObjectsSelect.subscribe("rowMouseoverEvent", dynamicObjectsSelect.onEventHighlightRow);
		dynamicObjectsSelect.subscribe("rowMouseoutEvent", dynamicObjectsSelect.onEventUnhighlightRow);
		dynamicObjectsSelect.subscribe("rowClickEvent", dynamicObjectsSelect.onEventSelectRow);
		dynamicObjectsSelect.subscribe("rowSelectEvent", ChangeDynamicObject);
	}

	var InitializeCalendar = function()
	{
		var date = new Date();
		date = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear();
		calendarOne = new YAHOO.widget.Calendar("calendar", calendarOne,
			{
				selected: date
			});
		calendarOne.render();

		calendarTwo = new YAHOO.widget.Calendar("calendar", calendarTwo,
			{
				selected: date
			});
		calendarTwo.render();
	}

	var InitializeTimepicker = function()
	{
		var time = new Date();
		clockTwo = new TimePicker(clockTwo,
			{
				startTime:
					{
						hour: time.getHours(),
						minute: time.getMinutes()
					},
				ampmStyles:
					{
						"fontSize": "10pt",
						"fontWeight": "bold",
						"color": "#0000AA",
						"textDecoration": "none"
					},
				onChange: function(tp)
				{
					clockTwoDisplay.text(FormatTime(tp.time.hour) + ":" + FormatTime(tp.time.minute));
				}
			});
		clockTwoDisplay.text(FormatTime(time.getHours()) + ":" + FormatTime(time.getMinutes()));
		time = new Date(time.getTime() - 3600000);
		clockOne = new TimePicker(clockOne,
			{
				startTime:
					{
						hour: time.getHours(),
						minute: time.getMinutes()
					},
				ampmStyles:
					{
						"fontSize": "10pt",
						"fontWeight": "bold",
						"color": "#0000AA",
						"textDecoration": "none"
					},
				onChange: function(tp)
				{
					clockOneDisplay.text(FormatTime(tp.time.hour) + ":" + FormatTime(tp.time.minute));
				}
			});
		clockOneDisplay.text(FormatTime(time.getHours()) + ":" + FormatTime(time.getMinutes()));
	}

	var ChangeStaticObject = function(row)
	{
		map.ShowStaticObjectAtCenter(row.record.getData("id"));
	}

	var ChangeDynamicObject = function(row)
	{
		map.ShowDynamicObjectAtCenter(row.record.getData("id"));
	}

	var SetRealtime = function()
	{
		trackingType.text("realtime");
		map.SetTrackingType("realtime");
		HidePeriod();
		DynamicObject.SetRefresh();
	}

	var UpdateRealtime = function(response, status)
	{
		map.SetUsers(response.users);
		map.UpdateRealtimeDynamicObjects();
	}
	
	var SetPeriod = function()
	{
		var one = calendarOne.getSelectedDates()[0];
		one.setHours(clockOne.time.hour);
		one.setMinutes(clockOne.time.minute);
		var two = calendarTwo.getSelectedDates()[0];
		two.setHours(clockTwo.time.hour);
		two.setMinutes(clockTwo.time.minute);
		if (one < two)
		{
			DynamicObject.ClearRefresh();
			trackingType.text("period of time");
			map.SetTime(one, two);
			map.SetTrackingType("period");
		}
		else
			alert("First date " + one + " must be smaller then " + two);
		
	}

	var ShowPeriod = function()
	{
		jQuery("#staticObjectsPlace").css("display", "none");
		jQuery("#dynamicObjectsPlace").css("display", "block");
		staticButton.css("cursor", "pointer");

		periodButton.unbind("click", ShowPeriod);
		periodButton.css("cursor", "default");
		realtimeButton.click(SetRealtime);
		realtimeButton.css("cursor", "pointer");
		periodPanel.css("display", "block");
	}

	var HidePeriod = function()
	{
		jQuery("#staticObjectsPlace").css("display", "none");
		jQuery("#dynamicObjectsPlace").css("display", "block");
		staticButton.css("cursor", "pointer");
		
		realtimeButton.unbind("click", SetRealtime);
		realtimeButton.css("cursor", "default");
		periodButton.click(ShowPeriod);
		periodButton.css("cursor", "pointer");
		periodPanel.css("display", "none");
	}
	
	var ShowStatic = function()
	{
		jQuery("#dynamicObjectsPlace").css("display", "none");
		jQuery("#staticObjectsPlace").css("display", "block");
		realtimeButton.css("cursor", "pointer");
		realtimeButton.click(SetRealtime);
		periodButton.css("cursor", "pointer");
		periodButton.click(ShowPeriod);
		staticButton.css("cursor", "default");
		
		if (staticShowFirs)
		{
			staticShowFirs = false;
			StaticObject.Initialize();
		}
	}

//public
return {
	Initialize: function(response, status)
	{
		if (response.status == "OK")
		{
			staticShowFirs = true;
			trackingType = "#trackingType";
			realtimeButton = "#realtimeButton";
			staticButton = "#staticButton";
			periodButton = "#periodButton";
			periodPanel = "#periodPanel";
			calendarOne = "calendarOne";
			clockOne = "clockOne";
			clockOneDisplay = "#clockOneDisplay";
			calendarTwo = "calendarTwo";
			clockTwo = "clockTwo";
			clockTwoDisplay = "#clockTwoDisplay";
			setPeriodButton = "#setPeriodButton";
			map = "dynamicMap";
			staticObjectsSelect = "staticObjectsContainer";
			dynamicObjectsSelect = "dynamicObjectsContainer";
	
			jQuery("#mainTable").css({width: "100%", padding: "0 50px"})
			map = new Maps(map, 
			   {
				   users: response.users,
				   staticObjectCoordinates: response.statics,
				   trackingType: "realtime"
			   });
			DynamicObject.SetRefresh();
			map.ShowAllStaticObjects();
			
			StaticObject.SetStatics(response.statics);
	
			trackingType = jQuery(trackingType);
			realtimeButton = jQuery(realtimeButton);
			periodButton = jQuery(periodButton);
			staticButton = jQuery(staticButton);
			staticButton.click(ShowStatic);
			periodPanel = jQuery(periodPanel);
			clockOneDisplay = jQuery(clockOneDisplay);
			clockTwoDisplay = jQuery(clockTwoDisplay);
			setPeriodButton = jQuery(setPeriodButton);
			setPeriodButton.click(SetPeriod);
			HidePeriod();
			InitializeCalendar();
			InitializeTimepicker();
			InitializeStaticObjectsSelect(response.statics);
			InitializeDynamicObjectsSelect(response.users);
		}
		else
		{
			DynamicObject.ClearRefresh();
			jQuery("#Tracking").html("");
		}
	},
	
	SetRefresh: function()
	{
		refresh = window.setInterval(DynamicObject.RefreshRealtime, 20000);
	},
	
	ClearRefresh: function()
	{
		if (refresh != null)
			window.clearInterval(refresh)
		refresh = null;
	},

	RefreshRealtime: function()
	{
		jQuery.ajax(
			{
				type: "POST",
				url: "index.php",
				data: "AJAX=1&do=map&type=users",
				dataType: "json",
				success: UpdateRealtime
			});
	}
};
}();