
// REFERENCE
// =========
_TYPE 	= 0;
_HIDDEN = -1;

INIT_TRUE = true;
INIT_FALSE = false;


TOTAL_FIELDS		= 26;
TOTAL_TEMPLATES		= 3;		// NOT USED?
TOTAL_STATS			= 6;
TOTAL_EQUIPS		= 3;
TOTAL_CLASSES		= 9;

DEFAULT_STATS		= 0;
DEFAULT_EQUIPS		= 1;


// TEMPLATES
// =========
TEMPLATE_WEAPON		= 0;
TEMPLATE_ARMOR		= 1;
TEMPLATE_OTHER		= 2;

DEFAULT_TEMPLATE = TEMPLATE_WEAPON;


// IDS
// ===
ID_TITLE 			= 0;
ID_BINDING			= 1;
ID_UNIQUE			= 2;
ID_WEAPONTYPE_SKILL	= 3;
ID_ARMORSLOT_SKILL	= 4;
ID_DAMAGE_SPEED		= 5;
ID_DPS				= 6;
ID_ARMOR_ARMOR		= 7;
ID_ARMOR_WEAPON		= 8;
ID_STAT_1			= 9;
ID_STAT_2			= 10;
ID_STAT_3			= 11;
ID_STAT_4			= 12;
ID_STAT_5			= 13;
ID_STAT_6			= 14;
ID_ENCHANT			= 15;
ID_CLASSES			= 16;
ID_DURABILITY		= 17;
ID_REQUIRES			= 18;
ID_CHANCE			= 19;
ID_USE				= 20;
ID_EQUIP_1			= 21;
ID_EQUIP_2			= 22;
ID_EQUIP_3			= 23;
ID_CHARGES			= 24
ID_YELLOW			= 25;


// SIZE
// ====
SIZE_TITLE			= 100;


// TYPE
// ====
TYPE_NORMAL			= 0;
TYPE_NORMALWRAP		= 1;
TYPE_BINDING		= 2;
TYPE_UNIQUE			= 3;
TYPE_DURATION		= 4;
TYPE_TYPE_SKILL		= 5;
TYPE_SLOT_SKILL		= 6;
TYPE_DAMAGE_SPEED	= 7;
TYPE_DPS			= 8;
TYPE_ARMOR			= 9;
TYPE_STAT			= 10;
TYPE_CLASSES		= 11;
TYPE_DURABILITY		= 12;
TYPE_REQUIRES		= 13;
TYPE_CHANCE			= 14;
TYPE_USE			= 15;
TYPE_EQUIP			= 16;
TYPE_CHARGES		= 17;
TYPE_YELLOW			= 18;


// STYLE TYPE
// ==========
STYLE_TYPE = new Array();
STYLE_TYPE[ ID_TITLE ] 				= TYPE_NORMAL+SIZE_TITLE;
STYLE_TYPE[ ID_BINDING ] 			= TYPE_BINDING;
STYLE_TYPE[ ID_UNIQUE ] 			= TYPE_UNIQUE;
STYLE_TYPE[ ID_WEAPONTYPE_SKILL ] 	= TYPE_TYPE_SKILL;
STYLE_TYPE[ ID_ARMORSLOT_SKILL ] 	= TYPE_SLOT_SKILL;
STYLE_TYPE[ ID_DAMAGE_SPEED ] 		= TYPE_DAMAGE_SPEED;
STYLE_TYPE[ ID_DPS ] 				= TYPE_DPS;
STYLE_TYPE[ ID_ARMOR_ARMOR ] 		= TYPE_ARMOR;
STYLE_TYPE[ ID_ARMOR_WEAPON ]		= TYPE_ARMOR;
STYLE_TYPE[ ID_STAT_1 ] 			= TYPE_STAT;
STYLE_TYPE[ ID_STAT_2 ] 			= TYPE_STAT;
STYLE_TYPE[ ID_STAT_3 ] 			= TYPE_STAT;
STYLE_TYPE[ ID_STAT_4 ] 			= TYPE_STAT;
STYLE_TYPE[ ID_STAT_5 ] 			= TYPE_STAT;
STYLE_TYPE[ ID_STAT_6 ] 			= TYPE_STAT;
STYLE_TYPE[ ID_ENCHANT ] 			= TYPE_NORMAL;
STYLE_TYPE[ ID_CLASSES ] 			= TYPE_CLASSES;
STYLE_TYPE[ ID_DURABILITY ] 		= TYPE_DURABILITY;
STYLE_TYPE[ ID_REQUIRES ] 			= TYPE_REQUIRES;
STYLE_TYPE[ ID_CHANCE ] 			= TYPE_CHANCE;
STYLE_TYPE[ ID_USE ] 				= TYPE_USE;
STYLE_TYPE[ ID_EQUIP_1 ] 			= TYPE_EQUIP;
STYLE_TYPE[ ID_EQUIP_2 ] 			= TYPE_EQUIP;
STYLE_TYPE[ ID_EQUIP_3 ] 			= TYPE_EQUIP;
STYLE_TYPE[ ID_CHARGES ] 			= TYPE_CHARGES;
STYLE_TYPE[ ID_YELLOW ] 			= TYPE_YELLOW;


// COLOR
// =====
COLOR_GREY 		= 0;
COLOR_WHITE 	= 1;
COLOR_GREEN 	= 2;
COLOR_BLUE 		= 3;
COLOR_PURPLE 	= 4;
COLOR_ORANGE 	= 5;
COLOR_RED 		= 6;
COLOR_YELLOW 	= 7;


// DROPDOWN VALUES
// ===============
DROP_CUSTOM	= "Custom..";
DROP_NONE 	= "None";


// STATIC VALUES
DROP_ITEMTEMPLATE = new Array(
	"Weapon item",
	"Armor item",
	"Non-equipable item"
);

DROP_ITEMQUALITY = new Array(
	"Poor (Grey)",
	"Common (White)",
	"Uncommon (Green)",
	"Rare (Blue)",
	"Epic (Purple)",
	"Legendary (Orange)"
);

DROP_ITEMBINDING = new Array(
	DROP_NONE,
	"Bind on Pickup",
	"Bind on Equip",
	"Soulbound",
	"Quest Item"
);

DROP_ITEMUNIQUE = new Array(
	"No",
	"Yes"
);

DROP_ITEMREQUIRES = new Array(
	DROP_NONE,
	"Level",
	DROP_CUSTOM
);

DROP_ITEMSTATS = new Array(
	"Strength",
	"Stamina",
	"Agility",
	"Intellect",
	"Spirit",
	"Arcane Resistance",
	"Cold Resistance",
	"Fire Resistance",
	"Nature Resistance",
	"Shadow Resistance",
	"All Resistances",
	DROP_CUSTOM
);

DROP_ENCHANTS = new Array(
	DROP_NONE,
	"Strength",
	"Stamina",
	"Agility",
	"Intellect",
	"Spirit",
	DROP_CUSTOM
);


// DYNAMIC VALUES
DROP_TYPE_SLOT = new Array();
DROP_TYPE_SLOT[ TEMPLATE_WEAPON ] = new Array(
	"Main Hand",
	"Off-Hand",
	"One-Hand",
	"Ranged",
	"Thrown",
	"Two-Hand"
);
DROP_TYPE_SLOT[ TEMPLATE_ARMOR ] = new Array(
	"Back",
	"Chest",
	"Feet",
	"Finger",
	"Hands",
	"Head",
	"Held in Off-Hand",
	"Legs",
	"Neck",
	"Off-Hand",
	"Shirt",
	"Shoulder",
	"Tabard",
	"Trinket",
	"Waist",
	"Wrist"
);
DROP_TYPE_SLOT[ TEMPLATE_OTHER ] = new Array( "" );

DROP_SKILL = new Array();
DROP_SKILL[ TEMPLATE_WEAPON ] = new Array(
	"Hidden",
	"Axe",
	"Bow",
	"Crossbow",
	"Dagger",
	"Fishing Pole",
	"Fist Weapon",
	"Gun",
	"Mace",
	"Polearm",
	"Staff",
	"Sword",
	"Wand"
);
DROP_SKILL[ TEMPLATE_ARMOR ] = new Array(
	"Hidden",
	"Cloth",
	"Leather",
	"Mail",
	"Plate",
	"Shield",
	"Idol",
	"Libram",
	"Totem",
	"Miscellaneous"
);
DROP_SKILL[ TEMPLATE_OTHER ] = new Array( "" );


// CHECKBOX VALUES
// ===============
INFO_CLASSES = new Array(
	"Druid",
	"Hunter",
	"Mage",
	"Paladin",
	"Priest",
	"Rogue",
	"Shaman",
	"Warlock",
	"Warrior"
);


// FORM ELEMENTS
// =============
FORM_ELEMENTS = new Array(
	"frm-name",
	"frm-quality",
	"frm-binding",
	"frm-unique",
	"frm-type",
	"frm-skill",
	"frm-damage",
	"frm-armor",
	"frm-armor_weap",
	"frm-stats",
	"frm-enchant",
	"frm-classes",
	"frm-durability",
	"frm-require",
	"frm-chance",
	"frm-use",
	"frm-equips",
	"frm-charges",
	"frm-yellow"
);

g_HideElements = new Array();
g_HideElements[ TEMPLATE_WEAPON ]	= new Array( "frm-armor" );
g_HideElements[ TEMPLATE_ARMOR ]	= new Array( "frm-damage", "frm-armor_weap", "frm-chance" );
g_HideElements[ TEMPLATE_OTHER ]	= new Array( "frm-type", "frm-skill", "frm-damage", "frm-armor", "frm-armor_weap", "frm-stats", "frm-enchant", "frm-durability", "frm-chance", "frm-equips" );


// DEFAULTS
// ========
g_Defaults = new Array();
g_Defaults[ ID_TITLE ] 				= new Array( TYPE_NORMAL+SIZE_TITLE, "Item Name", COLOR_BLUE );
g_Defaults[ ID_WEAPONTYPE_SKILL ] 	= new Array( TYPE_TYPE_SKILL, 0, COLOR_WHITE, 0, COLOR_WHITE );
g_Defaults[ ID_ARMORSLOT_SKILL ] 	= new Array( TYPE_SLOT_SKILL, 0, COLOR_WHITE, 0, COLOR_WHITE );
g_Defaults[ ID_DAMAGE_SPEED ] 		= new Array( TYPE_DAMAGE_SPEED, 1, 2, "1.00" );
g_Defaults[ ID_DPS ]				= new Array( TYPE_DPS, ( ( g_Defaults[ ID_DAMAGE_SPEED ][ 1 ] + g_Defaults[ ID_DAMAGE_SPEED ][ 2 ] ) / 2 ) / g_Defaults[ ID_DAMAGE_SPEED ][ 3 ] );


// TEMPLATE DEFAULTS
// =================
g_TemplateDefaults = new Array();
g_TemplateDefaults[ TEMPLATE_WEAPON ]	= new Array( ID_TITLE, ID_WEAPONTYPE_SKILL, ID_DAMAGE_SPEED, ID_DPS );
g_TemplateDefaults[ TEMPLATE_ARMOR ]	= new Array( ID_TITLE, ID_ARMORSLOT_SKILL );
g_TemplateDefaults[ TEMPLATE_OTHER ]	= new Array( ID_TITLE, null );


// TEMPLATE IGNORE
// ===============
g_TemplateIgnore = new Array();
g_TemplateIgnore[ TEMPLATE_WEAPON ]		= new Array( ID_ARMORSLOT_SKILL, ID_ARMOR_ARMOR );
g_TemplateIgnore[ TEMPLATE_ARMOR ]		= new Array( ID_WEAPONTYPE_SKILL, ID_DAMAGE_SPEED, ID_DPS, ID_ARMOR_WEAPON, ID_CHANCE );
g_TemplateIgnore[ TEMPLATE_OTHER ]		= new Array( ID_ARMORSLOT_SKILL, ID_WEAPONTYPE_SKILL, ID_DAMAGE_SPEED, ID_DPS, ID_ARMOR_ARMOR, ID_ARMOR_WEAPON, ID_STAT_1, ID_STAT_2, ID_STAT_3, ID_STAT_4, ID_STAT_5, ID_STAT_6, ID_ENCHANT, ID_DURABILITY, ID_EQUIP_1, ID_EQUIP_2, ID_EQUIP_3, ID_CHANCE );


// DEFAULT FIELD VALUES
// ====================
g_DefaultField[ "name_val" ]		= g_Defaults[ ID_TITLE ][ 1 ];
g_DefaultField[ "unique_val" ]		= 1;
g_DefaultField[ "dmgmin_val" ]		= g_Defaults[ ID_DAMAGE_SPEED ][ 1 ];
g_DefaultField[ "dmgmax_val" ]		= g_Defaults[ ID_DAMAGE_SPEED ][ 2 ];
g_DefaultField[ "speed_val" ]		= g_Defaults[ ID_DAMAGE_SPEED ][ 3 ];
g_DefaultField[ "enchant_val" ]		= 15;
g_DefaultField[ "enchant_opt" ]		= "<Custom Enchant>";
g_DefaultField[ "require_val" ]		= 60;
g_DefaultField[ "require_opt" ]		= "<Custom Requirement>";

for ( var i=1; i<=TOTAL_STATS; i++ )
{
	g_DefaultField[ "stat"+i+"_opt" ] = "<Custom Stat>";
	g_DefaultField[ "stat"+i+"_val" ] = 10;
}

ERROR_BLUR_DEFAULT[ "name_val" ]	= true;
ERROR_BLUR_EMPTY[ "name_val" ]		= true;


// REGULAR EXPRESSIONS
// ===================
var g_RENumbersOnly 	= new Array( "unique_val", "dmgmin_val", "dmgmax_val", "enchant_val", "require_val", "durability_val", "charges_val" );
var g_RENumbersMinus	= new Array( "stat1_val", "stat2_val", "stat3_val", "stat4_val", "stat5_val", "stat6_val", "armor_val", "armor_weap_val" );
var g_RENumbersDecimal	= new Array( "speed_val" );


// Numbers only
for ( var i=0; i<g_RENumbersOnly.length; i++ )
	ERROR_KEYUP_REGEXP[ g_RENumbersOnly[ i ] ] = REGEXP_NUMBERS_ONLY;

// Numbers and Minus (-) sign
for ( var i=0; i<g_RENumbersMinus.length; i++ )
	ERROR_KEYUP_REGEXP[ g_RENumbersMinus[ i ] ] = REGEXP_NUMBERS_NEGATIVE;

// Numbers and Decimal
for ( var i=0; i<g_RENumbersDecimal.length; i++ )
	ERROR_KEYUP_REGEXP[ g_RENumbersDecimal[ i ] ] = REGEXP_NUMBERS_FLOAT;


// GLOBAL VARIABLES
// ================
g_CurrentTemplate 	= null;
g_DropLastValue 	= new Array();
g_TotalStats		= 0;
g_TotalEquips		= 0;

g_AllValues			= new Array();
g_TemplateValues	= new Array();


for ( i=0; i<TOTAL_FIELDS; i++ )
{
	g_AllValues[ i ] = new Array();
	g_TemplateValues[ i ] = new Array();
}


// EXTERNAL INTERFACE
// ==================
function wowTip_init()
{
	// make sure browser is capable of using creator
	if ( !JS_GETELEMENTBYID || !JS_GETELEMENTSBYTAGNAME )
		return;

	// enable global events
	form_events( "frm-create" );

	// show form (javascript only)
	setDisplay( "TOOLTIP", "block" );
	setDisplay( "frm-create", "block" );

	// hide extra fields
	setDisplay( "unique_val", "none" );
	setDisplay( "enchant_opt", "none" );
	setDisplay( "enchant_val", "none" );
	setDisplay( "require_opt", "none" );
	setDisplay( "require_val", "none" );

	// fill in dropdown boxes
	addOptions( "tpl_drp", DROP_ITEMTEMPLATE );
	addOptions( "quality_drp", DROP_ITEMQUALITY, g_Defaults[ ID_TITLE ][ 2 ] );
	addOptions( "binding_drp", DROP_ITEMBINDING );
	addOptions( "unique_drp", DROP_ITEMUNIQUE );
	addOptions( "enchant_drp", DROP_ENCHANTS );
	addOptions( "require_drp", DROP_ITEMREQUIRES );

	// fill in stat dropdowns
	for ( var i=0; i<TOTAL_STATS; i++ )
	{
		setDisplay( "frm-stat"+(i+1), "none" );
		addOptions( "stat"+(i+1)+"_drp", DROP_ITEMSTATS );
	}

	iTotalStats = 0;

	// check stats from back/reload
	for ( i=0; i<TOTAL_STATS; i++ )
	{
		if ( getValue( "stat"+(i+1)+"_val" ) || getValue( "stat"+(i+1)+"_opt" ) )
			iTotalStats++;
	}

	iTotalStats = ( iTotalStats == 0 ) ? DEFAULT_STATS : iTotalStats;

	// draw correct number of stats
	if ( iTotalStats == 0 )
	{
		setDisplay( "frm-stats-none", "block" );
		setDisplay( "frm-stats-more", "none" );
	}
	else
	{
		for ( var i=0; i<iTotalStats; i++ )
			addStat();
	}

	setDisplay( "frm-stats", "block" );

	for ( var i=0; i<TOTAL_EQUIPS; i++ )
		setDisplay( "frm-equip"+(i+1), "none" );

	iTotalEquips = 0;

	// check stats from back/reload
	for ( i=0; i<TOTAL_EQUIPS; i++ )
	{
		if ( getValue( "equip"+(i+1)+"_val" ) )
			iTotalEquips++;
	}

	iTotalEquips = ( iTotalEquips == 0 ) ? DEFAULT_EQUIPS : iTotalEquips;

	// set default number of equip effects
	for ( var i=0; i<iTotalEquips; i++ )
		addEquip();

	setDisplay( "frm-equips", "block" );

	iTemplate = DEFAULT_TEMPLATE;

	if ( getSelected( "tpl_drp" ) != DEFAULT_TEMPLATE )
		iTemplate = getSelected( "tpl_drp" );

	// check dynamic fields to see if they should be open

	updateDrop( document.getElementById( "unique_drp" ) );
	updateDrop( document.getElementById( "enchant_drp" ) );
	updateDrop( document.getElementById( "require_drp" ) );

	// pop open advanced field if any values have been modified

	if ( getValue( "advanced_val" ) == "1" )
		showAdvanced();

	// set form fields / fill in defaults
	loadTemplate( iTemplate );
}


// gets values from form/defaults based on field id
function setValues( fieldId, Arr, bInit )
{
	switch ( fieldId )
	{
		case ID_TITLE :
		{
			// { "text", iColor }
			Arr[ 0 ] = getValue( "name_val" );
			Arr[ 1 ] = getSelected( "quality_drp" );

			// check if blank
			if ( Arr[ 0 ] == "" )
			{
				// set default text ( Item Name )
				Arr[ 0 ] = g_Defaults[ ID_TITLE ][ 1 ];

				// set default color ( Blue )
				if ( bInit == INIT_TRUE && Arr[ 1 ] == 0 )
				{
					Arr[ 1 ] = g_Defaults[ ID_TITLE ][ 2 ];
				}
			}

			// draw on form if initializing
			if ( bInit == INIT_TRUE )
			{
				setValue( "name_val", Arr[ 0 ] );
				setSelected( "quality_drp", Arr[ 1 ] );
			}

			break;
		}

		case ID_BINDING :
		{
			// { iBinding }
			Arr[ 0 ] = getSelected( "binding_drp" );

			break;
		}

		case ID_UNIQUE :
		{
			// { num }
			if ( DROP_ITEMUNIQUE[ getSelected( "unique_drp" ) ] == "No" )
				Arr[ 0 ] = 0;

			else
			{
				if ( g_CurrentTemplate == TEMPLATE_OTHER )
				{
					Arr[ 0 ] = getValue( "unique_val" );

					if ( getValue( "unique_val" ) == "" )
						Arr[ 0 ] = g_DefaultField[ "unique_val" ];
				}

				else
					Arr[ 0 ] = g_DefaultField[ "unique_val" ];
			}

			break;
		}

		case ID_WEAPONTYPE_SKILL :
		case ID_ARMORSLOT_SKILL :
		{
			// { iType/iSlot, iColor1, iSkill, iColor2 }
			Arr[ 0 ] = getSelected( "type_drp" );
			Arr[ 1 ] = COLOR_WHITE;

			Arr[ 2 ] = getSelected( "skill_drp" );
			Arr[ 3 ] = COLOR_WHITE;

			// draw on form if initializing
			if ( bInit == INIT_TRUE )
			{
				setSelected( "type_drp", Arr[ 0 ] );
				setSelected( "skill_drp", Arr[ 2 ] );
			}

			break;
		}

		case ID_DAMAGE_SPEED :
		{
			// { min, max, speed }
			var iSpeed = getValue( "speed_val" );

			if ( getValue( "speed_val" ) == "" )
				iSpeed = g_DefaultField[ "speed_val" ];

			else if ( getValue( "speed_val" ) == '.' )
			{
				iSpeed = 0;
			}

			Arr[ 0 ] = Math.floor( ( getValue( "dmgmin_val" ) == "" ) ? g_DefaultField[ "dmgmin_val" ] : getValue( "dmgmin_val" ) );
			Arr[ 1 ] = Math.floor( ( getValue( "dmgmax_val" ) == "" ) ? g_DefaultField[ "dmgmax_val" ] : getValue( "dmgmax_val" ) );
			Arr[ 2 ] = iSpeed;

			// draw on form if initializing
			if ( bInit == INIT_TRUE )
			{
				setValue( "dmgmin_val", Arr[ 0 ] );
				setValue( "dmgmax_val", Arr[ 1 ] );
				setValue( "speed_val", Arr[ 2 ] );
			}

			break;
		}

		case ID_DPS :
		{
			// { dps }
			var iSpeed = getValue( "speed_val" );

			if ( getValue( "speed_val" ) == "" )
				iSpeed = g_DefaultField[ "speed_val" ];

			else if ( getValue( "speed_val" ) == '.' )
			{
				iSpeed = 0;
			}

			Arr[ 0 ] = ( iSpeed == 0 ) ? 0 : ( ( Number( getValue( "dmgmin_val" ) ) + Number( getValue( "dmgmax_val" ) ) ) / 2 ) / Number( iSpeed );

			setValue( "dps_val", Arr[ 0 ] );

			break;
		}

		case ID_ARMOR_ARMOR :
		{
			// { armor }
			Arr[ 0 ] = getValue( "armor_val" );

			break;
		}

		case ID_ARMOR_WEAPON :
		{
			// { armor }
			Arr[ 0 ] = getValue( "armor_weap_val" );

			break;
		}

		case ID_ENCHANT :
		{
			// { "text", iColor }
			if ( DROP_ENCHANTS[ getValue( "enchant_drp" ) ] == DROP_NONE )
			{
				Arr[ 0 ] = "";
			}
			else if ( DROP_ENCHANTS[ getValue( "enchant_drp" ) ] == DROP_CUSTOM )
			{
				Arr[ 0 ] = getValue( "enchant_opt" );
			}
			else
			{
				var Enchant = getValue( "enchant_val" );

				if ( Enchant == "" )
					Arr[ 0 ] = "";
				else
				{
					Arr[ 0 ] = getValue( "enchant_opt" ) + Enchant;
				}
			}

			Arr[ 1 ] = COLOR_GREEN;

			break;
		}

		case ID_CLASSES :
		{
			// { "classes", iColor }
			Arr[ 0 ] = "";
			for ( i=0; i<TOTAL_CLASSES; i++ )
			{
				if ( getChecked( "class"+(i+1)+"_chk" ) == true )
				Arr[ 0 ] += INFO_CLASSES[ i ];
			}

			Arr[ 1 ] = COLOR_RED;

			break;
		}

		case ID_DURABILITY :
		{
			// { min, max }
			Arr[ 0 ] = getValue( "durability_val" );
			Arr[ 1 ] = Arr[ 0 ];

			break;
		}

		case ID_REQUIRES :
		{
			// { "text", iColor }
			if ( DROP_ITEMREQUIRES[ getValue( "require_drp" ) ] == DROP_NONE )
				Arr[ 0 ] = "";

			else if ( DROP_ITEMREQUIRES[ getValue( "require_drp" ) ] == "Level" )
			{
				Arr[ 0 ] = "Level " + getValue( "require_val" );

				if ( getValue( "require_val" ) == "" )
					Arr[ 0 ] = "";
			}
			else
			{
				Arr[ 0 ] = getValue( "require_opt" );
			}

			Arr[ 1 ] = COLOR_WHITE;

			break;
		}

		case ID_CHANCE :
		{
			// { "text" }
			Arr[ 0 ] = getValue( "chance_val" );

			break;
		}

		case ID_USE :
		{
			// { "text" }
			Arr[ 0 ] = getValue( "use_val" );
			chargesCheck();

			break;
		}

		case ID_CHARGES :
		{
			// { charges }
			Arr[ 0 ] = getValue( "charges_val" );

			break;
		}

		case ID_YELLOW :
		{
			// { "text" }
			Arr[ 0 ] = getValue( "yellow_val" );

			break;
		}

		default :
		{
			// ID_EQUIP_X
			if ( fieldId >= ID_EQUIP_1 && fieldId < ( ID_EQUIP_1 + TOTAL_EQUIPS ) )
			{
				// { "text" }
				var iEquipNum = ( fieldId - ID_EQUIP_1 ) + 1;
				Arr[ 0 ] = getValue( "equip"+(iEquipNum)+"_val" );

				break;
			}

			// ID_STAT_X
			else if ( fieldId >= ID_STAT_1 && fieldId < ( ID_STAT_1 + TOTAL_STATS ) )
			{
				// { iStatNum, "stat" }
				var iStatNum = ( fieldId - ID_STAT_1 ) + 1;

				Arr[ 0 ] = getValue( "stat"+(iStatNum)+"_val" );
				Arr[ 1 ] = getValue( "stat"+(iStatNum)+"_opt" );

				// check if number value blank
				if ( Arr[ 0 ] == "" )
					Arr[ 0 ] = 0;

				// check if custom stat blank
				if ( Arr[ 1 ] == "" )
					Arr[ 1 ] = g_DefaultField[ "stat"+(iStatNum)+"_opt" ];
			}
		}
	}

	// Add type to array if initializing
	if ( bInit == INIT_TRUE )
		Arr.unshift( STYLE_TYPE[ fieldId ] );
}


function loadTemplate( iTemplate )
{
	g_bTemplateReady = false;

	var bFirstLoad = ( g_CurrentTemplate == null ) ? true : false;
	g_CurrentTemplate = iTemplate;

	// fill in dropdown boxes for given template

	addOptions( "type_drp", DROP_TYPE_SLOT[ iTemplate ] );
	addOptions( "skill_drp", DROP_SKILL[ iTemplate ], 1 );

	uniqueCheck();

	for ( var i=0; i<TOTAL_FIELDS; i++ )
	{
		// copy defaults/existing values to array(s)
		if ( bFirstLoad )
		{
			setValues( i, g_TemplateValues[ i ], INIT_TRUE );

			// copy values to master value list
			g_TemplateValues[ i ].copy( g_AllValues[ i ] );
		}
		else
		{
			g_AllValues[ i ].copy( g_TemplateValues[ i ] );
		}

		// check if we are ignoring field on current template
		if ( g_TemplateIgnore[ iTemplate ].find( i ) != -1 )
			g_TemplateValues[ i ][ _TYPE ] = _HIDDEN;
	}

	// select previously selected option(s) in dropdowns

	if ( !bFirstLoad )
	{
		// item slot/type
		for ( var i=0; i<DROP_TYPE_SLOT[ iTemplate ].length; i++ )
		{
			if ( iTemplate == TEMPLATE_WEAPON && g_AllValues[ ID_WEAPONTYPE_SKILL ][ 1 ] == i )
			{
				setSelected( "type_drp", i );
				break;
			}
			else if ( iTemplate == TEMPLATE_ARMOR && g_AllValues[ ID_ARMORSLOT_SKILL ][ 1 ] == i )
			{
				setSelected( "type_drp", i );
				break;
			}
		}

		// item skill
		for ( var i=0; i<DROP_SKILL[ iTemplate ].length; i++ )
		{
			if ( iTemplate == TEMPLATE_WEAPON && g_AllValues[ ID_WEAPONTYPE_SKILL ][ 3 ] == i )
			{
				setSelected( "skill_drp", i );
				break;
			}
			else if ( iTemplate == TEMPLATE_ARMOR && g_AllValues[ ID_ARMORSLOT_SKILL ][ 3 ] == i )
			{
				setSelected( "skill_drp", i );
				break;
			}
		}

		// item stats
		for ( var i=0; i<TOTAL_STATS; i++ )
		{
			for ( var j=0; j<DROP_ITEMSTATS.length; j++ )
			{
				if ( g_AllValues[ ID_STAT_1+i ][ 2 ] == DROP_ITEMSTATS[ j ] )
				{
					setSelected( "stat"+(i+1)+"_drp", j );
					setValue( "stat"+(i+1)+"_opt", DROP_ITEMSTATS[ j ] );
					break;
				}
				else if ( j == DROP_ITEMSTATS.length - 1 )
				{
					if ( getValue( "stat"+(i+1)+"_val" ) || getValue( "stat"+(i+1)+"_opt" ) )
					{
						setSelected( "stat"+(i+1)+"_drp", j );
						setValue( "stat"+(i+1)+"_opt", g_AllValues[ ID_STAT_1+i ][ 2 ] );
					}
				}
			}
		}
	}

	// update form fields

	for ( var i=0; i<FORM_ELEMENTS.length; i++ )
	{
		if ( g_HideElements[ iTemplate ].find( FORM_ELEMENTS[ i ] ) != -1 )
			setDisplay( FORM_ELEMENTS[ i ], "none" );
		else
		{
			setDisplay( FORM_ELEMENTS[ i ], "block" );
		}
	}

	// check charges field
	chargesCheck();

	g_bTemplateReady = true;

	// send to flash
	submitTemplate();
}


// ADD/REMOVE FIELDS
// =================
function addStat()
{
	if ( g_TotalStats < TOTAL_STATS )
	{
		if ( g_TotalStats == 0 )
		{
			setDisplay( "frm-stats-none", "none" );
			setDisplay( "frm-stats-more", "block" );
		}

		g_TotalStats++;
		var i = g_TotalStats;

		setDisplay( "frm-stat"+i, "block" );

		// check if stats are filled in (from refresh)
		if ( getValue( "stat"+i+"_opt" ) )
		{
			var iFound = DROP_ITEMSTATS.length-1;

			// options have been redrawn, must reselect previous dropdown
			for ( var j=0; j<DROP_ITEMSTATS.length-1; j++ )
			{
				if ( getValue( "stat"+i+"_opt" ) == DROP_ITEMSTATS[ j ] )
					iFound = j;
			}

			setSelected( "stat"+i+"_drp", iFound )
		}
		else
		{
			// find stat that has not been used
			var selectedArr = new Array();

			for ( var j=0; j<(g_TotalStats-1); j++ )
				selectedArr[ j ] = getValue( "stat"+(j+1)+"_drp" );

			var k = 0;

			do
			{
				if ( selectedArr.find( k ) == -1 )
				{
					setSelected( "stat"+i+"_drp", k );
					setValue( "stat"+i+"_opt", DROP_ITEMSTATS[ k ] );
				}

				k++;
			}
			while ( getValue( "stat"+i+"_opt" ) == "" )
		}

		// select default value
		if ( !getValue( "stat"+i+"_val" ) )
			setValue( "stat"+i+"_val", g_DefaultField[ "stat"+i+"_val" ] );

		updateDrop( document.getElementById("stat"+i+"_drp") );

		if ( g_TotalStats == TOTAL_STATS )
		{
			setDisplay( "frm-stats-more", "none" );
		}
	}
}

function removeStat( statNum )
{
	if ( g_TotalStats > 0 )
	{
		// show add button
		if ( g_TotalStats == TOTAL_STATS )
		{
			setDisplay( "frm-stats-more", "block" );
		}

		// copy all stats if not removing last
		for ( var i=statNum; i<g_TotalStats; i++ )
		{
			setSelected( "stat"+i+"_drp", getSelected( "stat"+(i+1)+"_drp" ) );
			setValue( "stat"+i+"_val", getValue( "stat"+(i+1)+"_val" ) );
			setValue( "stat"+i+"_opt", getValue( "stat"+(i+1)+"_opt" ) );

			//g_DropLastValue[ "stat"+i+"_drp" ] = getValue( "stat"+i+"_drp" );
			updateDrop( document.getElementById("stat"+i+"_drp") );
		}

		var i = g_TotalStats;
		g_TotalStats--;

		// hide last stat
		setDisplay( "frm-stat"+i, "none" );

		// select default stat / remove value
		setSelected( "stat"+i+"_drp", 0 );
		setValue( "stat"+i+"_val", "" );
		setValue( "stat"+i+"_opt", "" );

		updateDrop( document.getElementById("stat"+i+"_drp") );

		if ( g_TotalStats == 0 )
		{
			setDisplay( "frm-stats-more", "none" );
			setDisplay( "frm-stats-none", "block" );
		}
	}
}

function addEquip()
{
	if ( g_TotalEquips < TOTAL_EQUIPS )
	{
		if ( g_TotalEquips == 0 )
		{
			setDisplay( "frm-equips-none", "none" );
			setDisplay( "frm-equips-more", "block" );
		}
		g_TotalEquips++;
		var i = g_TotalEquips;
		setDisplay( "frm-equip"+i, "block" );

		if ( g_TotalEquips == TOTAL_EQUIPS )
		{
			setDisplay( "frm-equips-more", "none" );
		}
	}
}

function removeEquip( equipNum )
{
	if ( g_TotalEquips > 0 )
	{
		// show add button
		if ( g_TotalEquips == TOTAL_EQUIPS )
		{
			setDisplay( "frm-equips-more", "block" );
		}

		// copy all data if not removing last
		for ( var i=equipNum; i<g_TotalEquips; i++ )
		{
			var nextValue = getValue( "equip"+(i+1)+"_val" );
			setValue( "equip"+i+"_val", nextValue );

			updateInfo( document.getElementById("equip"+i+"_val") );
		}

		var i = g_TotalEquips;
		g_TotalEquips--;

		setDisplay( "frm-equip"+i, "none" );

		// clear text box
		setValue( "equip"+i+"_val", "" );
		updateInfo( document.getElementById("equip"+i+"_val") );

		if ( g_TotalEquips == 0 )
		{
			setDisplay( "frm-equips-more", "none" );
			setDisplay( "frm-equips-none", "block" );
		}
	}
}

function showAdvanced()
{
	setDisplay( "frm-adv-show", "none" );
	setDisplay( "frm-adv-hide", "block" );
	setDisplay( "frm-adv", "block" );

	setValue( "advanced_val", "1" );
}

function hideAdvanced()
{
	setDisplay( "frm-adv-show", "block" );
	setDisplay( "frm-adv-hide", "none" );
	setDisplay( "frm-adv", "none" );

	setValue( "advanced_val", "0" );
}

function uniqueCheck()
{
	if ( g_CurrentTemplate == TEMPLATE_OTHER && getValue( "unique_val" ) == "" )
		setValue( "unique_val", g_DefaultField[ "unique_val" ] );

	if ( DROP_ITEMUNIQUE[ getSelected( "unique_drp" ) ] == "Yes" && g_CurrentTemplate == TEMPLATE_OTHER )
		setDisplay( "unique_val", "block" );
	else
	{
		setDisplay( "unique_val", "none" );
	}
}

function chargesCheck()
{
	if ( getValue( "use_val" ) == "" )
		setDisplay( "frm-charges", "none" );
	else
	{
		setDisplay( "frm-charges", "block" );
	}
}


function submitTemplate()
{
	// send to flash
	if ( g_bFlashReady )
		findSWF( _SWF ).flash_init_values( g_TemplateValues );
}


// UPDATE INFO
// ===========
function submitInfo( infoId, iType, infoArr )
{
	if ( g_bFlashReady )
	{
		// send to flash
		findSWF( _SWF ).flash_update_values( infoId, iType, infoArr );

		// save values for later use
		infoArr.unshift( iType );
		infoArr.copy( g_AllValues[ infoId ] );
	}
}

function updateInfo( _this )
{
	var iField;
	var textArr = new Array();

	switch ( _this.id )
	{
		case "name_val" :
		case "quality_drp" :
		{
			iField = ID_TITLE;
			break;
		}

		case "binding_drp" :
		{
			iField = ID_BINDING;
			break;
		}

		case "unique_drp" :
		case "unique_val" :
		{
			iField = ID_UNIQUE;
			break;
		}

		case "type_drp" :
		case "skill_drp" :
		{
			if ( g_CurrentTemplate == TEMPLATE_WEAPON )
				iField = ID_WEAPONTYPE_SKILL;

			else if ( g_CurrentTemplate == TEMPLATE_ARMOR )
			{
				iField = ID_ARMORSLOT_SKILL;
			}

			break;
		}

		case "dmgmin_val" :
		case "dmgmax_val" :
		case "speed_val" :
		{
			iField = ID_DAMAGE_SPEED;

			// calculate DPS as well
			setValues( ID_DPS, textArr, INIT_FALSE );
			submitInfo( ID_DPS, STYLE_TYPE[ ID_DPS ], textArr );

			textArr.length = 0;

			break;
		}

		case "armor_val" :
		{
			iField = ID_ARMOR_ARMOR;
			break;
		}

		case "armor_weap_val" :
		{
			iField = ID_ARMOR_WEAPON;
			break;
		}

		case "enchant_val" :
		case "enchant_opt" :
		case "enchant_drp" :
		{
			iField = ID_ENCHANT;
			break;
		}

		case "durability_val" :
		{
			iField = ID_DURABILITY;
			break;
		}

		case "require_drp" :
		case "require_opt" :
		case "require_val" :
		{
			iField = ID_REQUIRES;
			break;
		}

		case "chance_val" :
		{
			iField = ID_CHANCE;
			break;
		}

		case "use_val" :
		{
			iField = ID_USE;
			break;
		}

		case "equip1_val" :
		case "equip2_val" :
		case "equip3_val" :
		{
			iField = ID_EQUIP_1+((_this.id).substr((_this.id).length-5,1)-1);
			break;
		}

		case "charges_val" :
		{
			iField = ID_CHARGES;
			break;
		}

		case "yellow_val" :
		{
			iField = ID_YELLOW;
			break;
		}

		default :
		{
			// item stats
			if ( (_this.id).indexOf( "stat" ) != -1 )
			{
				iField = ID_STAT_1+(Number((_this.id).substr(4,1))-1);
			}

			// classes
			else if ( (_this.id).indexOf( "class" ) != -1 )
			{
				iField = ID_CLASSES;
			}
		}
	}

	// send to flash
	if ( iField != undefined )
	{
		setValues( iField, textArr, INIT_FALSE );
		submitInfo( iField, STYLE_TYPE[ iField ], textArr );
	}
}

// UPDATE DROPDOWN(S)
// ==================
function updateDrop( _this )
{
	switch ( _this.id )
	{
		case "tpl_drp" :
		{
			loadTemplate( getSelected( _this.id ) );
			break;
		}
		case "unique_drp" :
		{
			uniqueCheck();
			break;
		}
		case "require_drp" :
		{
			if ( DROP_ITEMREQUIRES[ getValue( _this.id ) ] == DROP_NONE )
			{
				setDisplay( "require_opt", "none" );
				setDisplay( "require_val", "none" );

				setValue( "require_opt", "" );
			}
			else if ( DROP_ITEMREQUIRES[ getValue( _this.id ) ] == DROP_CUSTOM )
			{
				setDisplay( "require_opt", "inline" );
				setDisplay( "require_val", "none" );

				if ( getValue( "require_opt" ) == "" || g_DropLastValue[ _this.id ] == 1 )
					setValue( "require_opt", g_DefaultField[ "require_opt" ] );
			}
			else
			{
				setDisplay( "require_opt", "none" );
				setDisplay( "require_val", "inline" );

				if ( getValue( "require_val" ) == "" )
					setValue( "require_val", g_DefaultField[ "require_val" ] );
			}

			break;
		}

		case "enchant_drp" :
		{
			if ( DROP_ENCHANTS[ getValue( _this.id ) ] == DROP_NONE )
			{
				setDisplay( "enchant_opt", "none" );
				setDisplay( "enchant_val", "none" );

				setValue( "enchant_opt", "" );
			}
			else if ( DROP_ENCHANTS[ getValue( _this.id ) ] == DROP_CUSTOM )
			{
				setDisplay( "enchant_opt", "inline" );
				setDisplay( "enchant_val", "none" );

				if ( getValue( "enchant_opt" ) == "" || ( g_DropLastValue[ _this.id ] != null && g_DropLastValue[ _this.id ] != DROP_CUSTOM ) )
					setValue( "enchant_opt", g_DefaultField[ "enchant_opt" ] );
			}
			else
			{
				setDisplay( "enchant_opt", "none" );

				if ( getValue( "enchant_val" ) == "" && g_DropLastValue[ "enchant_drp" ] != getSelected( "enchant_drp" ) )
					setValue( "enchant_val", g_DefaultField[ "enchant_val" ] );

				setDisplay( "enchant_val", "inline" );
				setValue( "enchant_opt", DROP_ENCHANTS[ getValue( _this.id ) ] + " +" );
			}

			break;
		}

		default :
		{
			// item stats
			if ( (_this.id).indexOf( "stat" ) != -1 )
			{
				var iStatNum = (_this.id).substr(4,1);

				// check for custom selection
				if ( DROP_ITEMSTATS[ getValue( _this.id ) ] == DROP_CUSTOM )
				{
					setDisplay( "stat"+iStatNum+"_opt", "inline" );

					if ( getValue( "stat"+iStatNum+"_opt" ) == DROP_ITEMSTATS[ g_DropLastValue[ _this.id ] ] )
						setValue( "stat"+iStatNum+"_opt", g_DefaultField[ "stat"+iStatNum+"_opt" ] );
				}

				else if ( iStatNum <= g_TotalStats )
				{
					setDisplay( "stat"+iStatNum+"_opt", "none" )
					setValue( "stat"+iStatNum+"_opt", DROP_ITEMSTATS[ getValue( _this.id ) ] );
				}
			}
		}
	}

	g_DropLastValue[ _this.id ] = getValue( _this.id );

	if ( g_bTemplateReady )
		updateInfo( _this );
}


function form_validate()
{
	// unique
	if ( DROP_ITEMUNIQUE[ getSelected( "unique_drp" ) ] == "No" )
		setValue( "unique_val", 0 );

	else if ( getValue( "unique_val" ) == "" || g_CurrentTemplate != TEMPLATE_OTHER )
		setValue( "unique_val", 1 );

	// stats
	for ( var i=1; i<=g_TotalStats; i++ )
	{
		if ( getValue( "stat"+i+"_val" ) == "" || getValue( "stat"+i+"_opt" ) == "" || getValue( "stat"+i+"_opt" ) == g_DefaultField[ "stat"+i+"_opt" ] )
		{
			removeStat(i);
			i--;
		}
	}

	// equip
	for ( var i=1; i<=g_TotalEquips; i++ )
	{
		if ( getValue( "equip"+i+"_val" ) == "" && g_TotalEquips != 1 )
		{
			removeEquip(i);
			i--;
		}
	}

	// enchant
	if ( DROP_ENCHANTS[ getSelected( "enchant_drp" ) ] == DROP_CUSTOM )
	{
		setValue( "enchant_val", "" );

		if ( getValue( "enchant_opt" ) == "" || getValue( "enchant_opt" ) == g_DefaultField[ "enchant_opt" ] )
		{
			setSelected( "enchant_drp", 0 );
			setDisplay( "enchant_opt", "none" );
		}
	}
	else if ( DROP_ENCHANTS[ getSelected( "enchant_drp" ) ] != DROP_NONE )
	{
		if ( getValue( "enchant_val" ) == "" )
		{
			setValue( "enchant_opt", "" );
			setSelected( "enchant_drp", 0 );
			setDisplay( "enchant_val", "none" );
		}
	}
	else
	{
		setValue( "enchant_opt", "" );
		setValue( "enchant_val", "" );
	}

	// requirement
	if ( DROP_ITEMREQUIRES[ getValue( "require_drp" ) ] == DROP_CUSTOM )
	{
		setValue( "require_val", "" );

		if ( getValue( "require_opt" ) == "" || getValue( "require_opt" ) == g_DefaultField[ "require_opt" ] )
		{
			setSelected( "require_drp", 0 );
			setDisplay( "require_opt", "none" );
		}
	}
	else if ( DROP_ITEMREQUIRES[ getValue( "require_drp" ) ] != DROP_NONE )
	{
		setValue( "require_opt", "" );

		if ( getValue( "require_val" ) == "" )
		{
			setSelected( "require_drp", 0 );
			setDisplay( "require_val", "none" );
		}
	}
	else
	{
		setValue( "require_opt", "" );
		setValue( "require_val", "" );
	}

	// charges
	if ( getValue( "use_val" ) == "" )
		setValue( "charges_val", "" );


	var bValidForm = true;

	// regular expressions / error checking
	for ( var i=0; i<document.forms[ "frm-create" ].elements.length; i++ )
	{
		if ( document.forms[ "frm-create" ].elements[i].type == "text" || document.forms[ "frm-create" ].elements[i].type == "textarea" )
		{
			var _this = document.forms[ "frm-create" ].elements[i];
			if ( !ERROR_KEYUP_test( _this ) || !ERROR_BLUR_test( _this ) )
				bValidForm = false;
		}
	}

	if ( !bValidForm )
		window.location.hash = "status_box";

	else
	{
		document.forms[ "frm-create" ].submit();
	}
}
