function bench(id,op,msg)
	{
	if(DEF_IE_VERSION != DEF_NOT_IE) { return; }
	if(typeof bench == 'undefined')
		{
		bench = new Array();
		}
		
	if(typeof bench[id] == 'undefined')
		{
		bench[id] = new Array();
		}
		
	switch(op) {
	 case 'start':
		bench[id]['start'] = new Date().getTime();
		return;
		break;
	 case 'end':
	 	bench[id]['end'] = new Date().getTime();
		break;
	 case 'mark':
	 	var markTime = new Date().getTime();
	 	var elapsed = markTime - bench[id]['start'];
	 	var logout = 'Benchmark '+id+' marked at '+elapsed+'ms';
	 	logout += (msg ? ' Hello from '+msg : '');
	 	console.log(logout);
	 	return;
	 	break;
	 default:
	 	console.log('unclosed bench');
	 	}
	 	
	var elapsed = bench[id]['end'] - bench[id]['start'];
	console.log("Benchmark "+id+" took "+elapsed+"ms");
	}

function agr_string_width(string)
	{
		var cs = document.getElementById('calc_scratch');
		var mm = document.getElementById('measure_me');
		var span = cs.insertBefore(document.createElement('span'),mm);
		span.innerHTML = string;
		var w = mm.offsetLeft;
		cs.removeChild(span);
		return w;
	}
		

function agr_rejigger(){
	
	fixedElements = new Array();
	buttonElements = new Array();
	formElements = new Array();
	
	if(document.forms['frmSearch_TN'])
		{
			formElements['top_nav_search'] = document.forms['frmSearch_TN'];
		}
		
	// account for multiple body classes
	
	var pageClasses = pagetype.split(/\s/g);
	for(var i = 0;i< pageClasses.length;i++)
		{
		// it's gotta come first if you want it to work.
		pagetype = pageClasses[i].match(/product|category|checkout|article|cart|search|home|popup/)[0];
		}
	
	if(pagetype == -1) { 
		console.log('unknown page type');
		return;
		// this is ususally a problem....
		}
	
	if(DEF_IE_VERSION < 8)
			{
			// hide the left border on the foot menu;
			var mi = document.getElementById('foot_menu').childNodes[0];
			mi.childNodes[0].style.borderLeft = '0px';
			var dm = document.getElementById('drop_down_menu');
			var subs = getElementsByClass('has_sub',dm,'li');
			for(var i = 0;i<subs.length;i++)
				{
				subs[i].childNodes[0].innerHTML = subs[i].childNodes[0].innerHTML + '&nbsp;&raquo';
				}
			}
	
		
switch(pagetype)
	{	
		case 'popup':
			if(document.getElementById('pop'))
				{
					document.getElementById('pop').src = agr_parseuri().file;
				}
				addEvent(document.getElementById('close'),'click',function() {window.close();});
			break;
					
		case 'product':
			
			/* a lot of this stuff SHOULD be doable in template, but the template language is limited
			in M6 so we have to do it javascript */
			
			/* remove any extra periods left over by the letters */
			var letters = getElementsByClass('letter',document.getElementById('copy_wrap'),'span');
			for(var i=0;i<letters.length;i++)
				{
				if(letters[i].innerHTML.match(/\&nbsp;|\ss/))
					{
						letters[i].innerHTML = "";
					}
				}
			
			/* now we rejigger the spec box quite a bit. */
			
			// retrieve your necessaries sarah!
			var im = document.getElementById("image");
			var ab = document.getElementById("attribute_box");
			var aw = getElementsByClass("att_wrap",ab,'div');
			var cw = document.getElementById("copy_wrap");
			
			var pi = document.getElementById("primary");
			var di = document.getElementById("detail_images");
			var nc=3; //number of columns in spec box;
			var double_col = 234;
			var single_col = 115;
			var min_width = '330px';
			var max_width = '399px';
			var center_threshold = 450;
			var adjust = 4;
			var atbw = single_col+6; // magic numbers!
			var max_char_length = 20;
			var max_pix_length = 115;
		
			if(DEF_IE_VERSION < 8)
				{
				if(DEF_IE_VERSION == 7)
					{
					single_col = 104;
					double_col = 211;
					center_threshold = 390;
					min_width = '330px';
					}
				if(DEF_IE_VERSION == 6)
					{
					single_col = 100;
					double_col = 206;
					min_width = '330px';
					max_char_length = 14; 
					}
				if(DEF_IE_VERSION == 5.5)
					{
					single_col = 115;
					double_col = 239;
					}
				}
					
			var col_half = ((double_col+single_col)/2)-1;
			
			if(DEF_IE_VERSION < 8)
				{
				col_half += 1;
					if(DEF_IE_VERSION < 6)
					{
						col_half += 2;
					}
				}
										
			var image_widths = pi.offsetWidth + (di ? di.offsetWidth : 0);
			
			// check the configuration of our detail images
			if(image_widths >= 700 || pi.offsetHeight <= 300 || !(di.childNodes.length> 1))
				{
				document.getElementById('main_image').className="main_image_wide";
				if(di) {di.className="detail_images_wide"; }
				if(di.childNodes.length <= 1) { di.style.display = 'none'; }
				}
			
			var im_width = im.scrollWidth;
			// center the image if it's to wide, then align the att box under it 

			if(im_width >= center_threshold) { im.style.width="100%"; cw.style.top="-45px"; adjust=6;}
			else 
				{
				ab.style.width=(im_width%2)+im_width+'px'; 
				adjust=2;
				}
			
				
			// max-width of attbox
						
			var ab_width = ab.offsetWidth;
			
			if(ab_width < min_width) { ab.style.width = min_width;}
						
			var padding_left = (ab_width % atbw)/ 2+1;
			var padding_right = (ab_width % atbw+adjust)/2;
			
			// debugger;
			
			if(DEF_IE_VERSION != DEF_NOT_IE)
				{
				 	if(ab_width <= 337)
				 		{
				 		padding_left = 0;
				 		padding_right = 6;
				 		}
				 	if(ab_width >= 337)
				 		{
				 		padding_left += 10;
				 		padding_right += 15;
				 		}
				}
			
			var total_width = ab_width - (padding_left + padding_right);
			nc = Math.round(total_width/single_col);
			
			if(DEF_IE_VERSION < 8)
				{
					if(nc == 3) {padding_right += 9;}
					if(nc == 2) {padding_right -= 3;}
				}
			if(DEF_IE_VERSION < 7)
				{
					if(nc == 3) {padding_right += 3;}
					if(nc == 2) {padding_right += 2;}
				}
			
			padding_left = padding_left > 0 ? padding_left : 0;
			padding_right = padding_right > 0 ? padding_right : 0;

			
			// we're talking to each of the attribute areas on a page
			for (var i=0;i<aw.length;i++)
				{
				/* CENTER THE ATTRIBUTE AREAS UNDER THE IMAGE */
				if(DEF_IE_VERSION >= 6)
					{
				// center them
					aw[i].style.paddingLeft = padding_left+"px";
					aw[i].style.paddingRight = padding_right+"px";
					}
				else
					{
					aw[i].style.left = ((ab_width % atbw)+1)/2+"px";
					aw[i].style.paddingRight = (ab_width % atbw+adjust)+"px";
					}		
				
				var atts = getElementsByClass("attribute",aw[i],"span");
				
				var lgt = atts.length;					
				var col = 1;
				// we're talking to all of the invididual boxes
				var widths = new Array(lgt);
								
				for(var x=0;x<lgt;x++)
					{	
						
						if(col > nc) {col=1;}
						// check to see if the attribute box needs to be wider...
						// var hgt = atts[x].offsetHeight; // THIS is the slow statement...
						var ch_len = atts[x].innerText || atts[x].textContent;
						//if(agr_string_width(ch_len) > single_col-8 ) // checking the width of the string is riduculously slow - this is good enough.
						if(ch_len.length > max_char_length)
							{
							if(nc == 2 && col == 1) { widths[x] = double_col; col = 1; continue;}
							if(nc == 2 && col == 2) { widths[x] = double_col;
													  widths[x-1] = double_col; col = 1; continue;}
							widths[x] = col_half;
							if(col == 1) { widths[x+1] = col_half; col = 1; x++; continue;}
							if(col == 2) { widths[x-1] = col_half; col = 1; continue;}
							if(col == 3) { widths[x-2] = col_half;
										   widths[x-1] = col_half;
										   widths[x+1] = col_half; col = 1; x++; continue;}
							}
						else if (lgt < nc)
							{
							if(nc == 2 && lgt == 1) {widths[x] = double_col; continue;}
							if(nc-lgt == 2) {widths[x] = col_half * 2; continue;}
							if(nc-lgt == 1) {widths[x] = col_half;
											 widths[x+1] = col_half; x++; continue;}
							}
						else
							{
							widths[x] = single_col;
							col++;
							}
							
						// if(atts[x].nextSibling.nextSibling.nextSibling.tagName == 'DIV') {col = 1;}
					}
				
				for(var k=0;k<atts.length;k++)
					{
					// reassign all of the width;
					if(widths[k] != single_col)
						{
						atts[k].style.width = widths[k]+'px';								
						}
					}
				}
				
			// this horse-puckey addresses a safari bug.  damn you safari.  you have to "kick" the style on these items to get them
			// to behave properly.
				
				var ah = getElementsByClass("attribute-head",ab,"div");
				for(var l=0;l<ah.length;l++)
					{
						if(DEF_IE_VERSION == DEF_NOT_IE)
							{
							ah[l].style.paddingRight = "5px";  /// you can change this to anything.
							}
				
						if(nc == 2)
							{
							var at = getElementsByClass("attbox_text",ah[l],"div");
							for (var j=0;j<at.length;j++)
								{
								if(DEF_IE_VERSION > 6)
									{
										at[j].style.width = '100%';
									}
								else
									{
										at[j].style.width = '90%';
									}
								}
							}					
					}
							
			
			// set fixed elements 
			fixedElements["footer"] = document.getElementById('footer');
			fixedElements["footer_wrap"] = document.getElementById('footer_wrap');
			fixedElements["end_feature"] = document.getElementById('end_feature');
			fixedElements["end_feature_wrap"] = document.getElementById('end_feature_wrap');
			fixedElements["body_wrap"] = document.getElementById('body_wrap');
			fixedElements["drop_down_menu"] = document.getElementById('drop_down_menu');
			fixedElements["topper"] = document.getElementById('topper');
			buttonElements = buttonElements.concat(getElementsByClass('addtocart',ab,'input'));
			buttonElements = buttonElements.concat(getElementsByClass('buy_but',document.getElementById('carousel'),'a'));
			break;
			
		case 'category':
			
			/* needs some extra padding if there's a category message */
			var cm = document.getElementById('category_message');
			var cl = document.getElementById('category_list');
			var cmH = 0;
			if(cm && !DEF_DISABLE_FIXED)
				{
				cmH = cm.offsetHeight;
				}
				
			cl.style.marginTop = cmH-38+'px';
			
				
			fixedElements["body_wrap"] = document.getElementById('body_wrap');
			fixedElements["drop_down_menu"] = document.getElementById('drop_down_menu');
			fixedElements["topper"] = document.getElementById('topper');
			fixedElements["lefter"] = document.getElementById('lefter');
			fixedElements["header"] = document.getElementById('header');
			fixedElements["category_message"] = document.getElementById('category_message');
			
			buttonElements = buttonElements.concat(getElementsByClass('buy_but',cl,'a'));
			break;
			
		case 'checkout':
		
			/* add the auto populate behaviors */
			var el;
			if(el = document.getElementById('use_mail'))
				{
				addEvent(el,"click",function(e){agr_populate('mail_','card_','addresses','payment_info','html2val',e); return;});
				}
			if(el = document.getElementById('use_as_shipping'))
				{
				addEvent(el,"click",function(e){agr_populate('mail_','ship_','mailing_address','shipping_address','val2val',e); return;});
				}
			if(el = document.getElementById('gift_item'))
				{
				addEvent(el,"click",function(e){
					var gi = document.getElementById('gift_instructions');
					gi.style.display = (gi.style.display == '') ? 'block':'';
					return;});
				}
						
			fixedElements["checkout_lefter"]=document.getElementById('checkout_lefter');
			fixedElements["checkout_area"]=document.getElementById('checkout_area');
			fixedElements["body_wrap"]=document.getElementById('body_wrap');
			fixedElements["drop_down_menu"]=document.getElementById('drop_down_menu');
			fixedElements["topper"]=document.getElementById('topper');
			fixedElements["header"]=document.getElementById('header');
			if(document.getElementById('registered_sign_in'))
				{
				buttonElements = buttonElements.concat(getElementsByClass('sign_in',document.getElementById('checkout_area'),'input'));
				}
			break;
			
		case 'search':
			addEvent(document.getElementById('hide_copy'),"click",function(e){agr_hidestyle('short_description_copy',this);e.preventDefault ? e.preventDefault() : e.returnValue = false;});
			addEvent(document.getElementById('hide_images'),"click",function(e){agr_hidestyle('product_small_image',this);e.preventDefault ? e.preventDefault() : e.returnValue = false;});
			fixedElements["body_wrap"]=document.getElementById('body_wrap');
			fixedElements["drop_down_menu"]=document.getElementById('drop_down_menu');
			fixedElements["topper"]=document.getElementById('topper');
			fixedElements["header"]=document.getElementById('header');
			break;
		
		case 'article':
		case 'cart':
			fixedElements["body_wrap"]=document.getElementById('body_wrap');
			fixedElements["drop_down_menu"]=document.getElementById('drop_down_menu');
			fixedElements["topper"]=document.getElementById('topper');
			fixedElements["header"]=document.getElementById('header');
			buttonElements = buttonElements.concat(getElementsByClass('buy_but',document.getElementById('carousel'),'a'));
			buttonElements = buttonElements.concat(getElementsByClass('default_submit',document.getElementById('lefter'),'input'));
			formElements['quick_order_form'] = document.forms['frmQuickorder'];
			formElements['left_search'] = document.forms['left_search'];
			formElements['weekly_signup'] = document.forms['frmNewsletter'];
			break;
			
		case 'home':
			/* on the home page - the carousel spins by itself.  neato! */
			if(carousel.active){ carousel.slowSpin(); }
			formElements['quick_order_form'] = document.forms['frmQuickorder'];
			formElements['left_search'] = document.forms['left_search'];
			formElements['weekly_signup'] = document.forms['frmNewsletter'];
			buttonElements = buttonElements.concat(getElementsByClass('default_submit',document.getElementById('lefter'),'input'));
			buttonElements = buttonElements.concat(getElementsByClass('buy_but',document.getElementById('carousel'),'a'));
			break;
			
		default:
	}	
	
	
	// if form elements are activated, then add events to them.
	
	if(formElements.has('quick_order_form')) { addEvent(formElements['quick_order_form'],'submit',function(e) {agr_quick_order_validate(e);});}
	if(formElements.has('top_nav_search')){ addEvent(formElements['top_nav_search'],'submit',function(e) {agr_search_validate(e);});}
	if(formElements.has('left_search')) { addEvent(formElements['left_search'],'submit',function(e) {agr_search_validate(e);});}
	if(formElements.has('weekly_signup')) { addEvent(formElements['weekly_signup'],'focus',function(e) {agr_special_focus(e);});
											addEvent(formElements['weekly_signup'],'blur',function(e) {agr_special_blur(e);});
											addEvent(formElements['weekly_signup'],'submit',function(e) {agr_special_validate(e);});}
	
	
					
	/* we turn on all the buttons every time, and the button attacher checks for nulls not the most
	efficient way to do things, but it's easy to understand and add new buttons if we need */
	
	buttonElements[buttonElements.length] = document.getElementById('update_cart');
	buttonElements[buttonElements.length] = document.getElementById('continue_shopping');
	buttonElements[buttonElements.length] = document.getElementById('checkout');
	buttonElements[buttonElements.length] = document.getElementById('apply_keycode');
	buttonElements[buttonElements.length] = document.getElementById('left_search_submit');
	buttonElements[buttonElements.length] = document.getElementById('submit_order');
	buttonElements[buttonElements.length] = document.getElementById('revise_order');
	buttonElements[buttonElements.length] = document.getElementById('update');
	buttonElements[buttonElements.length] = document.getElementById('continue');
	buttonElements[buttonElements.length] = document.getElementById('tell_a_friend');

		
	agr_button_attach(buttonElements);
	
}

function initpage() {
	// bench('init','start');
	
	//console.log('entered init');
		
	/* INIT THE MENUS AND GLOBAL SETTINGS*/
	
	var opProp = 'display';
	var opShow = 'block';
	var opHide = 'none';
	
	
	/* turn off fixed navigation older versions of safari. */
	if(/WebKit/i.test(navigator.userAgent))
		{ 
			 var webKitFields = RegExp("( AppleWebKit/)([^ ]+)").exec(navigator.userAgent);
   			 var version = parseFloat(webKitFields[2]);
			 if(version <= 420)
				{
				DEF_DISABLE_FIXED = true;
				}
		}
	
	
	DEF_IE_VERSION = getIEVersion();
	
	
	if(DEF_IE_VERSION < 5.1)
	{
	DEF_FSMENU_COMPAT_MODE = true;
	opProp = 'visibility';
	opShow = 'visible';
	opHide = 'hidden';
	// issue a warning for IE5.
	if(hasClass(document.body,'home'))
		{	
		var warn = document.getElementById('required_field_warning');
		warn.innerHTML = "<p>You are using Internet Explorer 5. Although your browser will work with AGRussell.com - you may experience difficulties.</p>";
		warn.innerHTML +="<p class=\"legal\">We recommend <a href=\"getfirefox.com\">Firefox</a>, <a href=\"http://www.apple.com/safari/\">Safari</a>, or <a href=\"http://www.microsoft.com/windows/products/winfamily/ie/default.mspx\">IE7</a></p>";
		warn.style.display = 'block';
		}
//	document.getElementById('drop_down_wrap').style.height = '1px';
	}
	if(DEF_IE_VERSION < 7)
	{
	DEF_DISABLE_FIXED = true; // disable fixed navigation on older IES
	}
	if(DEF_IE_VERSION < 8 && DEF_IE_VERSION >= 6)
	{
	// fix flickering images in IE6.
	try { document.execCommand("BackgroundImageCache",false,true);}
	catch(err) { ; /* too bad */ }
	}
	
	var topMenuElement;
	if(topMenuElement = document.getElementById('top_menu_bar'))
		{
			
		// alloc menus
		topMenu = new FSMenu('topMenu', false, opProp,opShow,opHide);
		knivesMenu = new FSMenu('knivesMenu', false, opProp,opShow,opHide);
		accessMenu = new FSMenu('accessMenu',false,opProp,opShow,opHide);
		encyMenu = new FSMenu('encyMenu',true,opProp,opShow,opHide);
		relatedMenu = new FSMenu('relatedMenu',true,opProp,opShow,opHide);
		aboutMenu = new FSMenu('aboutMenu',true,opProp,opShow,opHide);
		
		var mN = topMenu;
		if (DEF_IE_VERSION != DEF_NOT_IE)
			{
			topMenu.onshow = function() { expand_drop(); topMenu.toggleElements(0); };
			topMenu.onhide = function() { collapse_drop(); topMenu.toggleElements(1); };
			}
		
		
		// setup topMenu animateion.
		topMenu.animInSpeed = 1;
		topMenu.animOutSpeed = 1;
		topMenu.animations[topMenu.animations.length] = FSMenu.animSlideDown;
		topMenu.switchDelay = 0;
		topMenu.hideDelay = 200;
		
		var menus = new Array();
			
			menus[menus.length]=topMenu;
			menus[menus.length]=knivesMenu;
			menus[menus.length]=accessMenu;
			menus[menus.length]=encyMenu;
			menus[menus.length]=relatedMenu;
			menus[menus.length]=aboutMenu;
				
		for(var i=0;i<menus.length;i++)
			{
			if(menus[i].myName != 'topMenu')
				{
					menus[i].animations[menus[i].animations.length] = FSMenu.animClipSide;
					menus[i].animInSpeed = 1;
					menus[i].animOutSpeed = 1;
				}
			}
			
			addEvent(topMenuElement,"mouseover",agr_switchmenu);
			addEvent(topMenuElement,"mouseout",agr_switchmenu);
			
			// because this doesn't get called until we're already loaded, we don't have to wait for an event..
			knivesMenu.activateMenu("knives_100",null);
			accessMenu.activateMenu("accessories_476",null);
			encyMenu.activateMenu("knife_ency",null);
			relatedMenu.activateMenu("related",null);
			aboutMenu.activateMenu("about",null);
		}
		
	// alloc fixed elements list - just in case.
	
	fixedElements = new Array();
	
	/* INIT THE CAROUSEL - if present */
	if(document.getElementById('carousel')) // if there's a carousel on this page, activate it.
	{
	carousel = new AG_Carousel('recommendedItems','carousel',6);
	if(carousel.active)
		{ carousel.activate(); }
	}
	else { carousel = new function() {active = false; };} // make sure there's something to test
		
	/* MODIFY THE LAYOUT OF THE PAGE - ADD FIXED ELEMENTS AND BUTTONS */
	pagetype = document.body.className;
	agr_rejigger();
	
	// bench('menuset','start');
	
		
	// it's kinda tacky to call this all the time if we already know what the answer is - but the 
	// check for fixed nav is in the disable_fixed function - so this stays here so it doesn't accidentally
	// get turned on by rejigger.
	// bench('menuset','end');
	
	addEvent(window,"resize",function () {agr_disable_fixed(false);});
	// addEvent(document.body,"click",function() {alert(event.srcElement.id);});
	
	agr_disable_fixed(true);
	// turn off the fixed nav if the lefter is too tall - this has to be here, because until you turn the fixed ON you won't actually know.
	if (pagetype == 'category' && (document.getElementById('lefter').offsetHeight > document.getElementById('body_area').offsetHeight))
		{
		agr_class_reset(fixedElements,'bottom','fixed');
		DEF_DISABLE_FIXED=true;
		}
	
	agr_setpopups();
	
	
	
	//console.log('fixed_init');

	// be sure to clear the events from the DOM for the carousel if we're using IE.
	// otherwise memory leaks and then.. bad mojo.
	if(document.attachEvent && !(window.opera))
	{
		if(carousel.active) { window.attachEvent('onunload',function(){ purge(carousel.baseDiv); }); }
		window.attachEvent('onbeforeunload',function() {
		// put something here to remove the last four remaining leaked references.
		});
		window.attachEvent('onunload',function(){
			if(aboutMenu) {aboutMenu.menus.about.lyr.ref = null;}
			if(accessMenu) {accessMenu.menus.accessories.lyr.ref = null;}
			if(encyMenu) {encyMenu.menus.knife_ency.lyr.ref = null; }
			if(relatedMenu) {relatedMenu.menus.related.lyr.ref = null; }
			});
	}
		
	// bench('init','end');
}


function getIEVersion() {
var ua = navigator.userAgent;
var MSIEOffset = ua.indexOf("MSIE ");
	if(MSIEOffset == -1) 
		{
		return DEF_NOT_IE;
		}
	else 
		{
	return parseFloat(ua.substring(MSIEOffset + 5, ua.indexOf(";",MSIEOffset)));
		}
}


//console.log('waiting for load');
/* GLOBAL VARIABLES */
function collapse_drop(a) {document.getElementById('drop_down_wrap').style.height = '1px';}
function expand_drop(a)   {document.getElementById('drop_down_wrap').style.height = '500px';}
var DEF_FSMENU_COMPAT_MODE = false;
var DEF_DISABLE_FIXED = DEF_DISABLE_FIXED || false;
var DEF_IE_VERSION; // basically - NOT IE.
var DEF_NOT_IE = 9999;
IE7_PNG_SUFFIX = 'trans';
// auto call is related to the population script - it needs a global so that it can be remembered
// for when we want to cancel the automatic population.
var autoCall = null; // canceling function - need a global so we can remove it when we want.
var topMenu = null;
var knivesMenu = null;
var accessMenu = null;
var encyMenu = null;
var relatedMenu = null;
var aboutMenu = null;
var carousel = null; // that's a global

/* DEFERRED EXECUTION OF INIT SCRIPT */
//if it's safari, wait for it to load before you rejigger the layout
// this she no work in safari 3. thankfully, if you know how many style sheets you have (and we do.
// then you can just check the length of the loaded stylesheetlist. better than nothing...
if (/WebKit/i.test(navigator.userAgent)) { // sniff sniff
    var _timer = setInterval(function() {
        if (/complete|loaded/.test(document.readyState)) {
        	if(document.styleSheets.length < 2) { return;} // not quite ready yet! 
            clearInterval(_timer);
            initpage(); // call the onload handler
        }
    }, 10);
	    }
else {
	if(document.addEventListener) {
		document.addEventListener("DOMContentLoaded",initpage,false);
	}
	else {
		window.onload = initpage; // defer should take care of this...
		}
}
