function BuildSticker() {

	var selected_year;
	var selections = new Object();

	var root_div;
	var wrapper;
	var base_options_div;
	var options_div;
	var personalize_div;

	var selected_extra_options = new Object();

	var base_options = new Array();

	var option_groups = new Array();

	var extra_options = new Array();

	var options_labels = new Array(
		'Model',
		'Special Body Package',
		'Special Package',
		'Paint',
		'Engine',
		'Transmission',
		'Interior Package',
		'Interior Color'
	);

	var selected_template;

	var finished_basic_options = false;

	this.start = function() {
		root_div = document.getElementById( 'build_sticker' );
		draw_build_sticker_maker();
	}

	var valid_years = Array(
		'1968',
		'1969',
		'1970',
		'1971',
		'1972',
		'1973',
		'1974',
		'1975',
		'1976',
		'1977',
		'1978',
		'1979',
		'1980',
		'1981',
		'1982',
		'1984',
		'1985',
		'1986',
		'1987',
		'1988',
		'1989',
		'1990',
		'1991',
		'1992',
		'1993',
		'1994',
		'1995',
		'1996',
		'1997',
		'1998',
		'1999',
		'2000',
		'2001',
		'2002',
		'2003',
		'2004'
	);
	
	function removeChildrenOfElement( el ) {
		if (el != null) {
		  if ( el.hasChildNodes() ) {
			while ( el.childNodes.length >= 1 ) {
			  el.removeChild( el.firstChild );
			}
		  }
		}
	}
	
	function draw_build_sticker_maker() {
		var instructions_1_div = document.createElement( 'H3' );
		instructions_1_div.id = 'instructions_1';
		instructions_1_div_numeral = document.createElement( 'span' );
		instructions_1_div_numeral.className = 'numeral';
		instructions_1_div_numeral.innerHTML = '1.';
		instructions_1_div_text = document.createTextNode( 'Select a year for your Corvette:' );
		instructions_1_div.appendChild( instructions_1_div_numeral );
		instructions_1_div.appendChild( instructions_1_div_text );
		
		root_div.appendChild( instructions_1_div );

		var year_select = document.createElement( 'select' );
		year_select.id = 'year_select';

		var year_option = document.createElement( 'option' );
		year_option.value;
		year_option.innerHTML = '----';
		year_select.appendChild( year_option );

		for ( var i = 0; i < valid_years.length; i++ ) {
			var year_option = document.createElement( 'option' );
			year_option.value = valid_years[i];

			year_option.innerHTML = valid_years[i];
			year_select.appendChild( year_option );
		}

		year_select.onchange = function() {
			new_sticker( year_select.value );
		}
		
		instructions_1_div.appendChild( year_select );

		wrapper = document.createElement( 'div' );
		wrapper.id = 'wrapper';
		
		base_options_div = document.createElement( 'span' );
		base_options_div.id = 'base_options_div';
		options_div = document.createElement( 'span' );
		options_div.id = 'options';
		personalize_div = document.createElement( 'span' );
		personalize_div.id = 'personalize';
		
		wrapper.appendChild( base_options_div );
		wrapper.appendChild( options_div );
		wrapper.appendChild( personalize_div );

		wrapper.style.display = 'none';
		
		root_div.appendChild( wrapper );

	}

	function new_sticker( yr ) {

		finished_basic_options = false;
		base_options = new Array();
		selected_extra_options = new Object();

		selected_year = yr;

		draw_base_options();
		draw_extra_selection();

		wrapper.style.display = 'block';

		make_selection( 0 );
		draw_personalize();
	}

	function fetch_options( year, group, selected_options ) {
		
		var params = 'y='+year+'&g='+group+'&s='+selected_options.join(';');

		var r = new XMLHttpRequest;

    if ( r != null ) {

      r.open( 'POST', '/extra/sticker/ajax/sticker_optionsget.php', true );
      r.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );
      r.onreadystatechange = function() {
        if ( r.status == 200 ) {
          var options = new Function( "return " + r.responseText )();
          option_groups = options.groups;
          draw_selection( group, options );
        } else {
          window.alert("Couldn't retrieve options. Browser not supported.");
        }
      }
      r.send( params );

      //r.open( "GET", "http://localhost/test.xml", true );
      //r.onreadystatechange = handler;
      //r.send();
    } else {
      window.alert("AJAX (XMLHTTP) not supported by your browser.");
    }
	}

	
	function fetch_extra_options( year, selected_options ) {
		
		var params = 'y='+year+'&g=99&s='+selected_options.join(';');

		var r = new XMLHttpRequest;

    if ( r != null ) {

      r.open( 'POST', '/extra/sticker/ajax/sticker_optionsget.php', true );
      r.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );
      r.onreadystatechange = function() {
        if ( r.status == 200 ) {
          var options = new Function( "return " + r.responseText )();
          draw_extra_selection( options );
          r.send( params );
        } else {
          window.alert("Couldn't retrieve options. Browser not supported.");
        }
      }
      r.send( params );

      //r.open( "GET", "http://localhost/test.xml", true );
      //r.onreadystatechange = handler;
      //r.send();
    } else {
      window.alert("AJAX (XMLHTTP) not supported by your browser.");
    }
	}	

	
	function draw_extra_selection( options ) {
		var options_box = document.getElementById( 'options' );
		removeChildrenOfElement( options_box );


		var instructions_3_div = document.createElement( 'H3' );
		instructions_3_div.id = 'instructions_3';
		var instructions_3_div_numeral = document.createElement( 'span' );
		instructions_3_div_numeral.className = 'numeral';
		instructions_3_div_numeral.innerHTML = '3.';
		var instructions_3_div_text = document.createTextNode( 'Select extended options.' );
		instructions_3_div.appendChild( instructions_3_div_numeral );
		instructions_3_div.appendChild( instructions_3_div_text );
		
		options_box.appendChild( instructions_3_div );

		if ( finished_basic_options === false ) {
			options_box.className = 'disabled';
		} else {
			options_box.className = '';
		}
		
		
		function draw_option_row( option_result ) {
			var sel_table = document.createElement( 'table' );
			sel_table.className = 'select_option_table';
			var sel_table_body = document.createElement( 'tbody' );
			var tr = document.createElement( 'tr' );
			var rpo_cell = document.createElement( 'td' );
			var description_cell = document.createElement( 'td' );
			var price_cell = document.createElement( 'td' );
			tr.className = 'select_option_table_row';
			rpo_cell.className = 'select_option_table_rpo_cell rpo_cell';
			description_cell.className = 'select_option_table_description_cell description_cell';
			price_cell.className = 'select_option_table_price_cell price_cell';
			tr.appendChild( rpo_cell );
			tr.appendChild( description_cell );
			tr.appendChild( price_cell );

			rpo_cell.innerHTML = option_result[3];
			description_cell.innerHTML = option_result[6];
			price_cell.innerHTML = option_result[4];

			sel_table_body.appendChild( tr );
			sel_table.appendChild( sel_table_body );
			options_box.appendChild( sel_table );
			
			if ( finished_basic_options !== false ) {
			sel_table.onclick = function() {
				if ( this.selected === true ) {
					this.selected = false;
					sel_table.className = 'select_option_table';
					selected_extra_options[ option_result[1] ] = false;
				} else {
					this.selected = true;
					sel_table.className = 'select_option_table selected';

					var option_obj = new Object();
					option_obj.rpo = option_result[3];
					option_obj.description = option_result[6];
					option_obj.ext_desc1 = option_result[7];
					option_obj.ext_desc2 = option_result[8];
					option_obj.price = option_result[4];
					option_obj.urpo = option_result[1];
					option_obj.group = option_result[5];
					option_obj.hidden = option_result[9];

					selected_extra_options[ option_result[1] ] = option_obj;


				}
			}
			}
		}
		
		if ( options ) {
			for ( var i = 0; i < options.results.length; i++ ) {
				draw_option_row( options.results[i] );
			}
		}
	}
	
	function draw_base_options() {
		removeChildrenOfElement( base_options_div );

		
		var instructions_2_div = document.createElement( 'H3' );
		instructions_2_div.id = 'instructions_2';
		var instructions_2_div_numeral = document.createElement( 'span' );
		instructions_2_div_numeral.className = 'numeral';
		instructions_2_div_numeral.innerHTML = '2.';
		var instructions_2_div_text = document.createTextNode( 'Select basic options.' );
		instructions_2_div.appendChild( instructions_2_div_numeral );
		instructions_2_div.appendChild( instructions_2_div_text );
		
		base_options_div.appendChild( instructions_2_div );
		
		function draw_base_selected_option( i ) {
			var option_group = i;
			var option_obj = base_options[i];
			var option_header = document.createElement( 'div' );
			var option_body = document.createElement( 'div' );
			var option_table = document.createElement( 'table' );
			var option_table_body = document.createElement( 'tbody' );
			var tr = document.createElement( 'tr' );
			var rpo_cell = document.createElement( 'td' );
			var description_cell = document.createElement( 'td' );
			var price_cell = document.createElement( 'td' );


			option_header.className = 'selected_option_header';
			option_table.className = 'selected_option_table';
			tr.className = 'selected_option_table_row';
			rpo_cell.className = 'selected_option_table_rpo_cell rpo_cell';
			description_cell.className = 'selected_option_table_description_cell description_cell';
			price_cell.className = 'selected_option_table_price_cell price_cell';


			option_header.innerHTML = options_labels[i];
			rpo_cell.innerHTML = option_obj.rpo;
			description_cell.innerHTML = option_obj.description;
			price_cell.innerHTML = option_obj.price;
			tr.appendChild(rpo_cell);
			tr.appendChild(description_cell);
			tr.appendChild(price_cell);
			option_table_body.appendChild( tr );
			option_table.appendChild( option_table_body );
			option_body.appendChild( option_table );
			base_options_div.appendChild( option_header );
			base_options_div.appendChild( option_body );
			
			tr.onclick = function() {
				base_options.splice( i, base_options.length );
				finished_basic_options = false;
				make_selection( i );
			}
		}

		for( var i in base_options ) {
			draw_base_selected_option( i );
		}
	}

	function make_selection( g ) {
		draw_base_options();


		var selected_options = new Array();
		for( var i in base_options ) {
			selected_options.push( base_options[i].urpo );
		}

		if ( finished_basic_options === false ) {
			fetch_options( selected_year, g, selected_options );
			personalize_div.className = 'disabled';
		} else {
			personalize_div.className = '';
			var els = personalize_div.getElementsByTagName("input");
			for ( var i = 0; i < els.length; i++ ) {
				els[i].disabled = false;
			}

		}
		fetch_extra_options( selected_year, selected_options );
	}

	function draw_personalize() {
		removeChildrenOfElement( personalize_div );


		var selected_template = 't89';
		if ( selected_year < 1989 ) {
			selected_template = 't81';
		}
		if ( selected_year < 1981 ) {
			selected_template = 't76';
		}
		if ( selected_year < 1976 ) {
			selected_template = 't53';
		}


		var instructions_4_div = document.createElement( 'H3' );
		instructions_4_div.id = 'instructions_2';
		var instructions_4_div_numeral = document.createElement( 'span' );
		instructions_4_div_numeral.className = 'numeral';
		instructions_4_div_numeral.innerHTML = '4.';
		var instructions_4_div_text = document.createTextNode( 'Make it yours.' );
		instructions_4_div.appendChild( instructions_4_div_numeral );
		instructions_4_div.appendChild( instructions_4_div_text );
		
		personalize_div.appendChild( instructions_4_div );

		var vin_container = document.createElement( 'div' );
		vin_container.className = 'field_container';
		var vin_label = document.createElement('div');
		vin_label.innerHTML = 'Vehicle Identification Number (VIN):';
		var vin_input = document.createElement('input');
		vin_input.type = 'text';
		vin_input.id = 'vin';
		vin_container.appendChild( vin_label );
		vin_container.appendChild( vin_input );

		var dealer_container = document.createElement( 'div' );
		dealer_container.className = 'field_container';
		var dealer_label = document.createElement('div');
		dealer_label.innerHTML = 'Delivered To'
		var dealer1_label = document.createElement('div');
		dealer1_label.innerHTML = 'Line 1:'
		var dealer1_notes = document.createElement('div');
		dealer1_notes.innerHTML = "(ex: Your Name, Dealer's Name)";
		dealer1_notes.className = 'label_notes';
		var dealer1_input = document.createElement('input');
		dealer1_input.type = 'text';
		dealer1_input.id = 'dealer1';
		var dealer2_label = document.createElement('div');
		dealer2_label.innerHTML = 'Line 2:'
		var dealer2_notes = document.createElement('div');
		dealer2_notes.innerHTML = "(ex: Your City, State; Dealer's City, State)";
		dealer2_notes.className = 'label_notes';
		var dealer2_input = document.createElement('input');
		dealer2_input.type = 'text';
		dealer2_input.id = 'dealer2';

		dealer_container.appendChild( dealer_label );
		dealer_container.appendChild( dealer1_label );
		dealer_container.appendChild( dealer1_notes );
		dealer_container.appendChild( dealer1_input );
		dealer_container.appendChild( dealer2_label );
		dealer_container.appendChild( dealer2_notes );
		dealer_container.appendChild( dealer2_input );

		var delivery_container = document.createElement( 'div' );
		delivery_container.className = 'field_container';
		var delivery_label = document.createElement('div');
		delivery_label.innerHTML = 'Delivery Cost:'
		var delivery_input = document.createElement('input');
		delivery_input.type = 'text';
		delivery_input.id = 'delivery';
		delivery_container.appendChild( delivery_label );
		delivery_container.appendChild( delivery_input );


		function select_template( e ) {
			selected_template = e.target.value;
		}

		var select_template_div = document.createElement( 'div' );
		select_template_div.className = 'field_container';
		var template_label = document.createElement('div');
		template_label.innerHTML = 'Select a template:'
		var template_notes = document.createElement('div');
		template_notes.className = "label_notes";
		template_notes.innerHTML = "The default template for your year will automatically be selected.";

		select_template_div.appendChild( template_label );
		select_template_div.appendChild( template_notes );

		var select_template_ul = document.createElement( 'ul' );
		select_template_ul.id = 'template_ul';

		var early_radio_li = document.createElement( 'li' );
		var early_radio = document.createElement( 'input' );
		early_radio.type = 'radio';
		early_radio.name = 'template_selection';
		early_radio.value = 't53';
		if ( selected_template == 't53' ) {
			early_radio.checked = true;
		}
		early_radio.onclick = select_template;
		early_radio_li.appendChild( early_radio );
		early_radio_li.appendChild( document.createTextNode( 'Use "Early" Template' ) );

		var mid_radio_li = document.createElement( 'li' );
		var mid_radio = document.createElement( 'input' );
		mid_radio.type = 'radio';
		mid_radio.name = 'template_selection';
		mid_radio.value = 't76';
		if ( selected_template == 't76' ) {
			mid_radio.checked = true;
		}
		mid_radio.onclick = select_template;
		mid_radio_li.appendChild( mid_radio );
		mid_radio_li.appendChild( document.createTextNode( 'Use "Mid C3" Template' ) );

		var mid_late_radio_li = document.createElement( 'li' );
		var mid_late_radio = document.createElement( 'input' );
		mid_late_radio.type = 'radio';
		mid_late_radio.name = 'template_selection';
		mid_late_radio.value = 't81';
		if ( selected_template == 't81' ) {
			mid_late_radio.checked = true;
		}
		mid_late_radio.onclick = select_template;
		mid_late_radio_li.appendChild( mid_late_radio );
		mid_late_radio_li.appendChild( document.createTextNode( 'Use "Late C3/Early C4" Template' ) );


		var late_radio_li = document.createElement( 'li' );
		var late_radio = document.createElement( 'input' );
		late_radio.type = 'radio';
		late_radio.name = 'template_selection';
		late_radio.value = 't89';
		if ( selected_template == 't89' ) {
			late_radio.checked = true;
		}
		late_radio.onclick = select_template;
		late_radio_li.appendChild( late_radio );
		late_radio_li.appendChild( document.createTextNode( 'Use "Late C4/C5" Template' ) );


		select_template_ul.appendChild( early_radio_li );
		select_template_ul.appendChild( mid_radio_li );
		select_template_ul.appendChild( mid_late_radio_li );
		select_template_ul.appendChild( late_radio_li );

		select_template_div.appendChild( select_template_ul );

		personalize_div.appendChild( vin_container );
		personalize_div.appendChild( dealer_container );
		personalize_div.appendChild( delivery_container );
		personalize_div.appendChild( select_template_div );


		if ( finished_basic_options === false ) {
			vin_input.disabled = true;
			dealer1_input.disabled = true;
			dealer2_input.disabled = true;
			delivery_input.disabled = true;
		}


		var make_sticker = document.createElement( 'button' );
		personalize_div.appendChild( make_sticker );

		make_sticker.innerHTML = 'Create Build Sticker';
		make_sticker.className = 'create_sticker';

		var click_text = document.createElement( 'p' );
		click_text.innerHTML = "Clicking the \"Create Build Sticker\" button will generate your \"Build Sticker\" as a PDF document.";
		personalize_div.appendChild( click_text );

		var details_text = document.createElement( 'p' );
		details_text.innerHTML = "After clicking the button, you may need to allow your web browser to accept or download the Adobe PDF document.  If you cannot open the file, you can <a href=\"http://get.adobe.com/reader/\">download Adobe Reader here</a>.";
		personalize_div.appendChild( details_text );



		make_sticker.onclick = function() {
			if ( finished_basic_options === true ) {
				var url = '/sticker/create_sticker/build-sticker-'+selected_template+'.pdf?yr='+encodeURI( selected_year )+'+&';


				var delivery = document.getElementById( 'delivery' ).value;
				var vin = document.getElementById( 'vin' ).value;
				var dealer1 = document.getElementById( 'dealer1' ).value;
				var dealer2 = document.getElementById( 'dealer2' ).value;

				url += 'delivery='+URLEncodeString( delivery )+'&vin='+URLEncodeString( vin )+'&dealer1='+URLEncodeString( dealer1 )+'&dealer2='+URLEncodeString( dealer2 )+'&';

				var submit_options = new Array();
				
				for( var i in base_options ) {
					var option_obj = base_options[i];

					var description_to_use = option_obj.description;
					if ( option_obj.ext_desc1 != undefined && option_obj.ext_desc1 != null && option_obj.ext_desc1.length > 0 ) {
						description_to_use = option_obj.ext_desc1;
					}

					submit_options.push( Array( URLEncodeString( option_obj.rpo ), URLEncodeString( description_to_use ), URLEncodeString( option_obj.price ), URLEncodeString( option_obj.group ), URLEncodeString( option_obj.ext_desc2 ), URLEncodeString( option_obj.hidden ) ).join('|') );
				}
				
				for ( var urpo in selected_extra_options ) {
					if ( selected_extra_options[ urpo ] !== false ) {
						var option_obj = selected_extra_options[ urpo ];

						var description_to_use = option_obj.description;
						if ( option_obj.ext_desc1 != undefined && option_obj.ext_desc1 != null && option_obj.ext_desc1.length > 0 ) {
							description_to_use = option_obj.ext_desc1;
						}

						if ( selected_extra_options instanceof Object ) {
							submit_options.push( Array( URLEncodeString( option_obj.rpo ), URLEncodeString( description_to_use ), URLEncodeString( option_obj.price ), URLEncodeString( option_obj.group ), URLEncodeString( option_obj.ext_desc2 ), URLEncodeString( option_obj.hidden ) ).join('|') );
						}
					}
				}

				window.open( url+'options='+submit_options.join(':|:') ,'_newtab');

			}
		}
	}
	
	
	function draw_selection( g, options ) {
		var sel_box = document.getElementById( 'base_option-'+g );
		if ( !sel_box ) {
			sel_box = document.createElement( 'div' );
			sel_box.id = 'base_option-'+g;
			base_options_div.appendChild( sel_box );
		} else {
			removeChildrenOfElement( sel_box );
		}

		var header_div = document.createElement( 'div' );
		header_div.className = 'select_option_header';
		header_div.innerHTML = 'Select '+options_labels[g];
		sel_box.appendChild( header_div );

		function draw_option_row( g, option_result ) {
			var sel_table = document.createElement( 'table' );
			sel_table.className = 'select_option_table';
			var sel_table_body = document.createElement( 'tbody' );
			var tr = document.createElement( 'tr' );
			var rpo_cell = document.createElement( 'td' );
			var description_cell = document.createElement( 'td' );
			var price_cell = document.createElement( 'td' );
			tr.className = 'select_option_table_row';
			rpo_cell.className = 'select_option_table_rpo_cell rpo_cell';
			description_cell.className = 'select_option_table_description_cell description_cell';
			price_cell.className = 'select_option_table_price_cell price_cell';
			tr.appendChild( rpo_cell );
			tr.appendChild( description_cell );
			tr.appendChild( price_cell );

			rpo_cell.innerHTML = option_result[3];
			description_cell.innerHTML = option_result[6];
			price_cell.innerHTML = option_result[4];

			sel_table_body.appendChild( tr );
			sel_table.appendChild( sel_table_body );
			sel_box.appendChild( sel_table );
			
			tr.onclick = function() {
				var g_index = findInArray( option_groups, g );
				// var g_index = option_groups.indexOf( g );
				if ( g == 0 ) g_index = 0;

				base_options.splice( g, base_options.length );

				base_options[g] = new Object();
				base_options[g].rpo = option_result[3];
				base_options[g].description = option_result[6];
				base_options[g].ext_desc1 = option_result[7];
				base_options[g].ext_desc2 = option_result[8];
				base_options[g].price = option_result[4];
				base_options[g].urpo = option_result[1];
				base_options[g].group = option_result[5];
				base_options[g].hidden = option_result[9];

				if ( g_index + 1 >= option_groups.length ) {
					finished_basic_options = true;
				}
				make_selection( option_groups[ g_index + 1 ] );
			}
		}
		
		for ( var i = 0; i < options.results.length; i++ ) {
			draw_option_row( g, options.results[i] );
		}
	}

	function URLEncodeString( str ) {
		if ( str != null ) {
			str = str.replace(/\&/g, '%26');
			str = str.replace(/\#/g, '%23');
		} else
			str = '';
		return encodeURI( str );
	}

/* 	function findInArray( arr, itm ) {
		for( var i = 0; i < arr.length; i++ ) {
			if ( arr[ i ] == itm ) return i;
		}
		return false;
	}	 */
}


function findInArray ( array, searchString ) {
	var found = -1;

	for ( var i = 0; i < array.length; i++ ) {
		if ( array[ i ] == searchString ) {
			found = i;
			break;
		}
	}

	return found;
}



function getXMLHttpRequest() {
  if (window.XMLHttpRequest) {
    return new window.XMLHttpRequest;
  } else {
    try {
      return new ActiveXObject("MSXML2.XMLHTTP.3.0");
    } catch(ex) {
      return null;
    }
  }
}

var sticker = new BuildSticker;
sticker.start();

// // if (!Array.indexOf) {
	// Array.prototype.indexOf = function( obj, start ) {
		// // for (var i = (start || 0); i < this.length; i++) {
			// // if (this[i] == obj) {
				// // return i;
			// // }
		// // }
		// // return -1;
	// }
// // }
