// Copyright (C) 1999-2000 Id Software, Inc.
//
#include "ui_local.h"

void UI_VideoDriverMenu( void );
void VideoDriver_Lines(int increment);
void UI_VideoData2SettingsMenu( void );


extern void *holdControlPtr;
extern int holdControlEvent;
static void Video_MenuEvent (void* ptr, int event);

#define PIC_MONBAR2		"menu/common/monbar_2.tga"
#define PIC_SLIDER		"menu/common/slider.tga"

// Video Data
typedef struct
{
	menuframework_s	menu;

	qhandle_t	swooshTop;
	qhandle_t	swooshBottom;
	qhandle_t	swooshTopSmall;
	qhandle_t	swooshBottomSmall;

} videoddata_t;

static videoddata_t	s_videodata;


// Video Drivers
typedef struct
{
	menuframework_s	menu;

	qhandle_t	swooshTopSmall;
	qhandle_t	swooshBottomSmall;
} videodriver_t;


// Video Data 2
typedef struct
{
	menuframework_s	menu;

	menuslider_s	gamma_slider;
	menuslider_s	screensize_slider;
	menulist_s		anisotropicfiltering;
	menuaction_s	apply_action2;

	qhandle_t	gamma;
	qhandle_t	top;
} videodata2_t;

typedef struct
{
	int			width;
	int			height;
} videoResolutions_t;

static videodata2_t	s_videodata2;

static int s_graphics_options_Names[] =
{
	MNT_VIDEO_HIGH_QUALITY,
	MNT_VIDEO_NORMAL,
	MNT_VIDEO_FAST,
	MNT_VIDEO_FASTEST,
	MNT_VIDEO_CUSTOM,
	MNT_NONE
};

/*static int s_driver_Names[] =
{
	MNT_VIDEO_DRIVER_DEFAULT,
	MNT_VIDEO_DRIVER_VOODOO,
	MNT_NONE
};*/

extern int s_OffOnNone_Names[];

static int s_resolutions[] =
{
//	MNT_320X200,
//	MNT_400X300,
	MNT_512X384,
	MNT_640X480,
	MNT_800X600,
	MNT_960X720,
	MNT_1024X768,
	MNT_1152X864,
	MNT_1280X960,
	MNT_1600X1200,
	MNT_2048X1536,
	//MNT_856x480WIDE, //this is dumb :P
	MNT_NONE
};

static int s_aspectRatios[] =
{
	MNT_4X3,
	MNT_16X9,
	MNT_16X10,
	0
};

static char *s_wideResolutions16x9[] =
{
	"854x480",
	"1280x720",
	"1366x768",
	"1920x1080",
	0
};

static videoResolutions_t videoResolutions16x9[] =
{
	{ 854, 480 },
	{ 1280, 720 },
	{ 1366, 768 },
	{ 1920, 1080 }
};

static char *s_wideResolutions16x10[] =
{
	"1280x800",
	"1440x900",
	"1680x1050",
	"1920x1200",
	"2560x1600",
	0
};

static videoResolutions_t videoResolutions16x10[] =
{
	{ 1280, 800 },
	{ 1440, 900 },
	{ 1680, 1050 },
	{ 1920, 1200 },
	{ 2560, 1600 }
};

static void *s_widescreenResolutions[] =
{
	&videoResolutions16x9,
	&videoResolutions16x10,
	NULL
};

static void *s_widescreenResStrings[] =
{
	&s_wideResolutions16x9,
	&s_wideResolutions16x10,
	NULL
};

//store the number of widescreen arrays
static int s_wideScreenSets = 2;

//store the number of resolutions in each array.
//This will be necessary when we change the lists over
static int s_resolutionNums[] = {9,4,5};

//finally for reference sake, use an enum
typedef enum
{
	ASPECTRATIO_4X3,
	ASPECTRATIO_16X9,
	ASPECTRATIO_16X10,
	ASPECTRATIO_MAX
} AspectRatios_e;

static int s_colordepth_Names[] =
{
	MNT_DEFAULT,
	MNT_16BIT,
	MNT_32BIT,
	MNT_NONE
};

/*static int s_lighting_Names[] =
{
	MNT_LIGHTMAP,
	MNT_VERTEX,
	MNT_NONE
};*/

static int s_quality_Names[] =
{
	MNT_LOW,
	MNT_MEDIUM,
	MNT_HIGH,
	MNT_NONE
};

static int s_4quality_Names[] =
{
	MNT_LOW,
	MNT_MEDIUM,
	MNT_HIGH,
	MNT_VERY_HIGH,
	MNT_NONE
};

static int s_tqbits_Names[] =
{
	MNT_DEFAULT,
	MNT_16BIT,
	MNT_32BIT,
	MNT_NONE
};

static int s_filter_Names[] =
{
	MNT_BILINEAR,
	MNT_TRILINEAR,
	MNT_NONE
};



static menubitmap_s			s_video_drivers;
static menubitmap_s			s_video_data;
static menubitmap_s			s_video_data2;

#define ID_MAINMENU		100
#define ID_CONTROLS		101
#define ID_VIDEO		102
#define ID_SOUND		103
#define ID_GAMEOPTIONS	104
#define ID_CDKEY		105
#define ID_VIDEODATA	110
#define ID_VIDEODATA2	111
#define ID_VIDEODRIVERS	112
#define ID_ARROWDWN		113
#define ID_ARROWUP		114
#define ID_INGAMEMENU	115

// Precache stuff for Video Driver
#define MAX_VID_DRIVERS 128
static struct
{
	menuframework_s		menu;

	char *drivers[MAX_VID_DRIVERS];
	char extensionsString[2*MAX_STRING_CHARS];

	menutext_s		line1;
	menutext_s		line2;
	menutext_s		line3;
	menutext_s		line4;
	menutext_s		line5;
	menutext_s		line6;
	menutext_s		line7;
	menutext_s		line8;
	menutext_s		line9;
	menutext_s		line10;
	menutext_s		line11;
	menutext_s		line12;
	menutext_s		line13;
	menutext_s		line14;
	menutext_s		line15;
	menutext_s		line16;
	menutext_s		line17;
	menutext_s		line18;
	menutext_s		line19;
	menutext_s		line20;
	menutext_s		line21;
	menutext_s		line22;
	menutext_s		line23;
	menutext_s		line24;

	qhandle_t	corner_ll_8_16;
	qhandle_t	corner_ll_16_16;
	qhandle_t	arrow_dn;
	menubitmap_s	arrowdwn;
	menubitmap_s	arrowup;
	int			currentDriverLine;
	int			driverCnt;

	int			activeArrowDwn;
	int			activeArrowUp;
} s_videodriver;


static void* g_videolines[] =
{
	&s_videodriver.line1,
	&s_videodriver.line2,
	&s_videodriver.line3,
	&s_videodriver.line4,
	&s_videodriver.line5,
	&s_videodriver.line6,
	&s_videodriver.line7,
	&s_videodriver.line8,
	&s_videodriver.line9,
	&s_videodriver.line10,
	&s_videodriver.line11,
	&s_videodriver.line12,
	&s_videodriver.line13,
	&s_videodriver.line14,
	&s_videodriver.line15,
	&s_videodriver.line16,
	&s_videodriver.line17,
	&s_videodriver.line18,
	&s_videodriver.line19,
	&s_videodriver.line20,
	&s_videodriver.line21,
	&s_videodriver.line22,
	&s_videodriver.line23,
	&s_videodriver.line24,
	NULL,
};

int video_sidebuttons[3][2] =
{
	{ 30, 250													},	// Video Data Button
	{ 30, 250 + 6 + (MENU_BUTTON_MED_HEIGHT * 1.5)				},	// Video Drivers Button
	{ 30, 250 + (2 * (6 + (MENU_BUTTON_MED_HEIGHT * 1.5)))		},	// Video Drivers Button
};


void Video_SideButtons(menuframework_s *menu,int menuType);
static void GraphicsOptions_ApplyChanges( void *unused, int notification );

/*
=======================================================================

DRIVER INFORMATION MENU

=======================================================================
*/



#define ID_DRIVERINFOBACK	100

typedef struct
{
	menuframework_s	menu;
	menutext_s		banner;
	menubitmap_s	back;
	menubitmap_s	framel;
	menubitmap_s	framer;
	char			stringbuff[2*MAX_STRING_CHARS];
	char*			strings[64];
	int				numstrings;
} driverinfo_t;

static driverinfo_t	s_driverinfo;


/*
=================
DriverInfo_MenuDraw
=================
*/
static void DriverInfo_MenuDraw( void )
{
	int	i;
	int	y;

	Menu_Draw( &s_driverinfo.menu );

	UI_DrawString( 320, 80, "VENDOR", UI_CENTER|UI_SMALLFONT, color_red, qtrue );
	UI_DrawString( 320, 152, "PIXELFORMAT", UI_CENTER|UI_SMALLFONT, color_red, qtrue );
	UI_DrawString( 320, 192, "EXTENSIONS", UI_CENTER|UI_SMALLFONT, color_red, qtrue );

	UI_DrawString( 320, 80+16, uis.glconfig.vendor_string, UI_CENTER|UI_SMALLFONT, text_color_normal, qtrue );
	UI_DrawString( 320, 96+16, uis.glconfig.version_string, UI_CENTER|UI_SMALLFONT, text_color_normal, qtrue );
	UI_DrawString( 320, 112+16, uis.glconfig.renderer_string, UI_CENTER|UI_SMALLFONT, text_color_normal, qtrue );
	UI_DrawString( 320, 152+16, va ("color(%d-bits) Z(%d-bits) stencil(%d-bits)", uis.glconfig.colorBits, uis.glconfig.depthBits, uis.glconfig.stencilBits), UI_CENTER|UI_SMALLFONT, text_color_normal, qtrue );

	// double column
	y = 192+16;
	for (i=0; i<s_driverinfo.numstrings/2; i++) {
		UI_DrawString( 320-4, y, s_driverinfo.strings[i*2], UI_RIGHT|UI_SMALLFONT, text_color_normal, qtrue );
		UI_DrawString( 320+4, y, s_driverinfo.strings[i*2+1], UI_LEFT|UI_SMALLFONT, text_color_normal, qtrue );
		y += SMALLCHAR_HEIGHT;
	}

	if (s_driverinfo.numstrings & 1)
		UI_DrawString( 320, y, s_driverinfo.strings[s_driverinfo.numstrings-1], UI_CENTER|UI_SMALLFONT, text_color_normal, qtrue );
}

/*
=================
DriverInfo_Cache
=================
*/
void DriverInfo_Cache( void )
{

}

/*
=================
UI_DriverInfo_Menu
=================
*/
static void UI_DriverInfo_Menu( void )
{
	char*	eptr;
	int		i;
	int		len;

	// zero set all our globals
	memset( &s_driverinfo, 0 ,sizeof(driverinfo_t) );

	DriverInfo_Cache();

	s_driverinfo.menu.fullscreen = qtrue;
	s_driverinfo.menu.draw       = DriverInfo_MenuDraw;
/*
	s_driverinfo.banner.generic.type  = MTYPE_BTEXT;
	s_driverinfo.banner.generic.x	  = 320;
	s_driverinfo.banner.generic.y	  = 16;
	s_driverinfo.banner.string		  = "DRIVER INFO";
	s_driverinfo.banner.color	      = color_white;
	s_driverinfo.banner.style	      = UI_CENTER;

	s_driverinfo.framel.generic.type  = MTYPE_BITMAP;
	s_driverinfo.framel.generic.name  = DRIVERINFO_FRAMEL;
	s_driverinfo.framel.generic.flags = QMF_INACTIVE;
	s_driverinfo.framel.generic.x	  = 0;
	s_driverinfo.framel.generic.y	  = 78;
	s_driverinfo.framel.width  	      = 256;
	s_driverinfo.framel.height  	  = 329;

	s_driverinfo.framer.generic.type  = MTYPE_BITMAP;
	s_driverinfo.framer.generic.name  = DRIVERINFO_FRAMER;
	s_driverinfo.framer.generic.flags = QMF_INACTIVE;
	s_driverinfo.framer.generic.x	  = 376;
	s_driverinfo.framer.generic.y	  = 76;
	s_driverinfo.framer.width  	      = 256;
	s_driverinfo.framer.height  	  = 334;

	s_driverinfo.back.generic.type	   = MTYPE_BITMAP;
	s_driverinfo.back.generic.name     = DRIVERINFO_BACK0;
	s_driverinfo.back.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
	s_driverinfo.back.generic.callback = DriverInfo_Event;
	s_driverinfo.back.generic.id	   = ID_DRIVERINFOBACK;
	s_driverinfo.back.generic.x		   = 0;
	s_driverinfo.back.generic.y		   = 480-64;
	s_driverinfo.back.width  		   = 128;
	s_driverinfo.back.height  		   = 64;
	s_driverinfo.back.focuspic         = DRIVERINFO_BACK1;
*/
	strcpy( s_driverinfo.stringbuff, uis.glconfig.extensions_string );

	// build null terminated extension strings
	eptr = s_driverinfo.stringbuff;
	while ( s_driverinfo.numstrings<40 && *eptr )
	{
		while ( *eptr && *eptr == ' ' )
			*eptr++ = '\0';

		// track start of valid string
		if (*eptr && *eptr != ' ')
			s_driverinfo.strings[s_driverinfo.numstrings++] = eptr;

		while ( *eptr && *eptr != ' ' )
			eptr++;
	}

	// safety length strings for display
	for (i=0; i<s_driverinfo.numstrings; i++) {
		len = strlen(s_driverinfo.strings[i]);
		if (len > 32) {
			s_driverinfo.strings[i][len-1] = '>';
			s_driverinfo.strings[i][len]   = '\0';
		}
	}

	Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.banner );
	Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.framel );
	Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.framer );
	Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.back );

	UI_PushMenu( &s_driverinfo.menu );
}

/*
=======================================================================

GRAPHICS OPTIONS MENU

=======================================================================
*/


/*static const char *s_drivers[] =
{
	OPENGL_DRIVER_NAME,
	_3DFX_DRIVER_NAME,
	0
};*/

#define ID_BACK2		101
#define ID_FULLSCREEN	102
#define ID_LIST			103
#define ID_MODE			104
#define ID_DRIVERINFO	105
#define ID_GRAPHICS		106
#define ID_DISPLAY		107
//#define ID_SOUND		108
#define ID_NETWORK		109

typedef struct {
	menuframework_s	menu;

	menutext_s		banner;
	menubitmap_s	framel;
	menubitmap_s	framer;

	menutext_s		graphics;
	menutext_s		display;
	menutext_s		sound;
	menutext_s		network;

	menulist_s		aspectRatio;
	menulist_s		list;
	menulist_s		mode;
	menulist_s		tq;
	menulist_s  	fs;
	menulist_s  	lighting;
	menulist_s  	allow_extensions;
	menulist_s  	texturebits;
	menulist_s  	colordepth;
	menulist_s  	geometry;
	menulist_s  	filter;
	menutext_s		driverinfo;
	menulist_s		simpleshaders;
	menulist_s		compresstextures;

	menuaction_s	apply;

	menubitmap_s	back;

	//TiM - only update the resolution list when need be
	int				lastRatio;

} graphicsoptions_t;

typedef struct
{
	int mode;
	qboolean fullscreen;
	int	aspectRatio;
	int tq;
	int lighting;
	int colordepth;
	int texturebits;
	int geometry;
	int filter;
	qboolean extensions;
	int simpleshaders;
	int compresstextures;
} InitialVideoOptions_s;

static InitialVideoOptions_s	s_ivo;
static graphicsoptions_t		s_graphicsoptions;

static InitialVideoOptions_s s_ivo_templates[] =
{
	{
		2, qtrue, 0, 0, 2, 2, 2, 1, 0, qtrue, 0, 0,	// JDC: this was tq 3
	},
	{
		1, qtrue, 0, 0, 0, 0, 2, 0, 0, qtrue, 0, 0,
	},
	{
		0, qtrue, 0, 0, 1, 0, 0, 0, 0, qtrue, 0, 0,
	},
	{
		0, qtrue, 0, 1, 1, 0, 0, 0, 0, qtrue, 1, 0,
	},
	{
		1, qtrue, 0, 0, 0, 0, 1, 0, 0, qtrue, 0, 0,
	}
};

#define NUM_IVO_TEMPLATES ( sizeof( s_ivo_templates ) / sizeof( s_ivo_templates[0] ) )

/*
=================
GraphicsOptions_GetInitialVideo
=================
*/
static void GraphicsOptions_GetInitialVideo( void )
{
	s_ivo.colordepth  = s_graphicsoptions.colordepth.curvalue;
	s_ivo.mode        = s_graphicsoptions.mode.curvalue;
	s_ivo.aspectRatio = s_graphicsoptions.aspectRatio.curvalue;
	s_ivo.fullscreen  = s_graphicsoptions.fs.curvalue;
	s_ivo.extensions  = s_graphicsoptions.allow_extensions.curvalue;
	s_ivo.tq          = s_graphicsoptions.tq.curvalue;
//	s_ivo.lighting    = s_graphicsoptions.lighting.curvalue;
	s_ivo.geometry    = s_graphicsoptions.geometry.curvalue;
	s_ivo.filter      = s_graphicsoptions.filter.curvalue;
	s_ivo.texturebits = s_graphicsoptions.texturebits.curvalue;
	s_ivo.simpleshaders = s_graphicsoptions.simpleshaders.curvalue;
	s_ivo.compresstextures = s_graphicsoptions.compresstextures.curvalue;
}


/*
=================
GraphicsOptions_CheckConfig
=================
*/
static void GraphicsOptions_CheckConfig( void )
{
	int i;

	for ( i = 0; i < NUM_IVO_TEMPLATES; i++ )
	{
		if ( s_ivo_templates[i].colordepth != s_graphicsoptions.colordepth.curvalue )
			continue;
		if ( s_ivo_templates[i].mode != s_graphicsoptions.mode.curvalue )
			continue;
		if ( s_ivo_templates[i].aspectRatio != s_graphicsoptions.aspectRatio.curvalue )
			continue;
		if ( s_ivo_templates[i].fullscreen != s_graphicsoptions.fs.curvalue )
			continue;
		if ( s_ivo_templates[i].tq != s_graphicsoptions.tq.curvalue )
			continue;
//		if ( s_ivo_templates[i].lighting != s_graphicsoptions.lighting.curvalue )
//			continue;
		if ( s_ivo_templates[i].geometry != s_graphicsoptions.geometry.curvalue )
			continue;
		if ( s_ivo_templates[i].filter != s_graphicsoptions.filter.curvalue )
			continue;
		if ( s_ivo_templates[i].simpleshaders != s_graphicsoptions.simpleshaders.curvalue )
			continue;
//		if ( s_ivo_templates[i].compresstextures != s_graphicsoptions.compresstextures.curvalue )
//			continue;

//		if ( s_ivo_templates[i].texturebits != s_graphicsoptions.texturebits.curvalue )
//			continue;
		s_graphicsoptions.list.curvalue = i;
		return;
	}
	s_graphicsoptions.list.curvalue = 4;
}

/*
=================
GraphicsOptions_UpdateMenuItems
=================
*/
static void GraphicsOptions_UpdateMenuItems( void )
{

	if ( s_graphicsoptions.fs.curvalue == 0 )
	{
		s_graphicsoptions.colordepth.curvalue = 0;
		s_graphicsoptions.colordepth.generic.flags |= QMF_GRAYED;
	}
	else
	{
		s_graphicsoptions.colordepth.generic.flags &= ~QMF_GRAYED;
	}

	if ( s_graphicsoptions.allow_extensions.curvalue == 0 )
	{
		if ( s_graphicsoptions.texturebits.curvalue == 0 )
		{
			s_graphicsoptions.texturebits.curvalue = 1;
		}
	}

	s_graphicsoptions.apply.generic.flags	|= QMF_GRAYED;
	s_graphicsoptions.apply.generic.flags&= ~ QMF_BLINK;

	if ( s_ivo.mode != s_graphicsoptions.mode.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	if ( s_ivo.aspectRatio != s_graphicsoptions.aspectRatio.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	if ( s_ivo.fullscreen != s_graphicsoptions.fs.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	if ( s_ivo.extensions != s_graphicsoptions.allow_extensions.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}
	if ( s_ivo.tq != s_graphicsoptions.tq.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

/*	if ( s_ivo.lighting != s_graphicsoptions.lighting.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}
*/
	if ( s_ivo.colordepth != s_graphicsoptions.colordepth.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	if ( s_ivo.texturebits != s_graphicsoptions.texturebits.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	if ( s_ivo.simpleshaders != s_graphicsoptions.simpleshaders.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	if ( s_ivo.compresstextures != s_graphicsoptions.compresstextures.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	if ( s_ivo.geometry != s_graphicsoptions.geometry.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	if ( s_ivo.filter != s_graphicsoptions.filter.curvalue )
	{
		s_graphicsoptions.apply.generic.flags &= ~QMF_GRAYED;
		s_graphicsoptions.apply.generic.flags |= QMF_BLINK;
	}

	//TiM - check for widescreen
	if ( s_graphicsoptions.aspectRatio.curvalue != s_graphicsoptions.lastRatio )
	{
		if ( s_graphicsoptions.aspectRatio.curvalue == ASPECTRATIO_4X3 )
		{
			s_graphicsoptions.mode.itemnames = NULL;
			s_graphicsoptions.mode.listnames = NULL;
			s_graphicsoptions.mode.listnames = s_resolutions;
			s_graphicsoptions.mode.numitems = s_resolutionNums[ASPECTRATIO_4X3];
			s_graphicsoptions.mode.curvalue = 1;
		}
		else
		{
			s_graphicsoptions.mode.listnames = NULL;
			s_graphicsoptions.mode.itemnames = NULL;
			s_graphicsoptions.mode.itemnames = (const char **)s_widescreenResStrings[s_graphicsoptions.aspectRatio.curvalue-1];
			s_graphicsoptions.mode.numitems = s_resolutionNums[s_graphicsoptions.aspectRatio.curvalue];
			s_graphicsoptions.mode.curvalue = 0;
		}

		s_graphicsoptions.lastRatio = s_graphicsoptions.aspectRatio.curvalue;
	}

	GraphicsOptions_CheckConfig();
}

/*
=================
ApplyChanges - Apply the changes from the video data screen
=================
*/
static void ApplyChanges2( void *unused, int notification )
{
	if (notification != QM_ACTIVATED)
		return;

	trap_Cmd_ExecuteText( EXEC_APPEND, "vid_restart\n" );
}
/*
=================
GraphicsOptions_ApplyChanges
=================
*/
static void GraphicsOptions_ApplyChanges( void *unused, int notification )
{
	if (notification != QM_ACTIVATED)
		return;

	switch ( s_graphicsoptions.texturebits.curvalue  )
	{
	case 0:
		trap_Cvar_SetValue( "r_texturebits", 0 );
		break;
	case 1:
		trap_Cvar_SetValue( "r_texturebits", 16 );
		break;
	case 2:
		trap_Cvar_SetValue( "r_texturebits", 32 );
		break;
	}
	trap_Cvar_SetValue( "r_picmip", 3 - s_graphicsoptions.tq.curvalue );
	trap_Cvar_SetValue( "r_allowExtensions", s_graphicsoptions.allow_extensions.curvalue );
	trap_Cvar_SetValue( "r_fullscreen", s_graphicsoptions.fs.curvalue );
	//trap_Cvar_Set( "r_glDriver", ( char * ) s_drivers[s_graphicsoptions.driver.curvalue] );

	//TiM - handle the mode coupled with highscreen
	if ( s_graphicsoptions.aspectRatio.curvalue == ASPECTRATIO_4X3 )
		trap_Cvar_SetValue( "r_mode", (s_graphicsoptions.mode.curvalue + 2) );
	else
	{
		//GSIO - TiM you actually forget that there is r_customPixelAspect/r_customaspect as well
		if(s_graphicsoptions.aspectRatio.curvalue == ASPECTRATIO_16X9) {
			trap_Cvar_SetValue("r_customPixelAspect", 1.7); //vEF
			trap_Cvar_SetValue("r_customaspect", 1.7); //ioEF
		} else {
			trap_Cvar_SetValue("r_customPixelAspect", 1.6);
			trap_Cvar_SetValue("r_customaspect", 1.6);
		}
		trap_Cvar_SetValue( "r_mode", -1 );
		trap_Cvar_SetValue( "r_customWidth",	(((videoResolutions_t *)s_widescreenResolutions[s_graphicsoptions.aspectRatio.curvalue-1])[s_graphicsoptions.mode.curvalue]).width );
		trap_Cvar_SetValue( "r_customHeight",	(((videoResolutions_t *)s_widescreenResolutions[s_graphicsoptions.aspectRatio.curvalue-1])[s_graphicsoptions.mode.curvalue]).height );
	}

	trap_Cvar_SetValue( "r_lowEndVideo", s_graphicsoptions.simpleshaders.curvalue );

	trap_Cvar_SetValue( "r_ext_compress_textures", s_graphicsoptions.compresstextures.curvalue );

	switch ( s_graphicsoptions.colordepth.curvalue )
	{
	case 0:
		trap_Cvar_SetValue( "r_colorbits", 0 );
		trap_Cvar_SetValue( "r_depthbits", 0 );
		trap_Cvar_SetValue( "r_stencilbits", 0 );
		break;
	case 1:
		trap_Cvar_SetValue( "r_colorbits", 16 );
		trap_Cvar_SetValue( "r_depthbits", 16 );
		trap_Cvar_SetValue( "r_stencilbits", 0 );
		break;
	case 2:
		trap_Cvar_SetValue( "r_colorbits", 32 );
		trap_Cvar_SetValue( "r_depthbits", 24 );
		break;
	}
//	trap_Cvar_SetValue( "r_vertexLight", s_graphicsoptions.lighting.curvalue );

	if ( s_graphicsoptions.geometry.curvalue == 2 )
	{
		trap_Cvar_SetValue( "r_lodBias", 0 );
		trap_Cvar_SetValue( "r_subdivisions", 4 );
	}
	else if ( s_graphicsoptions.geometry.curvalue == 1 )
	{
		trap_Cvar_SetValue( "r_lodBias", 1 );
		trap_Cvar_SetValue( "r_subdivisions", 12 );
	}
	else
	{
		trap_Cvar_SetValue( "r_lodBias", 1 );
		trap_Cvar_SetValue( "r_subdivisions", 20 );
	}

	if ( s_graphicsoptions.filter.curvalue )
	{
		trap_Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_LINEAR" );
	}
	else
	{
		trap_Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" );
	}

	trap_Cmd_ExecuteText( EXEC_APPEND, "vid_restart\n" );
}

/*
=================
GraphicsOptions_Event
=================
*/
static void GraphicsOptions_Event( void* ptr, int event )
{
	InitialVideoOptions_s *ivo;

	if( event != QM_ACTIVATED ) {
	 	return;
	}

	switch( ((menucommon_s*)ptr)->id ) {

	case ID_LIST:
		ivo = &s_ivo_templates[s_graphicsoptions.list.curvalue];

		s_graphicsoptions.tq.curvalue				= ivo->tq;
//		s_graphicsoptions.lighting.curvalue			= ivo->lighting;
		s_graphicsoptions.colordepth.curvalue		= ivo->colordepth;
		s_graphicsoptions.texturebits.curvalue		= ivo->texturebits;
		s_graphicsoptions.geometry.curvalue			= ivo->geometry;
		s_graphicsoptions.filter.curvalue			= ivo->filter;
		s_graphicsoptions.fs.curvalue				= ivo->fullscreen;
		s_graphicsoptions.simpleshaders.curvalue	= ivo->simpleshaders;
		s_graphicsoptions.compresstextures.curvalue	= ivo->compresstextures;

		//TiM - revert the widescreen settings
		if ( s_graphicsoptions.aspectRatio.curvalue != ASPECTRATIO_4X3 )
		{
			s_graphicsoptions.aspectRatio.curvalue = s_graphicsoptions.lastRatio = ASPECTRATIO_4X3;

			s_graphicsoptions.mode.itemnames = NULL;
			s_graphicsoptions.mode.listnames = s_resolutions;
			s_graphicsoptions.mode.numitems = s_resolutionNums[ASPECTRATIO_4X3];
		}
		s_graphicsoptions.mode.curvalue				= ivo->mode;

		break;

	case ID_DRIVERINFO:
		UI_DriverInfo_Menu();
		break;

	case ID_BACK2:
		UI_PopMenu();
		break;

	case ID_GRAPHICS:
		break;

	case ID_DISPLAY:
		UI_PopMenu();
		UI_VideoDataMenu();		// Move to the Video Menu
//		UI_DisplayOptionsMenu();
		break;

//	case ID_SOUND:
//		UI_PopMenu();
//		UI_SoundOptionsMenu();
//		break;

	case ID_NETWORK:
		UI_PopMenu();
		UI_NetworkOptionsMenu();
		break;
	}
}


/*
================
GraphicsOptions_MenuDraw
================
*/
void GraphicsOptions_MenuDraw (void)
{
//APSFIX - rework this
	GraphicsOptions_UpdateMenuItems();

	Menu_Draw( &s_graphicsoptions.menu );
}

static qboolean GraphicsOptions_CheckWidescreen( void )
{
	int						j, i;
	int						customWidth = trap_Cvar_VariableValue( "r_customWidth" );
	int						customHeight = trap_Cvar_VariableValue( "r_customHeight" );
	videoResolutions_t		*v;

	//double check
	if ( s_graphicsoptions.mode.curvalue >= 0 )
		return qfalse;

	for ( j=0; j < s_wideScreenSets; j++ )
	{
		v = (videoResolutions_t *)s_widescreenResolutions[j];

		//check if it matches the resolution
		for ( i = 0; i < s_resolutionNums[j+1]; i++) //offset by 1 to avoid the 4X3 option
		{
			if ( v[i].width == customWidth && v[i].height == customHeight )
			{
				s_graphicsoptions.aspectRatio.curvalue = s_graphicsoptions.lastRatio = j+1;

				//configure the mode list accordingly
				s_graphicsoptions.mode.listnames = 0;
				s_graphicsoptions.mode.itemnames = 0;
				s_graphicsoptions.mode.itemnames = (const char **)s_widescreenResStrings[s_graphicsoptions.aspectRatio.curvalue-1];
				s_graphicsoptions.mode.numitems = s_resolutionNums[s_graphicsoptions.aspectRatio.curvalue];

				s_graphicsoptions.mode.curvalue = i;
				return qtrue;
			}
		}
	}

	//ffs... no luck
	return qfalse;
}

/*
=================
GraphicsOptions_SetMenuItems
=================
*/
static void GraphicsOptions_SetMenuItems( void )
{

	s_graphicsoptions.aspectRatio.curvalue	= ASPECTRATIO_4X3; //set aspect to 'Normal' for now

	s_graphicsoptions.mode.curvalue			= (trap_Cvar_VariableValue( "r_mode" ) - 2);

	//TiM - adjust for widescreen
	if ( s_graphicsoptions.mode.curvalue < 0 && !GraphicsOptions_CheckWidescreen() ) //less than 0 means custom resolution now
		s_graphicsoptions.mode.curvalue = 1;

	s_graphicsoptions.fs.curvalue = trap_Cvar_VariableValue("r_fullscreen");
	s_graphicsoptions.allow_extensions.curvalue = trap_Cvar_VariableValue("r_allowExtensions");
	s_graphicsoptions.simpleshaders.curvalue = trap_Cvar_VariableValue("r_lowEndVideo");
	s_graphicsoptions.compresstextures.curvalue = trap_Cvar_VariableValue("r_ext_compress_textures");

	s_graphicsoptions.tq.curvalue = 3-trap_Cvar_VariableValue( "r_picmip");
	if ( s_graphicsoptions.tq.curvalue < 0 )
	{
		s_graphicsoptions.tq.curvalue = 0;
	}
	else if ( s_graphicsoptions.tq.curvalue > 3 )
	{
		s_graphicsoptions.tq.curvalue = 3;
	}

//	s_graphicsoptions.lighting.curvalue = trap_Cvar_VariableValue( "r_vertexLight" ) != 0;
	switch ( ( int ) trap_Cvar_VariableValue( "r_texturebits" ) )
	{
	default:
	case 0:
		s_graphicsoptions.texturebits.curvalue = 0;
		break;
	case 16:
		s_graphicsoptions.texturebits.curvalue = 1;
		break;
	case 32:
		s_graphicsoptions.texturebits.curvalue = 2;
		break;
	}

	if ( !Q_stricmp( UI_Cvar_VariableString( "r_textureMode" ), "GL_LINEAR_MIPMAP_NEAREST" ) )
	{
		s_graphicsoptions.filter.curvalue = 0;
	}
	else
	{
		s_graphicsoptions.filter.curvalue = 1;
	}

	if ( trap_Cvar_VariableValue( "r_lodBias" ) > 0 )
	{
		if ( trap_Cvar_VariableValue( "r_subdivisions" ) >= 20 )
		{
			s_graphicsoptions.geometry.curvalue = 0;
		}
		else
		{
			s_graphicsoptions.geometry.curvalue = 1;
		}
	}
	else
	{
		s_graphicsoptions.geometry.curvalue = 2;
	}

	switch ( ( int ) trap_Cvar_VariableValue( "r_colorbits" ) )
	{
	default:
	case 0:
		s_graphicsoptions.colordepth.curvalue = 0;
		break;
	case 16:
		s_graphicsoptions.colordepth.curvalue = 1;
		break;
	case 32:
		s_graphicsoptions.colordepth.curvalue = 2;
		break;
	}

	if ( s_graphicsoptions.fs.curvalue == 0 )
	{
		s_graphicsoptions.colordepth.curvalue = 0;
	}

}



void VideoSideButtonsAction( qboolean result )
{
	if ( result )	// Yes - do it
	{
		Video_MenuEvent(holdControlPtr, holdControlEvent);
	}
}

/*
=================
VideoSideButtons_MenuEvent
=================
*/
static void VideoSideButtons_MenuEvent (void* ptr, int event)
{

	if (event != QM_ACTIVATED)
		return;

	holdControlPtr = ptr;
	holdControlEvent = event;

	if (s_graphicsoptions.apply.generic.flags & QMF_BLINK)	// Video apply changes button is flashing
	{
		UI_ConfirmMenu(menu_normal_text[MNT_LOOSEVIDSETTINGS], 0, VideoSideButtonsAction);
	}
	else	// Go ahead, act normal
	{
		Video_MenuEvent (holdControlPtr, holdControlEvent);
	}
}

/*
=================
Video_MenuEvent
=================
*/
static void Video_MenuEvent (void* ptr, int event)
{
	menuframework_s*	m;

	if (event != QM_ACTIVATED)
		return;

	m = ((menucommon_s*)ptr)->parent;

	switch (((menucommon_s*)ptr)->id)
	{
		case ID_VIDEO:				// You're already in video menus, doofus
			break;

		case ID_ARROWDWN:
			VideoDriver_Lines(1);
			break;

		case ID_ARROWUP:
			VideoDriver_Lines(-1);
			break;

		case ID_VIDEODRIVERS:
			if (m != &s_videodriver.menu)	//	Not already in menu?
			{
				UI_PopMenu();			// Get rid of whatever is ontop
				UI_VideoDriverMenu();	// Move to the Controls Menu
			}
			break;

		case ID_VIDEODATA:
			if (m != &s_videodata.menu)	//	Not already in menu?
			{
				UI_PopMenu();			// Get rid of whatever is ontop
				UI_VideoDataMenu();		// Move to the Controls Menu
			}
			break;

		case ID_VIDEODATA2:
			if (m != &s_videodata2.menu)	//	Not already in menu?
			{
				UI_PopMenu();				// Get rid of whatever is ontop
				UI_VideoData2SettingsMenu();	// Move to the Controls Menu
			}
			break;

		case ID_CONTROLS:
			UI_PopMenu();			// Get rid of whatever is ontop
//			UI_SetupWeaponsMenu();	// Move to the Controls Menu
			break;

		case ID_SOUND:
			UI_PopMenu();			// Get rid of whatever is ontop
			UI_SoundMenu();			// Move to the Sound Menu
			break;

		case ID_GAMEOPTIONS:
			UI_PopMenu();			// Get rid of whatever is ontop
			UI_GameOptionsMenu();	// Move to the Game Options Menu
			break;

		case ID_CDKEY:
			UI_PopMenu();			// Get rid of whatever is ontop
			UI_CDKeyMenu();			// Move to the CD Key Menu
			break;

		case ID_MAINMENU:
			UI_PopMenu();
			break;

		case ID_INGAMEMENU :
			UI_PopMenu();
			break;

	}
}

/*
=================
M_VideoDataMenu_Graphics
=================
*/
void M_VideoDataMenu_Graphics (void)
{
	UI_MenuFrame(&s_videodata.menu);

	UI_DrawProportionalString(  74,  66, "207",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  84, "44909",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  188, "357",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  206, "250624",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  395, "456730-1",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);

	UI_Setup_MenuButtons();

	// Rest of Bottom1_Graphics
//	trap_R_SetColor( colorTable[CT_LTORANGE]);
//	UI_DrawHandlePic(  30, 203, 47, 69, uis.whiteShader);	// Top Left column above two buttons
//	UI_DrawHandlePic(  30, 344, 47, 45, uis.whiteShader);	// Top Left column below two buttons

	// Brackets around Video Data
	trap_R_SetColor( colorTable[CT_LTPURPLE1]);
	UI_DrawHandlePic(158,163, 16, 16, uis.graphicBracket1CornerLU);
	UI_DrawHandlePic(158,179,  8, 233, uis.whiteShader);
	UI_DrawHandlePic(158,412, 16, -16, uis.graphicBracket1CornerLU);	//LD

	UI_DrawHandlePic(174,163, 320, 8, uis.whiteShader);	// Top line

	UI_DrawHandlePic(494,163, 128, 128, s_videodata.swooshTop);			// Top swoosh

	UI_DrawHandlePic(501,188, 110, 54, uis.whiteShader);	// Top right column

	UI_DrawHandlePic(501,348, 110, 55, uis.whiteShader);	// Bottom right column

	UI_DrawHandlePic(494,406, 128, 128, s_videodata.swooshBottom);		// Bottom swoosh

	UI_DrawHandlePic(174,420, 320, 8, uis.whiteShader);	// Bottom line
}
/*
=================
VideoData_MenuDraw
=================
*/
static void VideoData_MenuDraw (void)
{
	GraphicsOptions_UpdateMenuItems();

	M_VideoDataMenu_Graphics();

	Menu_Draw( &s_videodata.menu );
}

/*
=================
UI_VideoDataMenu_Cache
=================
*/
void UI_VideoDataMenu_Cache(void)
{
	s_videodata.swooshTop = trap_R_RegisterShaderNoMip("menu/common/swoosh_top.tga");
	s_videodata.swooshBottom= trap_R_RegisterShaderNoMip("menu/common/swoosh_bottom.tga");
	s_videodata.swooshTopSmall= trap_R_RegisterShaderNoMip("menu/common/swoosh_topsmall.tga");
	s_videodata.swooshBottomSmall= trap_R_RegisterShaderNoMip("menu/common/swoosh_bottomsmall.tga");
}


/*
=================
VideoData_MenuInit
=================
*/
static void VideoData_MenuInit( void )
{
	int x,y,width,inc;

	UI_VideoDataMenu_Cache();

	// Menu Data
	s_videodata.menu.nitems						= 0;
	s_videodata.menu.wrapAround					= qtrue;
	s_videodata.menu.draw						= VideoData_MenuDraw;
	s_videodata.menu.fullscreen					= qtrue;
	s_videodata.menu.descX						= MENU_DESC_X;
	s_videodata.menu.descY						= MENU_DESC_Y;
	s_videodata.menu.listX						= 230;
	s_videodata.menu.listY						= 188;
	s_videodata.menu.titleX						= MENU_TITLE_X;
	s_videodata.menu.titleY						= MENU_TITLE_Y;
	s_videodata.menu.titleI						= MNT_CONTROLSMENU_TITLE;
	s_videodata.menu.footNoteEnum				= MNT_VIDEOSETUP;

	x = 170;
	y = 178;
	width = 145;

	s_graphicsoptions.list.generic.type			= MTYPE_SPINCONTROL;
	s_graphicsoptions.list.generic.flags		= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.list.generic.x			= x;
	s_graphicsoptions.list.generic.y			= y;
	s_graphicsoptions.list.generic.callback		= GraphicsOptions_Event;
	s_graphicsoptions.list.generic.id			= ID_LIST;
	s_graphicsoptions.list.textEnum				= MBT_VIDEOOPTIONS;
	s_graphicsoptions.list.textcolor			= CT_BLACK;
	s_graphicsoptions.list.textcolor2			= CT_WHITE;
	s_graphicsoptions.list.color				= CT_DKPURPLE1;
	s_graphicsoptions.list.color2				= CT_LTPURPLE1;
	s_graphicsoptions.list.textX				= 5;
	s_graphicsoptions.list.textY				= 2;
	s_graphicsoptions.list.listnames			= s_graphics_options_Names;
	s_graphicsoptions.list.width				= width;

	inc = 20;
	y += inc;
	s_graphicsoptions.allow_extensions.generic.type		= MTYPE_SPINCONTROL;
	s_graphicsoptions.allow_extensions.generic.flags	= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.allow_extensions.generic.x		= x;
	s_graphicsoptions.allow_extensions.generic.y		= y;
	s_graphicsoptions.allow_extensions.textEnum			= MBT_VIDEOGLEXTENTIONS;
	s_graphicsoptions.allow_extensions.textcolor		= CT_BLACK;
	s_graphicsoptions.allow_extensions.textcolor2		= CT_WHITE;
	s_graphicsoptions.allow_extensions.color			= CT_DKPURPLE1;
	s_graphicsoptions.allow_extensions.color2			= CT_LTPURPLE1;
	s_graphicsoptions.allow_extensions.textX			= 5;
	s_graphicsoptions.allow_extensions.textY			= 2;
	s_graphicsoptions.allow_extensions.listnames		= s_OffOnNone_Names;
	s_graphicsoptions.allow_extensions.width			= width;

	y += inc;
	s_graphicsoptions.aspectRatio.generic.type		= MTYPE_SPINCONTROL;
	s_graphicsoptions.aspectRatio.generic.flags		= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.aspectRatio.generic.x			= x;
	s_graphicsoptions.aspectRatio.generic.y			= y;
	s_graphicsoptions.aspectRatio.textEnum			= MBT_ASPECTRATIO;
	s_graphicsoptions.aspectRatio.textcolor			= CT_BLACK;
	s_graphicsoptions.aspectRatio.textcolor2		= CT_WHITE;
	s_graphicsoptions.aspectRatio.color				= CT_DKPURPLE1;
	s_graphicsoptions.aspectRatio.color2			= CT_LTPURPLE1;
	s_graphicsoptions.aspectRatio.textX				= 5;
	s_graphicsoptions.aspectRatio.textY				= 2;
	s_graphicsoptions.aspectRatio.listnames			= s_aspectRatios;
	s_graphicsoptions.aspectRatio.width				= width;

	y += inc;
	// references/modifies "r_mode"
	// TiM: can now be potentially '-1',
	// in which case 'r_customeheight' and 'r_customwidth'
	// will be used
	s_graphicsoptions.mode.generic.type					= MTYPE_SPINCONTROL;
	s_graphicsoptions.mode.generic.flags				= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.mode.generic.x					= x;
	s_graphicsoptions.mode.generic.y					= y;
	s_graphicsoptions.mode.generic.callback				= GraphicsOptions_Event;
	s_graphicsoptions.mode.textEnum						= MBT_VIDEOMODE;
	s_graphicsoptions.mode.textcolor					= CT_BLACK;
	s_graphicsoptions.mode.textcolor2					= CT_WHITE;
	s_graphicsoptions.mode.color						= CT_DKPURPLE1;
	s_graphicsoptions.mode.color2						= CT_LTPURPLE1;
	s_graphicsoptions.mode.textX						= 5;
	s_graphicsoptions.mode.textY						= 2;
	s_graphicsoptions.mode.listnames					= s_resolutions;
	s_graphicsoptions.mode.width						= width;

	y += inc;
	s_graphicsoptions.colordepth.generic.type			= MTYPE_SPINCONTROL;
	s_graphicsoptions.colordepth.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.colordepth.generic.x				= x;
	s_graphicsoptions.colordepth.generic.y				= y;
	s_graphicsoptions.colordepth.textEnum				= MBT_VIDEOCOLORDEPTH;
	s_graphicsoptions.colordepth.textcolor				= CT_BLACK;
	s_graphicsoptions.colordepth.textcolor2				= CT_WHITE;
	s_graphicsoptions.colordepth.color					= CT_DKPURPLE1;
	s_graphicsoptions.colordepth.color2					= CT_LTPURPLE1;
	s_graphicsoptions.colordepth.textX					= 5;
	s_graphicsoptions.colordepth.textY					= 2;
	s_graphicsoptions.colordepth.listnames				= s_colordepth_Names;
	s_graphicsoptions.colordepth.width					= width;

	y += inc;
	s_graphicsoptions.fs.generic.type			= MTYPE_SPINCONTROL;
	s_graphicsoptions.fs.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.fs.generic.x				= x;
	s_graphicsoptions.fs.generic.y				= y;
	s_graphicsoptions.fs.textEnum				= MBT_VIDEOFULLSCREEN;
	s_graphicsoptions.fs.textcolor				= CT_BLACK;
	s_graphicsoptions.fs.textcolor2				= CT_WHITE;
	s_graphicsoptions.fs.color					= CT_DKPURPLE1;
	s_graphicsoptions.fs.color2					= CT_LTPURPLE1;
	s_graphicsoptions.fs.textX					= 5;
	s_graphicsoptions.fs.textY					= 2;
	s_graphicsoptions.fs.listnames				= s_OffOnNone_Names;
	s_graphicsoptions.fs.width					= width;
/*
	y += inc;
	s_graphicsoptions.lighting.generic.type				= MTYPE_SPINCONTROL;
	s_graphicsoptions.lighting.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.lighting.generic.x				= x;
	s_graphicsoptions.lighting.generic.y				= y;
	s_graphicsoptions.lighting.textEnum					= MBT_VIDEOLIGHTING;
	s_graphicsoptions.lighting.textcolor				= CT_BLACK;
	s_graphicsoptions.lighting.textcolor2				= CT_WHITE;
	s_graphicsoptions.lighting.color					= CT_DKPURPLE1;
	s_graphicsoptions.lighting.color2					= CT_LTPURPLE1;
	s_graphicsoptions.lighting.textX					= 5;
	s_graphicsoptions.lighting.textY					= 2;
	s_graphicsoptions.lighting.listnames				= s_lighting_Names;
	s_graphicsoptions.lighting.width						= width;
*/
	y += inc;
	// references/modifies "r_lodBias" & "subdivisions"
	s_graphicsoptions.geometry.generic.type				= MTYPE_SPINCONTROL;
	s_graphicsoptions.geometry.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.geometry.generic.x				= x;
	s_graphicsoptions.geometry.generic.y				= y;
	s_graphicsoptions.geometry.textEnum					= MBT_VIDEOGEOMETRY;
	s_graphicsoptions.geometry.textcolor				= CT_BLACK;
	s_graphicsoptions.geometry.textcolor2				= CT_WHITE;
	s_graphicsoptions.geometry.color					= CT_DKPURPLE1;
	s_graphicsoptions.geometry.color2					= CT_LTPURPLE1;
	s_graphicsoptions.geometry.textX					= 5;
	s_graphicsoptions.geometry.textY					= 2;
	s_graphicsoptions.geometry.listnames				= s_quality_Names;
	s_graphicsoptions.geometry.width					= width;

	y += inc;
	s_graphicsoptions.tq.generic.type		= MTYPE_SPINCONTROL;
	s_graphicsoptions.tq.generic.flags		= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.tq.generic.x			= x;
	s_graphicsoptions.tq.generic.y			= y;
	s_graphicsoptions.tq.textEnum			= MBT_VIDEOTEXTUREDETAIL;
	s_graphicsoptions.tq.textcolor			= CT_BLACK;
	s_graphicsoptions.tq.textcolor2			= CT_WHITE;
	s_graphicsoptions.tq.color				= CT_DKPURPLE1;
	s_graphicsoptions.tq.color2				= CT_LTPURPLE1;
	s_graphicsoptions.tq.textX				= 5;
	s_graphicsoptions.tq.textY				= 2;
	s_graphicsoptions.tq.listnames			= s_4quality_Names;
	s_graphicsoptions.tq.width					= width;

	y += inc;
	// references/modifies "r_textureBits"
	s_graphicsoptions.texturebits.generic.type				= MTYPE_SPINCONTROL;
	s_graphicsoptions.texturebits.generic.flags				= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.texturebits.generic.x					= x;
	s_graphicsoptions.texturebits.generic.y					= y;
	s_graphicsoptions.texturebits.textEnum					= MBT_VIDEOTEXTUREBITS;
	s_graphicsoptions.texturebits.textcolor					= CT_BLACK;
	s_graphicsoptions.texturebits.textcolor2				= CT_WHITE;
	s_graphicsoptions.texturebits.color						= CT_DKPURPLE1;
	s_graphicsoptions.texturebits.color2					= CT_LTPURPLE1;
	s_graphicsoptions.texturebits.textX						= 5;
	s_graphicsoptions.texturebits.textY						= 2;
	s_graphicsoptions.texturebits.listnames					= s_tqbits_Names;
	s_graphicsoptions.texturebits.width					= width;

	y += inc;
	// references/modifies "r_textureMode"
	s_graphicsoptions.filter.generic.type					= MTYPE_SPINCONTROL;
	s_graphicsoptions.filter.generic.flags					= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.filter.generic.x						= x;
	s_graphicsoptions.filter.generic.y						= y;
	s_graphicsoptions.filter.textEnum						= MBT_VIDEOTEXTUREFILTER;
	s_graphicsoptions.filter.textcolor						= CT_BLACK;
	s_graphicsoptions.filter.textcolor2						= CT_WHITE;
	s_graphicsoptions.filter.color							= CT_DKPURPLE1;
	s_graphicsoptions.filter.color2							= CT_LTPURPLE1;
	s_graphicsoptions.filter.textX							= 5;
	s_graphicsoptions.filter.textY							= 2;
	s_graphicsoptions.filter.listnames						= s_filter_Names;
	s_graphicsoptions.filter.width					= width;

	y += inc;
	// references/modifies "r_lowEndVideo"
	s_graphicsoptions.simpleshaders.generic.type				= MTYPE_SPINCONTROL;
	s_graphicsoptions.simpleshaders.generic.flags				= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.simpleshaders.generic.x					= x;
	s_graphicsoptions.simpleshaders.generic.y					= y;
	s_graphicsoptions.simpleshaders.textEnum					= MBT_SIMPLESHADER;
	s_graphicsoptions.simpleshaders.textcolor					= CT_BLACK;
	s_graphicsoptions.simpleshaders.textcolor2				= CT_WHITE;
	s_graphicsoptions.simpleshaders.color						= CT_DKPURPLE1;
	s_graphicsoptions.simpleshaders.color2					= CT_LTPURPLE1;
	s_graphicsoptions.simpleshaders.textX						= 5;
	s_graphicsoptions.simpleshaders.textY						= 2;
	s_graphicsoptions.simpleshaders.listnames					= s_OffOnNone_Names;
	s_graphicsoptions.simpleshaders.width					= width;

	y += inc;
	// references/modifies "r_ext_compress_textures"
	s_graphicsoptions.compresstextures.generic.type				= MTYPE_SPINCONTROL;
	s_graphicsoptions.compresstextures.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS;
	s_graphicsoptions.compresstextures.generic.x				= x;
	s_graphicsoptions.compresstextures.generic.y				= y;
	s_graphicsoptions.compresstextures.textEnum					= MBT_COMPRESSEDTEXTURES;
	s_graphicsoptions.compresstextures.textcolor				= CT_BLACK;
	s_graphicsoptions.compresstextures.textcolor2				= CT_WHITE;
	s_graphicsoptions.compresstextures.color					= CT_DKPURPLE1;
	s_graphicsoptions.compresstextures.color2					= CT_LTPURPLE1;
	s_graphicsoptions.compresstextures.textX					= 5;
	s_graphicsoptions.compresstextures.textY					= 2;
	s_graphicsoptions.compresstextures.listnames				= s_OffOnNone_Names;
	s_graphicsoptions.compresstextures.width					= width;

	s_graphicsoptions.apply.generic.type				= MTYPE_ACTION;
	s_graphicsoptions.apply.generic.flags				= QMF_HIGHLIGHT_IF_FOCUS|QMF_GRAYED;
	s_graphicsoptions.apply.generic.x					= 501;
	s_graphicsoptions.apply.generic.y					= 245;
	s_graphicsoptions.apply.generic.callback			= GraphicsOptions_ApplyChanges;
	s_graphicsoptions.apply.textEnum					= MBT_VIDEOAPPLYCHANGES;
	s_graphicsoptions.apply.textcolor					= CT_BLACK;
	s_graphicsoptions.apply.textcolor2					= CT_WHITE;
	s_graphicsoptions.apply.textcolor3					= CT_LTGREY;
	s_graphicsoptions.apply.color						= CT_DKPURPLE1;
	s_graphicsoptions.apply.color2						= CT_LTPURPLE1;
	s_graphicsoptions.apply.color3						= CT_DKGREY;
	s_graphicsoptions.apply.textX						= 5;
	s_graphicsoptions.apply.textY						= 80;
	s_graphicsoptions.apply.width						= 110;
	s_graphicsoptions.apply.height						= 100;

	SetupMenu_TopButtons(&s_videodata.menu,MENU_VIDEODATA,&s_graphicsoptions.apply);

	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.list);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.allow_extensions);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.aspectRatio);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.mode);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.colordepth);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.fs);
//	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.lighting);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.geometry);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.tq);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.texturebits);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.filter);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.simpleshaders);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.compresstextures);
	Menu_AddItem( &s_videodata.menu, ( void * )&s_graphicsoptions.apply);


	Video_SideButtons(&s_videodata.menu,ID_VIDEODATA);

	GraphicsOptions_SetMenuItems();
	GraphicsOptions_GetInitialVideo();

	/*if ( uis.glconfig.driverType == GLDRV_ICD &&
		 uis.glconfig.hardwareType == GLHW_3DFX_2D3D )
	{
		s_graphicsoptions.driver.generic.flags |= QMF_HIDDEN|QMF_INACTIVE;
	}*/
}


/*
=================
UI_VideoDataMenu
=================
*/
void UI_VideoDataMenu( void )
{
	VideoData_MenuInit();

	UI_PushMenu( &s_videodata.menu );
}

/*
=================
Video_SideButtons
=================
*/
void Video_SideButtons(menuframework_s *menu,int menuType)
{

	// Button Data
	s_video_data.generic.type				= MTYPE_BITMAP;
	s_video_data.generic.flags				= QMF_HIGHLIGHT_IF_FOCUS;
	s_video_data.generic.x					= video_sidebuttons[0][0];
	s_video_data.generic.y					= video_sidebuttons[0][1];
	s_video_data.generic.name				= GRAPHIC_SQUARE;
	s_video_data.generic.id					= ID_VIDEODATA;
	if (menuType == ID_VIDEODATA)
	{
		s_video_data.generic.callback			= VideoSideButtons_MenuEvent;
	}
	else
	{
		s_video_data.generic.callback			= Video_MenuEvent;
	}
	s_video_data.width						= MENU_BUTTON_MED_WIDTH - 10;
	s_video_data.height						= MENU_BUTTON_MED_HEIGHT;
	s_video_data.color						= CT_DKPURPLE1;
	s_video_data.color2						= CT_LTPURPLE1;
	s_video_data.textX						= 5;
	s_video_data.textY						= 2;
	s_video_data.textEnum					= MBT_VIDEODATA;
	if (menuType == ID_VIDEODATA)
	{
		s_video_data.textcolor				= CT_WHITE;
		s_video_data.textcolor2				= CT_WHITE;
		s_video_data.generic.flags			= QMF_GRAYED;
	}
	else
	{
		s_video_data.textcolor				= CT_BLACK;
		s_video_data.textcolor2				= CT_WHITE;
	}

	s_video_data2.generic.type				= MTYPE_BITMAP;
	s_video_data2.generic.flags				= QMF_HIGHLIGHT_IF_FOCUS;
	s_video_data2.generic.x					= video_sidebuttons[1][0];
	s_video_data2.generic.y					= video_sidebuttons[1][1];
	s_video_data2.generic.name				= GRAPHIC_SQUARE;
	s_video_data2.generic.id				= ID_VIDEODATA2;
	if (menuType == ID_VIDEODATA)
	{
		s_video_data2.generic.callback			= VideoSideButtons_MenuEvent;
	}
	else
	{
		s_video_data2.generic.callback			= Video_MenuEvent;
	}
	s_video_data2.width						= MENU_BUTTON_MED_WIDTH - 10;
	s_video_data2.height					= MENU_BUTTON_MED_HEIGHT;
	s_video_data2.color						= CT_DKPURPLE1;
	s_video_data2.color2					= CT_LTPURPLE1;
	s_video_data2.textX						= 5;
	s_video_data2.textY						= 2;
	s_video_data2.textEnum					= MBT_VIDEODATA2;
	s_video_data2.textcolor					= CT_WHITE;
	s_video_data2.textcolor2				= CT_WHITE;
	if (menuType == ID_VIDEODATA2)
	{
		s_video_data2.textcolor				= CT_WHITE;
		s_video_data2.textcolor2			= CT_WHITE;
		s_video_data2.generic.flags			= QMF_GRAYED;
	}
	else
	{
		s_video_data2.textcolor				= CT_BLACK;
		s_video_data2.textcolor2			= CT_WHITE;
	}

	s_video_drivers.generic.type			= MTYPE_BITMAP;
	s_video_drivers.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS;
	s_video_drivers.generic.x				= video_sidebuttons[2][0];
	s_video_drivers.generic.y				= video_sidebuttons[2][1];
	s_video_drivers.generic.name			= GRAPHIC_SQUARE;
	s_video_drivers.generic.id				= ID_VIDEODRIVERS;
	if (menuType == ID_VIDEODATA)
	{
		s_video_drivers.generic.callback			= VideoSideButtons_MenuEvent;
	}
	else
	{
		s_video_drivers.generic.callback			= Video_MenuEvent;
	}
	s_video_drivers.width					= MENU_BUTTON_MED_WIDTH - 10;
	s_video_drivers.height					= MENU_BUTTON_MED_HEIGHT;
	s_video_drivers.color					= CT_DKPURPLE1;
	s_video_drivers.color2					= CT_LTPURPLE1;
	s_video_drivers.textX					= 5;
	s_video_drivers.textY					= 2;
	s_video_drivers.textEnum				= MBT_VIDEODRIVERS;
	if (menuType == ID_VIDEODRIVERS)
	{
		s_video_drivers.textcolor			= CT_WHITE;
		s_video_drivers.textcolor2			= CT_WHITE;
		s_video_drivers.generic.flags		= QMF_GRAYED;
	}
	else
	{
		s_video_drivers.textcolor			= CT_BLACK;
		s_video_drivers.textcolor2			= CT_WHITE;
	}

	Menu_AddItem( menu, ( void * )&s_video_data);
	Menu_AddItem( menu, ( void * )&s_video_data2);
	Menu_AddItem( menu, ( void * )&s_video_drivers);

}


/*
=================
VideoDriver_Lines
=================
*/
void VideoDriver_Lines(int increment)
{
	int		i,i2;

	s_videodriver.currentDriverLine += increment;

	i=0;
	i2 = 0;

	i = (s_videodriver.currentDriverLine * 2);
	if (i<0)
	{
		s_videodriver.currentDriverLine = 0;
		return;
	}

	if (i>s_videodriver.driverCnt)
	{
		s_videodriver.currentDriverLine = (s_videodriver.driverCnt/2);
		return;
	}
	else if (i==s_videodriver.driverCnt)
	{
		s_videodriver.currentDriverLine = (s_videodriver.driverCnt/2) - 1;
		return;
	}

	if (!s_videodriver.drivers[i + 22])
	{
		s_videodriver.currentDriverLine -= increment;
		s_videodriver.activeArrowDwn = qfalse;
		return;
	}

	for (; i < MAX_VID_DRIVERS; i++)
	{
		if (s_videodriver.drivers[i])
		{
			if (i2<24)
			{
				((menutext_s *)g_videolines[i2])->string	= s_videodriver.drivers[i];
				i2++;
			}
		}
		else
		{
			if (i2<24)
			{
				((menutext_s *)g_videolines[i2])->string	= NULL;
				i2++;
			}
			else
			{
				break;
			}
		}
	}

	// Set up arrows

	if (increment > 0)
	{
		s_videodriver.activeArrowUp = qtrue;
	}

	if (s_videodriver.currentDriverLine < 1)
	{
		s_videodriver.activeArrowUp = qfalse;
	}

	if (i2>= 24)
	{
		s_videodriver.activeArrowDwn = qtrue;
	}

	i = (s_videodriver.currentDriverLine * 2);
	if (!s_videodriver.drivers[i + 24])
	{
		s_videodriver.activeArrowDwn = qfalse;
		return;
	}

}

/*
=================
VideoDriver_LineSetup
=================
*/
void VideoDriver_LineSetup(void)
{
	char	*bufhold;
	char	*eptr;
	int		i;

	strcpy( s_videodriver.extensionsString, uis.glconfig.extensions_string );
	eptr = s_videodriver.extensionsString;
	i=0;

	s_videodriver.driverCnt = 0;

	while ( i < MAX_VID_DRIVERS && *eptr )
	{
		while ( *eptr )
		{
			bufhold = eptr;

			while(*bufhold !=  ' ')
			{
				++bufhold;
			}
			*bufhold = 0;

			s_videodriver.drivers[i] = eptr;

			if (i<24)
			{
				((menutext_s *)g_videolines[i])->string	= eptr;
			}

			bufhold++;
			eptr = bufhold;
			s_videodriver.driverCnt++;
			i++;
		}
	}

	// Set down arrows
	if (i> 24)
	{
		s_videodriver.activeArrowDwn = qtrue;
	}

	s_videodriver.currentDriverLine = 0;

}

/*
=================
VideoDriver_MenuKey
=================
*/
sfxHandle_t VideoDriver_MenuKey (int key)
{
	return ( Menu_DefaultKey( &s_videodriver.menu, key ) );
}

/*
=================
M_VideoDriverMenu_Graphics
=================
*/
void M_VideoDriverMenu_Graphics (void)
{
	float labelColor[] = { 0, 1.0, 0, 1.0 };
	float textColor[] = { 1, 1, 1, 1 };
	int x,y,x2;

	UI_MenuFrame(&s_videodriver.menu);

	UI_DrawProportionalString(  74,  66, "207",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  84, "44909",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  188, "357",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  206, "250624",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  395, "456730-1",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);

	UI_Setup_MenuButtons();

	// Top Frame
	UI_DrawHandlePic( 178, 136,  32, -32, s_videodriver.corner_ll_8_16);	// UL
	UI_DrawHandlePic( 178, 221,  32,  32, s_videodriver.corner_ll_8_16);	// LL
	UI_DrawHandlePic( 556, 136, -32, -32, s_videodriver.corner_ll_8_16);	// UR
	UI_DrawHandlePic( 556, 221, -32,  32, s_videodriver.corner_ll_8_16);	// LR
	UI_DrawHandlePic(194,157, 378,  8, uis.whiteShader);	// Top line
	UI_DrawHandlePic(178,165,  16, 60, uis.whiteShader);	// Left side
	UI_DrawHandlePic(572,165,  16, 60, uis.whiteShader);	// Right side
	UI_DrawHandlePic(194,224, 378,  8, uis.whiteShader);	// Bottom line


	// Lower Frame
	UI_DrawHandlePic( 178, 226,  32, -32, s_videodriver.corner_ll_16_16);	// UL
	UI_DrawHandlePic( 178, 414,  32,  32, s_videodriver.corner_ll_16_16);	// LL
	UI_DrawHandlePic( 556, 226, -32, -32, s_videodriver.corner_ll_16_16);	// UR
	UI_DrawHandlePic( 556, 414, -32,  32, s_videodriver.corner_ll_16_16);	// LR

	UI_DrawHandlePic( 194, 237, 378,  16, uis.whiteShader);	// Top line
	UI_DrawHandlePic( 178, 252,  16, 168, uis.whiteShader);	// Left side

	UI_DrawHandlePic( 572, 261,  16,  15, uis.whiteShader);	// Right side
	UI_DrawHandlePic( 572, 279,  16, 114, uis.whiteShader);	// Right side
	UI_DrawHandlePic( 572, 396,  16,  15, uis.whiteShader);	// Right side

	UI_DrawHandlePic( 194, 419, 378,  16, uis.whiteShader);	// Bottom line

	trap_R_SetColor( colorTable[CT_LTGOLD1]);
	if (s_videodriver.activeArrowUp)
	{
		UI_DrawHandlePic( 382, 237, 32,  -14, s_videodriver.arrow_dn);
	}

	if (s_videodriver.activeArrowDwn)
	{
		UI_DrawHandlePic( 382, 422, 32,   14, s_videodriver.arrow_dn);
	}

	x = 204;
	x2 = 259;
	y = 168;
	UI_DrawProportionalString( x, y, menu_normal_text[MNT_VENDOR], UI_LEFT|UI_TINYFONT, labelColor );
	UI_DrawProportionalString( x2, y, uis.glconfig.vendor_string, UI_LEFT|UI_TINYFONT, textColor );
	y += 14;
	UI_DrawProportionalString( x, y, menu_normal_text[MNT_VERSION], UI_LEFT|UI_TINYFONT, labelColor );
	UI_DrawProportionalString( x2, y, uis.glconfig.version_string, UI_LEFT|UI_TINYFONT, textColor );
	y += 14;
	UI_DrawProportionalString( x, y, menu_normal_text[MNT_RENDERER], UI_LEFT|UI_TINYFONT, labelColor );
	UI_DrawProportionalString( x2, y, uis.glconfig.renderer_string, UI_LEFT|UI_TINYFONT, textColor );
	y += 14;
	UI_DrawProportionalString( x, y, menu_normal_text[MNT_PIXELFORMAT], UI_LEFT|UI_TINYFONT, labelColor );
	UI_DrawProportionalString( x2, y, va("color(%d-bits) Z(%d-bit) stencil(%d-bits)", uis.glconfig.colorBits, uis.glconfig.depthBits, uis.glconfig.stencilBits), UI_LEFT|UI_TINYFONT, textColor );

}

/*
=================
VideoDriver_MenuDraw
=================
*/
static void VideoDriver_MenuDraw (void)
{

	M_VideoDriverMenu_Graphics();

	Menu_Draw( &s_videodriver.menu );
}

/*
=================
UI_VideoDriverMenu_Cache
=================
*/
void UI_VideoDriverMenu_Cache(void)
{
	s_videodriver.corner_ll_16_16 = trap_R_RegisterShaderNoMip("menu/common/corner_ll_16_16.tga");
	s_videodriver.corner_ll_8_16 = trap_R_RegisterShaderNoMip("menu/common/corner_ll_8_16.tga");
	s_videodriver.arrow_dn = trap_R_RegisterShaderNoMip("menu/common/arrow_dn_16.tga");
}


/*
=================
Video_MenuInit
=================
*/
static void VideoDriver_MenuInit( void )
{
	int		i,x,y,x2;

	UI_VideoDriverMenu_Cache();

	s_videodriver.menu.nitems					= 0;
	s_videodriver.menu.wrapAround				= qtrue;
//	s_videodriver.menu.opening					= NULL;
//	s_videodriver.menu.closing					= NULL;
	s_videodriver.menu.draw						= VideoDriver_MenuDraw;
	s_videodriver.menu.key						= VideoDriver_MenuKey;
	s_videodriver.menu.fullscreen				= qtrue;
	s_videodriver.menu.descX					= MENU_DESC_X;
	s_videodriver.menu.descY					= MENU_DESC_Y;
	s_videodriver.menu.listX					= 230;
	s_videodriver.menu.listY					= 188;
	s_videodriver.menu.titleX					= MENU_TITLE_X;
	s_videodriver.menu.titleY					= MENU_TITLE_Y;
	s_videodriver.menu.titleI					= MNT_CONTROLSMENU_TITLE;
	s_videodriver.menu.footNoteEnum				= MNT_VIDEODRIVER;

	SetupMenu_TopButtons(&s_videodriver.menu,MENU_VIDEO,NULL);

	Video_SideButtons(&s_videodriver.menu,ID_VIDEODRIVERS);

	s_videodriver.arrowup.generic.type				= MTYPE_BITMAP;
	s_videodriver.arrowup.generic.flags				= QMF_HIGHLIGHT_IF_FOCUS;
	s_videodriver.arrowup.generic.x					= 572;
	s_videodriver.arrowup.generic.y					= 262;
	s_videodriver.arrowup.generic.name				= "menu/common/arrow_up_16.tga";
	s_videodriver.arrowup.generic.id				= ID_ARROWUP;
	s_videodriver.arrowup.generic.callback			= Video_MenuEvent;
	s_videodriver.arrowup.width						= 16;
	s_videodriver.arrowup.height					= 16;
	s_videodriver.arrowup.color						= CT_DKBLUE1;
	s_videodriver.arrowup.color2					= CT_LTBLUE1;
	s_videodriver.arrowup.textX						= 0;
	s_videodriver.arrowup.textY						= 0;
	s_videodriver.arrowup.textEnum					= MBT_NONE;
	s_videodriver.arrowup.textcolor					= CT_BLACK;
	s_videodriver.arrowup.textcolor2				= CT_WHITE;
	Menu_AddItem( &s_videodriver.menu,( void * ) &s_videodriver.arrowup);

	s_videodriver.arrowdwn.generic.type				= MTYPE_BITMAP;
	s_videodriver.arrowdwn.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS;
	s_videodriver.arrowdwn.generic.x				= 572;
	s_videodriver.arrowdwn.generic.y				= 397;
	s_videodriver.arrowdwn.generic.name				= "menu/common/arrow_dn_16.tga";
	s_videodriver.arrowdwn.generic.id				= ID_ARROWDWN;
	s_videodriver.arrowdwn.generic.callback			= Video_MenuEvent;
	s_videodriver.arrowdwn.width					= 16;
	s_videodriver.arrowdwn.height					= 16;
	s_videodriver.arrowdwn.color					= CT_DKBLUE1;
	s_videodriver.arrowdwn.color2					= CT_LTBLUE1;
	s_videodriver.arrowdwn.textX					= 0;
	s_videodriver.arrowdwn.textY					= 0;
	s_videodriver.arrowdwn.textEnum					= MBT_NONE;
	s_videodriver.arrowdwn.textcolor				= CT_BLACK;
	s_videodriver.arrowdwn.textcolor2				= CT_WHITE;
	Menu_AddItem( &s_videodriver.menu, ( void * ) &s_videodriver.arrowdwn);

	s_videodriver.activeArrowDwn = qfalse;
	s_videodriver.activeArrowUp = qfalse;

	x = 204;
	x2 = 404;
	y = 260;

	for (i=0;i<24;i++)
	{
		((menutext_s *)g_videolines[i])->generic.type		= MTYPE_TEXT;
		((menutext_s *)g_videolines[i])->generic.flags		= QMF_LEFT_JUSTIFY | QMF_INACTIVE;
		((menutext_s *)g_videolines[i])->generic.y			= y;
		if ((i % 2 ) == 0)
		{
			((menutext_s *)g_videolines[i])->generic.x			= x;
		}
		else
		{
			((menutext_s *)g_videolines[i])->generic.x			= x2;
			y +=13;
		}


		((menutext_s *)g_videolines[i])->buttontextEnum		= MBT_NONE;
		((menutext_s *)g_videolines[i])->style				= UI_TINYFONT | UI_LEFT;
		((menutext_s *)g_videolines[i])->color				= colorTable[CT_LTPURPLE1];
		Menu_AddItem( &s_videodriver.menu, ( void * )g_videolines[i]);

	}

	// Print extensions
	VideoDriver_LineSetup();
}


/*
=================
UI_VideoDriverMenu
=================
*/
void UI_VideoDriverMenu( void )
{
	if (!s_videodriver.menu.initialized)
	{
		VideoDriver_MenuInit();
	}

	UI_PushMenu( &s_videodriver.menu );
}

/*
=================
GammaCallback2
=================
*/
void GammaCallback2( void *s, int notification )
{
	if (notification != QM_ACTIVATED)
		return;

	s_videodata2.apply_action2.generic.flags &= ~QMF_GRAYED;
	s_videodata2.apply_action2.generic.flags |= QMF_BLINK;

	GammaCallback(s,notification );

}


/*
=================
M_VideoData2Menu_Graphics
=================
*/
void M_VideoData2Menu_Graphics (void)
{
	int y;

	UI_MenuFrame(&s_videodata2.menu);

	UI_DrawProportionalString(  74,  66, "925",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  84, "88PK",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  188, "8125",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  206, "358677",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
	UI_DrawProportionalString(  74,  395, "3-679",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);

	UI_Setup_MenuButtons();

	y = 191;
	if (uis.glconfig.deviceSupportsGamma)
	{
		trap_R_SetColor( colorTable[CT_DKGREY]);
		UI_DrawHandlePic(  178, y, 68, 68, uis.whiteShader);	//
		trap_R_SetColor( colorTable[CT_WHITE]);
		UI_DrawHandlePic(  180, y+2, 64, 64, s_videodata2.gamma);	// Starfleet graphic

		UI_DrawProportionalString( 256,  y + 5, menu_normal_text[MNT_GAMMA_LINE1],UI_SMALLFONT, colorTable[CT_LTGOLD1]);
		UI_DrawProportionalString( 256,  y + 25, menu_normal_text[MNT_GAMMA_LINE2],UI_SMALLFONT, colorTable[CT_LTGOLD1]);
		UI_DrawProportionalString( 256,  y + 45, menu_normal_text[MNT_GAMMA_LINE3],UI_SMALLFONT,colorTable[CT_LTGOLD1]);
	}
	else
	{
		UI_DrawProportionalString( 178,  y + 5, menu_normal_text[MNT_GAMMA2_LINE1],UI_SMALLFONT, colorTable[CT_LTGOLD1]);
		UI_DrawProportionalString( 178,  y + 25,menu_normal_text[MNT_GAMMA2_LINE2],UI_SMALLFONT, colorTable[CT_LTGOLD1]);
	}


	// Brackets around Video Data
	trap_R_SetColor( colorTable[CT_LTPURPLE1]);
	UI_DrawHandlePic(158,163, 16, 16, uis.graphicBracket1CornerLU);
	UI_DrawHandlePic(158,179,  8, 233, uis.whiteShader);
	UI_DrawHandlePic(158,412, 16, -16, uis.graphicBracket1CornerLU);	//LD

	UI_DrawHandlePic(174,163, 408, 8, uis.whiteShader);	// Top line

	UI_DrawHandlePic(579,163, 32, 16, s_videodata2.top);	// Corner, UR
	UI_DrawHandlePic(581,179, 30, 121, uis.whiteShader);	// Top right column
	UI_DrawHandlePic(581,303, 30, 109, uis.whiteShader);	// Bottom right column
	UI_DrawHandlePic(579,412, 32, -16, s_videodata2.top);	// Corner, LR

	UI_DrawHandlePic(174,420, 408, 8, uis.whiteShader);	// Bottom line
}

/*
=================
VideoData2_MenuDraw
=================
*/
static void VideoData2_MenuDraw (void)
{

	M_VideoData2Menu_Graphics();

	Menu_Draw( &s_videodata2.menu );
}


/*
=================
UI_VideoData2Menu_Cache
=================
*/
void UI_VideoData2Menu_Cache(void)
{
	s_videodata2.top = trap_R_RegisterShaderNoMip("menu/common/corner_ur_8_30.tga");
	s_videodata2.gamma = trap_R_RegisterShaderNoMip("menu/special/gamma_test.tga");
	trap_R_RegisterShaderNoMip(PIC_MONBAR2);
	trap_R_RegisterShaderNoMip(PIC_SLIDER);
}

/*
=================
VideoData2_MenuInit
=================
*/
static void VideoData2_MenuInit( void )
{
	int x,y;

	UI_VideoData2Menu_Cache();

	// Menu Data
	s_videodata2.menu.nitems						= 0;
	s_videodata2.menu.wrapAround					= qtrue;
//	s_videodata2.menu.opening						= NULL;
//	s_videodata2.menu.closing						= NULL;
	s_videodata2.menu.draw							= VideoData2_MenuDraw;
	s_videodata2.menu.fullscreen					= qtrue;
	s_videodata2.menu.descX							= MENU_DESC_X;
	s_videodata2.menu.descY							= MENU_DESC_Y;
	s_videodata2.menu.listX							= 230;
	s_videodata2.menu.listY							= 188;
	s_videodata2.menu.titleX						= MENU_TITLE_X;
	s_videodata2.menu.titleY						= MENU_TITLE_Y;
	s_videodata2.menu.titleI						= MNT_CONTROLSMENU_TITLE;
	s_videodata2.menu.footNoteEnum					= MNT_VIDEOSETUP;

	SetupMenu_TopButtons(&s_videodata2.menu,MENU_VIDEO,NULL);

	Video_SideButtons(&s_videodata2.menu,ID_VIDEODATA2);

	x = 180;
	y = 269;
	s_videodata2.gamma_slider.generic.type		= MTYPE_SLIDER;
	s_videodata2.gamma_slider.generic.x			= x + 162;
	s_videodata2.gamma_slider.generic.y			= y;
	s_videodata2.gamma_slider.generic.flags		= QMF_SMALLFONT;
	s_videodata2.gamma_slider.generic.callback	= GammaCallback2;
	s_videodata2.gamma_slider.minvalue			= 5;
	s_videodata2.gamma_slider.maxvalue			= 30;
	s_videodata2.gamma_slider.color				= CT_DKPURPLE1;
	s_videodata2.gamma_slider.color2			= CT_LTPURPLE1;
	s_videodata2.gamma_slider.generic.name		= PIC_MONBAR2;
	s_videodata2.gamma_slider.width				= 256;
	s_videodata2.gamma_slider.height			= 32;
	s_videodata2.gamma_slider.focusWidth		= 145;
	s_videodata2.gamma_slider.focusHeight		= 18;
	s_videodata2.gamma_slider.picName			= GRAPHIC_SQUARE;
	s_videodata2.gamma_slider.picX				= x;
	s_videodata2.gamma_slider.picY				= y;
	s_videodata2.gamma_slider.picWidth			= MENU_BUTTON_MED_WIDTH + 21;
	s_videodata2.gamma_slider.picHeight			= MENU_BUTTON_MED_HEIGHT;
	s_videodata2.gamma_slider.textX				= MENU_BUTTON_TEXT_X;
	s_videodata2.gamma_slider.textY				= MENU_BUTTON_TEXT_Y;
	s_videodata2.gamma_slider.textEnum			= MBT_BRIGHTNESS;
	s_videodata2.gamma_slider.textcolor			= CT_BLACK;
	s_videodata2.gamma_slider.textcolor2		= CT_WHITE;
	s_videodata2.gamma_slider.thumbName			= PIC_SLIDER;
	s_videodata2.gamma_slider.thumbHeight		= 32;
	s_videodata2.gamma_slider.thumbWidth		= 16;
	s_videodata2.gamma_slider.thumbGraphicWidth	= 9;
	s_videodata2.gamma_slider.thumbColor		= CT_DKBLUE1;
	s_videodata2.gamma_slider.thumbColor2		= CT_LTBLUE1;

	s_videodata2.apply_action2.generic.type				= MTYPE_ACTION;
	s_videodata2.apply_action2.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS|QMF_GRAYED;
	s_videodata2.apply_action2.generic.x				= 490;
	s_videodata2.apply_action2.generic.y				= 191;
	s_videodata2.apply_action2.generic.callback			= ApplyChanges2;
	s_videodata2.apply_action2.textEnum					= MBT_ACCEPT;
	s_videodata2.apply_action2.textcolor				= CT_BLACK;
	s_videodata2.apply_action2.textcolor2				= CT_WHITE;
	s_videodata2.apply_action2.textcolor3				= CT_LTGREY;
	s_videodata2.apply_action2.color					= CT_DKPURPLE1;
	s_videodata2.apply_action2.color2					= CT_LTPURPLE1;
	s_videodata2.apply_action2.color3					= CT_DKGREY;
	s_videodata2.apply_action2.textX					= 5;
	s_videodata2.apply_action2.textY					= 30;
	s_videodata2.apply_action2.width					= 82;
	s_videodata2.apply_action2.height					= 70;

	y = 330;
	s_videodata2.screensize_slider.generic.type		= MTYPE_SLIDER;
	s_videodata2.screensize_slider.generic.x		= x + 162;
	s_videodata2.screensize_slider.generic.y		= y;
	s_videodata2.screensize_slider.generic.flags	= QMF_SMALLFONT;
	s_videodata2.screensize_slider.generic.callback	= ScreensizeCallback;
	s_videodata2.screensize_slider.minvalue			= 30;
	s_videodata2.screensize_slider.maxvalue			= 100;
	s_videodata2.screensize_slider.color			= CT_DKPURPLE1;
	s_videodata2.screensize_slider.color2			= CT_LTPURPLE1;
	s_videodata2.screensize_slider.generic.name		= PIC_MONBAR2;
	s_videodata2.screensize_slider.width			= 256;
	s_videodata2.screensize_slider.height			= 32;
	s_videodata2.screensize_slider.focusWidth		= 145;
	s_videodata2.screensize_slider.focusHeight		= 18;
	s_videodata2.screensize_slider.picName			= GRAPHIC_SQUARE;
	s_videodata2.screensize_slider.picX				= x;
	s_videodata2.screensize_slider.picY				= y;
	s_videodata2.screensize_slider.picWidth			= MENU_BUTTON_MED_WIDTH + 21;
	s_videodata2.screensize_slider.picHeight		= MENU_BUTTON_MED_HEIGHT;
	s_videodata2.screensize_slider.textX			= MENU_BUTTON_TEXT_X;
	s_videodata2.screensize_slider.textY			= MENU_BUTTON_TEXT_Y;
	s_videodata2.screensize_slider.textEnum			= MBT_SCREENSIZE;
	s_videodata2.screensize_slider.textcolor		= CT_BLACK;
	s_videodata2.screensize_slider.textcolor2		= CT_WHITE;
	s_videodata2.screensize_slider.thumbName		= PIC_SLIDER;
	s_videodata2.screensize_slider.thumbHeight		= 32;
	s_videodata2.screensize_slider.thumbWidth		= 16;
	s_videodata2.screensize_slider.thumbGraphicWidth= 9;
	s_videodata2.screensize_slider.thumbColor		= CT_DKBLUE1;
	s_videodata2.screensize_slider.thumbColor2		= CT_LTBLUE1;

	y += 34;
	s_videodata2.anisotropicfiltering.generic.type			= MTYPE_SPINCONTROL;
	s_videodata2.anisotropicfiltering.generic.flags			= QMF_HIGHLIGHT_IF_FOCUS;
	s_videodata2.anisotropicfiltering.generic.x				= x;
	s_videodata2.anisotropicfiltering.generic.y				= y;
	s_videodata2.anisotropicfiltering.generic.name			= GRAPHIC_BUTTONRIGHT;
	s_videodata2.anisotropicfiltering.generic.callback		= AnisotropicFilteringCallback;
	s_videodata2.anisotropicfiltering.color					= CT_DKPURPLE1;
	s_videodata2.anisotropicfiltering.color2					= CT_LTPURPLE1;
	s_videodata2.anisotropicfiltering.textX					= MENU_BUTTON_TEXT_X;
	s_videodata2.anisotropicfiltering.textY					= MENU_BUTTON_TEXT_Y;
	s_videodata2.anisotropicfiltering.textEnum				= MBT_ANISOTROPICFILTERING;
	s_videodata2.anisotropicfiltering.textcolor				= CT_BLACK;
	s_videodata2.anisotropicfiltering.textcolor2				= CT_WHITE;
	s_videodata2.anisotropicfiltering.listnames				= s_OffOnNone_Names;


	Menu_AddItem( &s_videodata2.menu, ( void * )&s_videodata2.gamma_slider);
	if (!uis.glconfig.deviceSupportsGamma)
	{
		Menu_AddItem( &s_videodata2.menu, ( void * )&s_videodata2.apply_action2);
	}
	Menu_AddItem( &s_videodata2.menu, ( void * )&s_videodata2.screensize_slider);
	Menu_AddItem( &s_videodata2.menu, ( void * )&s_videodata2.anisotropicfiltering);

}

/*
=================
UI_VideoData2SettingsGetCvars
=================
*/
static void	UI_VideoData2SettingsGetCvars(void)
{
	s_videodata2.gamma_slider.curvalue = trap_Cvar_VariableValue( "r_gamma" ) *  10.0f;
	s_videodata2.screensize_slider.curvalue = trap_Cvar_VariableValue( "cg_viewsize" );
	s_videodata2.anisotropicfiltering.curvalue = trap_Cvar_VariableValue( "r_ext_texture_filter_anisotropic" );
}

/*
=================
UI_VideoData2SettingsMenu
=================
*/
void UI_VideoData2SettingsMenu( void )
{
	UI_VideoData2SettingsGetCvars();

	if (!s_videodata2.menu.initialized)
	{
		VideoData2_MenuInit();
	}

	UI_PushMenu( &s_videodata2.menu );
}

