var uniqueid = 1;
var main_menu = null; 

function menu() {
	this.id = "m_" + (uniqueid++);
	// create and add new container for this menu
	new Insertion.Bottom('body', "<div class='dropmenu' id='"+this.id+"'></div>");
	// make item invisible
	$(this.id).hide();
	
	this.parent = null;
	
	this.items = new Array();

	// add menu items
	this.addItem = function ( item ) {
		// assign parent
		if(item.hasSub == true)
			item.subMenu.setParent( this );
	
		this.items.push(item);
	}

	// check for open menus that need to be collapsed
	this.checkOpen = function ( event ) {

		for(var i = 0; i < this.items.size(); i++) {
			if(this.items[i].hasSub == true) {
				if(!this.items[i].subMenu.isMouseIn(event))
					this.items[i].subMenu.hide();
			}
		}
		// if nothing open in self, goaway
		if(!this.isMouseIn(event))
			this.hide();
	}

	// access to child items
	this.getChild = function ( index ) {
		return this.items[index];
	}

	// hide menu
	this.hide = function () {
		// hide element
		$(this.id).hide();
		
		// empty element
		$(this.id).innerHTML = "";
		
		// tell children to hide
		for(var i = 0; i < this.items.size(); i++)
			if(this.items[i].hasSub == true)
				this.items[i].subMenu.hide();
	}
	
	// check if mouse is in this menu
	this.isMouseIn = function ( event ) {
		// is mouse in this element?
		var elem = ($(this.id).firstDescendant() ? $(this.id).firstDescendant() : $(this.id));
		if(Position.within(elem, Event.pointerX(event), Event.pointerY(event)))
			return true;

		// is it in a child element?
		for(var i = 0; i < this.items.size(); i++)
			if(this.items[i].hasSub == true) {
				if(this.items[i].subMenu.isMouseIn(event))
					return true;
			}
		// all the way through, mouse must be gone 
		return false;
	}
	
	// register mouseover & mouseout events
	this.register = function () {
		for(var i = 0; i < this.items.size(); i++)
			this.items[i].register();
		
		// register mouse out function for this menu
		var menu = this;
		
		Element.observe(this.id, 'mouseout', function (event) {  
			// do a check if cursor is on a child
			if(menu.isMouseIn(event)) {
				Event.stop(event);
				return; 
			}
			// hide menu
			menu.hide();
			
			// make menu perform check
			main_menu.checkOpen(event);
		} );
	}
	
	// set parent menu (for mouse outs)
	this.setParent = function ( parent ) {
		this.parent = parent;
	}
	
	// show menu
	this.show = function (anchor, direction, amount) { 
		var html = "<ol class='dropmenu'>";
		for(var i = 0; i < this.items.size(); i++)
			html += this.items[i].show();
		html += "</ol>";
		// put html into the DOM
		$(this.id).innerHTML = html;
		
		// position element
		switch(direction) {
		case "below":
			Position.clone(anchor, this.id, { setWidth: false, setHeight: false, offsetTop: amount });
			break;
		case "right":
		default: 
			Position.clone(anchor, this.id, { setWidth: false, setHeight: false, offsetLeft: amount });
		}
		
		// make element visible
		$(this.id).show();
		
		// register events
		this.register();
	}	
	
}

function menu_item(title, link) {
	this.id = "mi_" + (uniqueid++);
	
	this.title = title;
	this.link = link;
	
	this.hasSub = false;
	
	// check if mouse is in this item or sub menu
	this.isMouseIn = function ( event ) {
		// dont check self
	
		// is it in sub menu?
		if(this.hasSub) {
			return this.subMenu.isMouseIn(event);
		}
		// not in me
		return false;
	}
	
	// register mouse over events if necessary
	this.register = function () {
		if(this.hasSub == true) {
			var item = this;
			var menu = this.subMenu;
			Element.observe(this.id, 'mouseover', function () {  
				menu.show(this.id, 'right', 195);
			} );
			
			Element.observe(this.id, 'mouseout', function (event) {  
				// do a check if cursor is on a child
				if(item.isMouseIn(event)) {
					Event.stop(event);
					return; 
				}
				// hide menu
				menu.hide();
				
				// make menu perform check
				main_menu.checkOpen(event);
			} );
		}
	}
	
	// assign a sub menu
	this.setSubmenu = function ( menu ) {
		this.subMenu = menu;
		this.hasSub = true;
	}
	
	// get html for the item
	this.show = function () {
		return "<li><a id='"+this.id+"' href='"+(this.link ? this.link : '#')+"'>"+this.title+"</a></li>";
	}
	
}

// define menus
//////////////////////////
Event.observe(window, "load", function () {
	main_menu = new menu();
	main_menu.addItem( new menu_item("Wide Format INKJET", null) );
	main_menu.addItem( new menu_item("Digital Proofing Media", null) );
	main_menu.addItem( new menu_item("Enginnering Media", null) );
	main_menu.addItem( new menu_item("Printable Plastics", "http://www.alamedasupplies.com/printableplastics.html") );
	main_menu.addItem( new menu_item("Commercial Printer Supplies", null) );


	var wide_menu = new menu();
	wide_menu.addItem( new menu_item("Photobase Papers",null) );
	wide_menu.addItem( new menu_item("Banner Media",null) );
	wide_menu.addItem( new menu_item("Clear Films",null) );
	wide_menu.addItem( new menu_item("Specialty Media",null) );

	var bond_menu = new menu();
	bond_menu.addItem( new menu_item("24 lb coated one side H/R bond paper","http://www.alamedasupplies.com/24lbc1s.php") );
	bond_menu.addItem( new menu_item("24 lb coated two side H/R bond paper","http://www.alamedasupplies.com/24lbc2s.php") );
	bond_menu.addItem( new menu_item("32 lb coated one side H/R bond paper","http://www.alamedasupplies.com/32lbc1s.php") );
	bond_menu.addItem( new menu_item("32 lb coated two side H/R bond paper","http://www.alamedasupplies.com/32lbc2s.php") );
	bond_menu.addItem( new menu_item("45 lb coated one side H/R bond paper","http://www.alamedasupplies.com/45lbc1s.php") );
	bond_menu.addItem( new menu_item("45 lb coated two side H/R bond paper","http://www.alamedasupplies.com/45lbc2s.php") );
	bond_menu.addItem( new menu_item("61 lb coated one side H/R bond paper","http://www.alamedasupplies.com/61lbc1s.php") );
	bond_menu.addItem( new menu_item("Ultra bright bond","http://www.alamedasupplies.com/ubb.php") );

	var photo_menu = new menu();
	photo_menu.addItem( new menu_item(".005 photobase papers gloss finish","http://www.alamedasupplies.com/5phg.php") );
	photo_menu.addItem( new menu_item(".005 photobase papers satin finish","http://www.alamedasupplies.com/5phs.php") );
	photo_menu.addItem( new menu_item(".007 photobase papers gloss finish","http://www.alamedasupplies.com/7phg.php") );
	photo_menu.addItem( new menu_item(".007 photobase papers satin finish","http://www.alamedasupplies.com/7phs.php") );
	photo_menu.addItem( new menu_item(".009 photobase papers gloss finish","http://www.alamedasupplies.com/9phs.php") );
	photo_menu.addItem( new menu_item(".008 uni photobase papers gloss finish","http://www.alamedasupplies.com/8uniphg.php") );
	photo_menu.addItem( new menu_item(".008 uni photobase papers satin finish","http://www.alamedasupplies.com/8uniphs.php") );
	photo_menu.addItem( new menu_item(".010 uni photobase papers gloss finish","http://www.alamedasupplies.com/10uniphg.php") );
	photo_menu.addItem( new menu_item(".010 uni photobase papers satin finish","http://www.alamedasupplies.com/10uniphs.php") );

	var banner_menu = new menu();
	banner_menu.addItem( new menu_item(".008 polypropylene banner","http://www.alamedasupplies.com/8ppb.php") );
	banner_menu.addItem( new menu_item(".008 pet banner","http://www.alamedasupplies.com/8petb.php") );
	banner_menu.addItem( new menu_item(".014 medium weight scrim vinyl","http://www.alamedasupplies.com/14mv.php") );
	banner_menu.addItem( new menu_item(".015 heavy weight block out scrim vinyl","http://www.alamedasupplies.com/15hv.php") );
	banner_menu.addItem( new menu_item(".018 premium scrim vinyl 2-side block out","http://www.alamedasupplies.com/18pv2s.php") );
	banner_menu.addItem( new menu_item("cold laminating films gloss finish","http://www.alamedasupplies.com/clamg.php") );
	banner_menu.addItem( new menu_item("cold laminating films luster finish","http://www.alamedasupplies.com/claml.php") );
	banner_menu.addItem( new menu_item("cold laminating films matte finish","http://www.alamedasupplies.com/clamm.php") );
	banner_menu.addItem( new menu_item("cold laminating films heavy matte finish","http://www.alamedasupplies.com/clamhm.php") );

	var clear_menu = new menu();
	clear_menu.addItem( new menu_item(".004 clear transparency film with no bond","http://www.alamedasupplies.com/ctrnob.php") );
	clear_menu.addItem( new menu_item(".004 clear transparency film with bond interleaf","http://www.alamedasupplies.com/ctrwb.php") );
	clear_menu.addItem( new menu_item(".004 clear dye line with no bond interleaf","http://www.alamedasupplies.com/cdlnob.php") );
	clear_menu.addItem( new menu_item(".004 clear dye line with bond interleaf","http://www.alamedasupplies.com/cdlwb.php") );
	clear_menu.addItem( new menu_item(".004 clear film with stripe for HP printers","http://www.alamedasupplies.com/cwstrhp.php") );

	var special_menu = new menu();
	special_menu.addItem( new menu_item(".005 polyester backlit reverse print film","http://www.alamedasupplies.com/spcl-005.php") );
	special_menu.addItem( new menu_item(".012 polycarb backlit reverse print film","http://www.alamedasupplies.com/spcl-012r.php") );
	special_menu.addItem( new menu_item(".012 polycarb backlit front print film","http://www.alamedasupplies.com/spcl-012f.php") );
	special_menu.addItem( new menu_item(".004 white opaque film gloss","http://www.alamedasupplies.com/spcl-004.php") );
	special_menu.addItem( new menu_item(".010 white opaque vinyl with adhesive","http://www.alamedasupplies.com/spcl-010.php") );
	special_menu.addItem( new menu_item(".017 uv matte stretch canvas","http://www.alamedasupplies.com/uvmcanv.php") );
	special_menu.addItem( new menu_item(".019 uv gloss cotton / poly canvas","http://www.alamedasupplies.com/uvgcanv.php") );

	var proof_menu = new menu();
	proof_menu.addItem( new menu_item("Contract","http://www.alamedasupplies.com/images/FXMatchmakerProofingMedia020408.pdf"));
	proof_menu.addItem( new menu_item("Imposition","http://www.alamedasupplies.com/images/FXBondsandImpositionGuide072607.pdf"));


	var contract_menu = new menu();
	contract_menu.addItem( new menu_item("Product Overview","http://www.alamedasupplies.com/images/FXMatchmakerProofingMedia020408.pdf"));
	contract_menu.addItem( new menu_item(".008 commercial proofing base gloss ","http://www.alamedasupplies.com/8cpg.php") );
	contract_menu.addItem( new menu_item(".008 commercial proofing base satin","http://www.alamedasupplies.com/8cps.php") );
	contract_menu.addItem( new menu_item(".010 commercial proofing base gloss","http://www.alamedasupplies.com/10cpg.php") );
	contract_menu.addItem( new menu_item(".010 commercial proofing base satin","http://www.alamedasupplies.com/10cps.php") );
	contract_menu.addItem( new menu_item(".007 publication proofing base satin","http://www.alamedasupplies.com/7ppg.php") );
	contract_menu.addItem( new menu_item(".007 publication proofing base gloss","http://www.alamedasupplies.com/7pps.php") );
	contract_menu.addItem( new menu_item(".008 premium publication proofing base satin","http://www.alamedasupplies.com/8ppps.php") );
	contract_menu.addItem( new menu_item(".010 premium publication proofing base satin","http://www.alamedasupplies.com/10ppps.php") );
	contract_menu.addItem( new menu_item(".007 platinium dual proof satin","http://www.alamedasupplies.com/7pdp2s.php") );
	contract_menu.addItem( new menu_item("35 lb super news-proof","http://www.alamedasupplies.com/snewsp.php") );
	contract_menu.addItem( new menu_item(".005 premium heavy super news-proof ","http://www.alamedasupplies.com/phsnewsp.php") );

	var imposition_menu = new menu();
	imposition_menu.addItem( new menu_item("Product Overview","http://www.alamedasupplies.com/images/FXBondsandImpositionGuide072607.pdf"));
	imposition_menu.addItem( new menu_item("43 wide plus imposition 2-side printable","http://www.alamedasupplies.com/43wp2s.php") );
	imposition_menu.addItem( new menu_item("sherpa plus imposition 2-side printable","http://www.alamedasupplies.com/shp2s.php") );
	imposition_menu.addItem( new menu_item("spin jet plus imposition 2-side printable","http://www.alamedasupplies.com/sjp2s.php") );
	imposition_menu.addItem( new menu_item("spin jet plus heavy imposition 2-side printable","http://www.alamedasupplies.com/sjph2s.php") );
	imposition_menu.addItem( new menu_item("xact cut plus imposition 2-side printable","http://www.alamedasupplies.com/xcp2s.php") );
	imposition_menu.addItem( new menu_item("epson double proofer plus imposition 2-side","http://www.alamedasupplies.com/edpp2s.php") );

	var eng_menu = new menu();
	eng_menu.addItem( new menu_item("Bond Papers",null) );
	eng_menu.addItem( new menu_item("Tint Bases",null) );
	eng_menu.addItem( new menu_item("Films",null) );

	var media_menu = new menu();
	media_menu.addItem( new menu_item(".0085 cl coated papers for epson gloss","http://www.alamedasupplies.com/epcpg.php") );
	media_menu.addItem( new menu_item(".0085 cl coated papers for epson semi gloss","http://www.alamedasupplies.com/epcps.php") );
	media_menu.addItem( new menu_item("photo papers for epson gloss","http://www.alamedasupplies.com/epppg.php") );
	media_menu.addItem( new menu_item("photo papers for epson semi gloss","http://www.alamedasupplies.com/eppps.php") );
	media_menu.addItem( new menu_item("professional papers for epson gloss","http://www.alamedasupplies.com/epprpg.php") );
	media_menu.addItem( new menu_item("professional papers for epson semi matte","http://www.alamedasupplies.com/epprps.php") );
	media_menu.addItem( new menu_item("premium ink jet paper","http://www.alamedasupplies.com/eppij.php") );
	media_menu.addItem( new menu_item("medium weight matte paper","http://www.alamedasupplies.com/epmwm.php") );
	media_menu.addItem( new menu_item("premium m/w presentation paper","http://www.alamedasupplies.com/epmwpm.php") );
	media_menu.addItem( new menu_item("premium h/w presentation paper","http://www.alamedasupplies.com/eppmwm.php") );
	media_menu.addItem( new menu_item(".008 ep publication proofing base for epson","http://www.alamedasupplies.com/8eppubs.php") );
	media_menu.addItem( new menu_item(".010 ep publication proofing base for epson","http://www.alamedasupplies.com/10eppubs.php") );

	var print_menu = new menu();
	print_menu.addItem( new menu_item("Static Cling Vinyl","http://www.alamedasupplies.com/printableplastics.html") );
	print_menu.addItem( new menu_item("Flexible Vinyl","http://www.alamedasupplies.com/printableplastics.html") );
	print_menu.addItem( new menu_item("Printable Rigid Vinyl (PVC)","http://www.alamedasupplies.com/printableplastics.html") );
	print_menu.addItem( new menu_item("Oriented Polyester","http://www.alamedasupplies.com/printableplastics.html") );
	print_menu.addItem( new menu_item("Alacopy","http://www.alamedasupplies.com/printableplastics.html") );

	var static_menu = new menu();
	static_menu.addItem( new menu_item("T/C Clear .0075", "http://www.alamedasupplies.com/printableplastics.html" ) );
	static_menu.addItem( new menu_item("T/C White .0075","http://www.alamedasupplies.com/printableplastics.html") );

	var flex_menu = new menu();
	flex_menu.addItem( new menu_item("T/C Clear .004","http://www.alamedasupplies.com/printableplastics.html") );
	flex_menu.addItem( new menu_item("T/C White .004","http://www.alamedasupplies.com/printableplastics.html") );

	var rigid_menu = new menu();
	rigid_menu.addItem( new menu_item("Clear-Matte or Gloss or Matte Gloss .005,.007,.010,.015,.020","http://www.alamedasupplies.com/printableplastics.html") );
	rigid_menu.addItem( new menu_item("Scratch Resistant Vinyl (SEV) 010,.015,.020","http://www.alamedasupplies.com/printableplastics.html") );
	rigid_menu.addItem( new menu_item("White and Colors Matte,Gloss,Matte/Gloss .005,.007,.010,.015,.020","http://www.alamedasupplies.com/printableplastics.html") );

	var poly_menu = new menu();
	poly_menu.addItem( new menu_item("Prepared for Printing Clear + Semitransparent Gloss + Matte texturing .004,.005,007,010","http://www.alamedasupplies.com/printableplastics.html") );

	var ala_menu = new menu();
	ala_menu.addItem( new menu_item("Plain Paper Copier","http://www.alamedasupplies.com/printableplastics.html") );
	ala_menu.addItem( new menu_item("Transparency Film","http://www.alamedasupplies.com/printableplastics.html") );
	ala_menu.addItem( new menu_item("Clear 2-Sided Gloss","http://www.alamedasupplies.com/printableplastics.html") );
	ala_menu.addItem( new menu_item("2-Sided Printable","http://www.alamedasupplies.com/printableplastics.html") );
	ala_menu.addItem( new menu_item(".005 81/2X11, 11X17 1000 per box other sizes on request","http://www.alamedasupplies.com/printableplastics.html") );

	var comprint_menu = new menu();
	comprint_menu.addItem( new menu_item("Pre Press Products",null) );
	comprint_menu.addItem( new menu_item("Press Room Products",null) );
	comprint_menu.addItem( new menu_item("Bindery Products",null) );

	var prepress_menu = new menu();
	prepress_menu.addItem( new menu_item("Masking Sheets",null) );
	prepress_menu.addItem( new menu_item("Stripping Supplies",null) );

	var pressroom_menu = new menu();
	pressroom_menu.addItem( new menu_item("Cleanup Sheets",null) );
	pressroom_menu.addItem( new menu_item("Fountain Liners",null) );
	pressroom_menu.addItem( new menu_item("Press Pack",null) );

	var bindery_menu = new menu();
	bindery_menu.addItem( new menu_item("Vinyl Covers",null) );


	// structure menus
	//////////////////////////
	main_menu.getChild(0).setSubmenu( wide_menu );
	main_menu.getChild(1).setSubmenu( proof_menu );
	main_menu.getChild(2).setSubmenu( eng_menu );
	main_menu.getChild(3).setSubmenu( print_menu );
	main_menu.getChild(4).setSubmenu( comprint_menu );

	wide_menu.getChild(0).setSubmenu( photo_menu );
	wide_menu.getChild(1).setSubmenu( banner_menu );
	wide_menu.getChild(2).setSubmenu( clear_menu );
	wide_menu.getChild(3).setSubmenu( special_menu );

	proof_menu.getChild(0).setSubmenu( contract_menu );
	proof_menu.getChild(1).setSubmenu( imposition_menu );

	eng_menu.getChild(0).setSubmenu( bond_menu );

	print_menu.getChild(0).setSubmenu( static_menu );
	print_menu.getChild(1).setSubmenu( flex_menu );
	print_menu.getChild(2).setSubmenu( rigid_menu );
	print_menu.getChild(3).setSubmenu( poly_menu );
	print_menu.getChild(4).setSubmenu( ala_menu );
	
	comprint_menu.getChild(0).setSubmenu( prepress_menu );
	comprint_menu.getChild(1).setSubmenu( pressroom_menu );
	comprint_menu.getChild(2).setSubmenu( bindery_menu );

	// Event listeners
	//////////////////////////
	Event.observe('products', 'mouseover', function () { main_menu.show(this, 'below', 28); });
	Event.observe('products', 'mouseout', function (event) { main_menu.checkOpen(event); });

} );
