	/***************************************************************************
	 *
	 *
	 *
	 **************************************************************************/
	
	function makeHTMLElement ( type, attributes )
	{
		var htmlElement = document.createElement ( type );
		for ( var a in attributes )
			htmlElement.setAttribute ( a, attributes [ a ] );
		return htmlElement;
	}
	
	
	function Calendar ()
	{
		
		this.calendarWindow;
		
		this.requestInputId;
		this.dDate = new Date ();
        this.dCurMonth = this.dDate.getMonth ();
        this.dCurDayOfMonth = this.dDate.getDate ();
        this.dCurYear = this.dDate.getFullYear ();
        this.objPrevElement = new Object ();
		
		this.init = function ( requestInputId )
		{
			this.requestInputId = requestInputId;
		};
		
		
		this.fToggleColor = function ( myElement )
		{
			var toggleColor = '#ff0000';
			if ( myElement.id == 'calDateText' )
			{
				if ( myElement.color == toggleColor )
					myElement.color = '';
				else
					myElement.color = toggleColor;
			}
			else
				if ( myElement.id == 'calCell' )
				{
					for ( var i in myElement.childNodes )
					{
						if ( myElement.childNodes [ i ].id == 'calDateText' )
						{
							if ( myElement.childNodes [ i ].color == toggleColor )
								myElement.childNodes [ i ].color = '';
							else
								myElement.childNodes [ i ].color = toggleColor;
						}
					}
				}
		};
		
		
		this.setCalSelectedDate = function ( selDay )
		{
			var calSelectedDate = document.getElementById ( 'calSelectedDate' );
			
			if ( selDay && selDay.length < 2 ) selDay = '0' + selDay;
			
			var month = document.getElementById ( 'calSelectedMonth' );
			var selMonth = month.options [ month.selectedIndex ].value;
			if ( selMonth.length < 2 ) selMonth = '0' + selMonth;
			
			var year = document.getElementById ( 'calSelectedYear' );
			var selYear = year.options [ year.selectedIndex ].value;
			
			calSelectedDate.value = selYear + '-' + selMonth + '-' + selDay;
		}
		
		
		this.fSetSelectedDay = function ( myElement )
		{
			if ( myElement.id == 'calCell' )
			{
				//alert ( this.objPrevElement ); //myElement.firstChild.innerHTML );
				if ( !isNaN ( parseInt ( myElement.firstChild.innerHTML ) ) ) // .children [ "calDateText" ]
				{
					myElement.bgColor = '#c0c0c0';
			        if ( this.objPrevElement )
						this.objPrevElement.bgColor = '';
					
					this.setCalSelectedDate ( myElement.firstChild.innerHTML );
					
					/*var calSelectedDate = document.getElementById ( 'calSelectedDate' );
					
					var selDay = myElement.firstChild.innerHTML;
					if ( selDay.length < 2 ) selDay = '0' + selDay;
					
					var month = document.getElementById ( 'calSelectedMonth' );
					var selMonth = month.options [ month.selectedIndex ].value;
					if ( selMonth.length < 2 ) selMonth = '0' + selMonth;
					
					var year = document.getElementById ( 'calSelectedYear' );
					var selYear = year.options [ year.selectedIndex ].value;
					
					calSelectedDate.value = selYear + '-' + selMonth + '-' + selDay;
					*/
					
					//document.all.calSelectedDate.value = parseInt ( myElement.innerHTML ); // .children [ "calDateText" ]
					this.objPrevElement = myElement;
		        }
			}
        };
		
		
		this.fGetDaysInMonth = function ( iMonth, iYear )
		{
			var dPrevDate = new Date ( iYear, iMonth, 0 );
			return dPrevDate.getDate ();
        };
		
		
		this.fBuildCal = function ( iYear, iMonth )
		{
			var aMonth = new Array ();
			for ( var a = 0; a < 7; a++ )
				aMonth [ a ] = new Array(7);
			
			var dCalDate = new Date (iYear, iMonth-1, 1 );
			var iDayOfFirst = dCalDate.getDay ();
			var iDaysInMonth = this.fGetDaysInMonth ( iMonth, iYear );
			var iVarDate = 1;
	        var i, d, w;
			
			aMonth [ 0 ][ 0 ] = "Вск";
			aMonth [ 0 ][ 1 ] = "Пнд";
			aMonth [ 0 ][ 2 ] = "Втр";
			aMonth [ 0 ][ 3 ] = "Срд";
			aMonth [ 0 ][ 4 ] = "Чтв";
			aMonth [ 0 ][ 5 ] = "Птн";
			aMonth [ 0 ][ 6 ] = "Сбт";
			
			for ( d = iDayOfFirst; d < 7; d++ )
			{
				aMonth [ 1 ][ d ] = iVarDate;
				iVarDate++;
			}
			
			for ( w = 2; w < 7; w++ )
			{
				for ( d = 0; d < 7; d++ )
				{
					if ( iVarDate <= iDaysInMonth )
					{
						aMonth [ w ][ d ] = iVarDate;
						iVarDate++;
			        }
				}
	        }
			
			return aMonth;
        };
		
		
		this.fDrawCal = function ( iYear, iMonth, iCellWidth, iCellHeight, sDateTextSize, sDateTextWeight )
		{
			
			
			var myMonth;
			myMonth = this.fBuildCal ( iYear, iMonth );
			
			var cTable;
			//var cTable = makeHTMLElement ( 'table', { class: 'calendar', border: '0', cellpadding: '0', cellspacing: '0' } );
			
			//document.write ( '<table class="calendar" border="0" cellpadding="0" cellspacing="0">' );
			//document.write ( '<tr>' );
			
			/*var tr = makeHTMLElement ( 'tr' );
			
			for ( var a = 0; a < 7; a++ )
			{
				var td = makeHTMLElement ( 'td', { align: 'center', style: 'width: ' + iCellWidth + '; height: ' + iCellHeight + '; background-color: #d8d8d8; font-family: Arial; font-size: 12px; font-weight: bold' } );
				td.appendChild ( document.createTextNode ( myMonth [ 0 ][ a ] ) );
				//document.write ( '<td align="center" style="font-family: Arial; font-size: 12px; font-weight: bold">' +
				//	myMonth [ 0 ][ a ] + '</td>' );
				tr.appendChild ( td );
			}
			//document.write ( '</tr>' );
			
			cTable.appendChild ( tr );
			
			for ( w = 1; w < 7; w++ )
			{
				//document.write ( '<tr>' );
				tr = makeHTMLElement ( 'tr' );
				
				for ( d = 0; d < 7; d++ )
				{
					//document.write ( '<td align="left" valign="top" width="' + iCellWidth + '" height="' + iCellHeight +
					//	'" id="calCell" style="cursor: pointer" onMouseOver="fToggleColor(this)" onMouseOut="fToggleColor(this)"' +
					//	' onclick="fSetSelectedDay(this)">' );
					
					var p = {
						align: 'left',
						valign: 'top',
						width: iCellWidth,
						height: iCellHeight,
						id: 'calCell',
						style: 'cursor: pointer',
						onMouseOver: 'fToggleColor ( this );',
						onMouseOut: 'fToggleColor ( this );',
						onClick: 'fSetSelectedDay ( this );'
					};
					
					var td = makeHTMLElement ( 'td', p );
					
					var font = makeHTMLElement ( 'font', { name: 'calDateText', onMouseOver: 'fToggleColor ( this );',
						style: 'cursor: pointer; font-family: Arial; font-size: ' + sDateTextSize + '; font-weight: ' + sDateTextWeight,
						onMouseOut: 'fToggleColor ( this );', onClick: 'fSetSelectedDay ( this );' } );
					
					if ( !isNaN ( myMonth [ w ][ d ] ) )
					{
						//document.write ( '<font name="calDateText" onMouseOver="fToggleColor(this)" style="cursor: pointer; font-family: Arial; font-size:' +
							//sDateTextSize + '; font-weight:' + sDateTextWeight + '" onMouseOut="fToggleColor(this)" onclick="fSetSelectedDay(this)">' + myMonth [ w ][ d ] + '</font>' );
						
						font.appendChild ( document.createTextNode ( myMonth [ w ][ d ] ) );
						
					}
					else
					{
						var div = document.createElement ( 'div' );
						div.innerHTML = '&nbsp;';
						font.appendChild ( div );
					}
					//else
					//{
						//document.write ( '<font name="calDateText" onMouseOver="fToggleColor(this)" style="cursor: pointer; font-family: Arial; font-size: ' +
						//	sDateTextSize + '; font-weight: ' + sDateTextWeight + '" onMouseOut="fToggleColor(this)" onclick="fSetSelectedDay(this)"></font>' );
						
					//}
					//document.write ( '</td>' );
					td.appendChild ( font );
					
					tr.appendChild ( td );
				}
				//document.write ( '</tr>' );
				
				cTable.appendChild ( tr );
			}
			//document.write ( '</table>' );
			*/
			return ( cTable );
        };
		
		
		this.fUpdateCal = function ( iYear, iMonth )
		{
			myMonth = this.fBuildCal ( iYear, iMonth );
			
			this.objPrevElement.bgColor = "";
			
			calSelectedDate = document.getElementById ( 'calSelectedDate' );
			calSelectedDate.value = "";
			
			calDateText = document.getElementsByName ( 'calDateText' );
			
			for ( w = 1; w < 7; w++ )
			{
				for ( d = 0; d < 7; d++ )
				{
					if ( !isNaN ( myMonth [ w ][ d ] ) )
						calDateText [ ( ( 7 * w ) + d ) - 7 ].innerHTML = myMonth [ w ][ d ];
					else
						calDateText [ ( ( 7 * w ) + d ) - 7 ].innerHTML = " ";
				}
			}
        };
		
		
		this.displayDialog = function ( shadowType )
		{
			
			self.calendarWindow = $.jWin.create ( {
				alwaysCentered: true,
				autoShow: false,
				modal: true,
				overlayOpacity: shadowType,
				overlayColor: '#000',
				title: '<strong>Заголовок</strong>',
				handleEscape: true,
				width: 240,
				height: 270
			} );
			
			var dCurDate = new Date ();
			//var calDesktop = this.fDrawCal ( dCurDate.getFullYear (), dCurDate.getMonth () + 1, 30, 30, '12px', 'bold', 1 );
			
			var selMonth = makeHTMLElement ( 'select', { id: 'calSelectedMonth', name: 'tbSelMonth',
				onchange: 'fUpdateCal ();' } );
			var a = new Array ( 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' );
			for ( var b = 0; b < 12; b++ )
			{
				var p = { value: parseInt ( b ) + 1 };
				if ( this.dCurMonth == b ) p [ 'selected' ] = '';
				
				var option = makeHTMLElement ( 'option', p );
				option.appendChild ( document.createTextNode ( a [ b ] ) );
				selMonth.appendChild ( option );
			}
			
			var selYear = makeHTMLElement ( 'select', { id: 'calSelectedYear', name: 'tbSelYear',
				onchange: 'fUpdateCal ();' } );
			for ( var a = 1960; a <= parseInt ( dCurDate.getFullYear () ); a++ )
			{
				var p = { value: a };
				if ( this.dCurYear == a ) p [ 'selected' ] = '';
				var option = makeHTMLElement ( 'option', p );
				option.appendChild ( document.createTextNode ( a ) );
				selYear.appendChild ( option );
			}
			
			var td = makeHTMLElement ( 'td', { align: 'center' } );
			td.appendChild ( selMonth );
			td.appendChild ( selYear );
			
			var tr = makeHTMLElement ( 'tr' );
			tr.appendChild ( td );
			
			var cTable = makeHTMLElement ( 'table' );
			cTable.appendChild ( tr );
			
			var td2 = makeHTMLElement ( 'td' );
			//td2.appendChild ( calDesktop );
			
			var tr2 = makeHTMLElement ( 'tr' );
			tr2.appendChild ( td2 );
			
			cTable.appendChild ( tr2 );
			
			// -----------------------------------------------------------------
			var selButton = makeHTMLElement ( 'input', { type: 'button', value: 'Выбрать', onClick: 'sendData ( document.getElementById ( \'calSelectedDate\' ).value );' } );
			var td3 = makeHTMLElement ( 'td', { align: 'center' } );
			td3.appendChild ( selButton );
			
			var cancelButton = makeHTMLElement ( 'input', { type: 'button', value: 'Закрыть', onClick: 'closeCalendarDialog ();' } );
			td3.appendChild ( cancelButton );
			
			var hiddenInput = makeHTMLElement ( 'input', { type: 'hidden', id: 'calSelectedDate' } );
			td3.appendChild ( hiddenInput );
			
			var tr3 = makeHTMLElement ( 'tr' );
			tr3.appendChild ( td3 );
			
			cTable.appendChild ( tr3 );
			
			self.calendarWindow.setContent ( cTable );
			self.calendarWindow.show ();
		};
		
		
		this.closeDialog = function ()
		{
			self.calendarWindow.close ();
		};
	}
	
	
	var calendar = new Calendar ();
	
	function displayCalendarDialog ( requestInputId, shadowType )
	{
		calendar.init ( requestInputId );
		calendar.displayDialog ( shadowType );
		
		// set current date
		//var selDay = new String ( calendar.dCurDayOfMonth );
		//calendar.setCalSelectedDate ( selDay );
	}
	
	
	/*function closeCalendarDialog ()
	{
		calendar.closeDialog ();
	}
	
	
	function fToggleColor ( item )
	{
		calendar.fToggleColor ( item );
	}
	
	
	function fSetSelectedDay ( item )
	{
		calendar.fSetSelectedDay ( item );
	}
	
	
	function sendData ( value )
	{
		document.getElementById ( calendar.requestInputId ).value = value;
		calendar.closeDialog ();
	}
	
	
	function fUpdateCal ()
	{
		var year = document.getElementById ( 'calSelectedYear' );
		var iYear = year.options [ year.selectedIndex ].value;
		
		var month = document.getElementById ( 'calSelectedMonth' );
		var iMonth = month.options [ month.selectedIndex ].value;
		
		calendar.fUpdateCal ( iYear, iMonth );
	}*/
