var undefined = null;


// wether to use 'a' or 'an', based on rules of english
function a_or_an(text) {
	if (!text) return;
	return text.match(/^[aeiouAEIOU]/) != null ? 'an' : 'a';
}


function get_select_value(sel) {
	return sel.options[sel.selectedIndex].value;
}

function set_select_value(sel, value) {
	for (var i=0; i < sel.options.length; i++) {
		if (sel.options[i].value == value) {
			sel.selectedIndex = i;
//			sel.onchange(sel);
			if (sel.doupdate) { sel.doupdate(); }
		}
	}
}

var _dom_objs = new Array(); // storage for objects that represent items on the page

/*
function el(id) {
	if (typeof id == 'object' || id.tagName) { return id; }
	if (_dom_objs[id]) { return _dom_objs[id]; }
	if (document.all) {
		return document.all[id];
	} else {
		return document.getElementById(id);
	}
}
*/

// Given the id (or array of idas) of a page element, and an object containg style keys and values, sets those styles on the given object style names that start with an underscore are treated as object properties directly instead of properties of the style object
function styler(ids, styles) {
	if (typeof ids != 'object') { ids = [ids]; }
	for (var ididx in ids) {
		var id = ids[ididx];
		try {
			var elem = el(id);
			if (!id) {return;}
			for (var stylename in styles) {
				var stylevalue = styles[stylename];
				var paramname = stylename.match(/^_(.*)/);
				if (paramname) {
					elem[paramname[1]] = stylevalue;
				} 
				else {
					elem.style[stylename] = stylevalue;
				}
			}
		}
		catch(e) { }
	}
}

/*
Allows loops to be created using html extracted by dom methods
Loops over a given array, passing an action function a template node to populate with items from the each object in the array.

HTML example:
	<span id="holder"><span id="repeat"><a href="" id="link"></a></span></span>
Call example:
looper({
	array: [
		{url: 'http://www.aveda.com', name: 'Aveda'},
		{url: 'http://www.aveda.co.jp', name: 'Aveda Japan'},
	],
	holder_id: 'holder',
	repeat_id: 'repeat',
	action: function (node, item, index) {
		var link = node.getElementById('link');
		link.href = item.url;
		link.name = 'Link #'+i+' : '+item.name';
	}
});
*/
function looper(args) {
	var action = args.action;
	var array = args.array;
	var holder = args.holder || el(args.holder_id);
	var repeat = args.repeat || getNodeElementById(holder, args.repeat_id);
	var newnode;
	try { newnode = document.createDocumentFragment(); }
	catch(e) { newnode = document.createElement('span'); } // IE 5.0
//	var newnode = document.createDocumentFragment();
	for (var i=0; i<array.length; i++) {
		var item = array[i];
		var node = repeat.cloneNode(true);
		newnode.appendChild(node);
		action(node, item, i);
	}
	holder.removeChild(repeat);
	holder.appendChild(newnode);
}


// Support for calling getElementById on node objects
// Pass node object and id of child element to find
function getNodeElementById(node, id) {
	var children = node.childNodes;
	var result = null;
	for (var i=0; i < children.length; i++) {
		var child = children[i];
		if (!child.getAttribute) { continue; }
		var childid = child.getAttribute('id');
		if (childid == id) {
			return child;
		}
		else {
			result = getNodeElementById(child, id);
		}
		if (result) { return result; }
	}
	return result;
}
// Commented out because doesn't work in IE
//Node.prototype.getElementById = function(id) { return getNodeElementById(this, id); }

// Fills in the options of a select box.  Data is an array of object that have SELECT_NAME and SELECT_VALUE keys
function fill_select(id, data) { try{
	var dest = el(id);
	dest.options.length = 1;
	for (var i=0; i < data.length; i++) {
		var optionObj = new Option(
			data[i].LABEL,
			data[i].VALUE,
			false,
			false
		);
		dest.options[dest.options.length] = optionObj;	
	}
} catch(e) { } }

// Given an array of anonymous objects with the following keys, return a cart command
/*
	cart = {
		cart: 'cart' || 'saveforlater' || 'wishlist',
		action: 'add' || 'delete' || 'quantity' || 'move',
		items: [
			{ sku: skuid, value: quantity }
		]
	}
*/

function dopopup(url, args) {
	
	var defaults = {
		height: 600,
		width: 475,
		top: 10,
		left: 10,
		resizable: 'yes',
		scrollbars: 'yes',
		status: 'no',
		toolbar: 'no',
		menubar: 'no',
		name: 'pop'
	};
	args = mergeobjs(defaults, args);
	
	var specs =
		'height='+args.height+
		',width='+args.width+
		',top='+args.top+
		',left='+args.left+
		',resizable='+args.resizeable+
		',scrollbars='+args.scrollbars+
		',status='+args.status+
		',toolbar='+args.toolbar+
		',menubar='+args.menubar+
		',location='+url;
	//alert(f);
	window.open(url, args.name, specs);

}



// Copies paramters the first object into the second object
function mergeobjs(one, two) {
	for (var key in one) {
		if (two[key]) { continue; }
		two[key] = one[key];
	}
	return two;
}

// Fix for IE's broken PNG support
function ieAlphaFix(img) {
	try {
		var src = img.src;
		if (
			(src.indexOf('spacer.gif') >= 0) || 
			(src.indexOf('white.gif') >= 0)
		) { return; }
		img.runtimeStyle.filter =
			"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" 
			+ src + "',sizingMethod='scale')";
		img.onload = function() {};
		img.src = '/images/spacer.gif';
	} catch(e) { }
}

// Execute a function only after the image's src has been loaded
function whenimageloaded(args) {
	var src = args.src;
	var action = args.action;
	var img = new Image();
	img.src = src;
	if (img.complete) {
		action(img, src) ;
	}
	else {
		img.onload = function() { action(img, src); }
	}
}

// hide a form element from a submit by changing its name so the backend won't find it
function hideformelement(id, hide) {
	var elem = typeof id == 'object' ? id : el(id);
	if (!elem) return;
	var name = elem.name;
	if (hide) {
		elem.name = '_'+name;
	} else {
		name = name.replace(/^_+(.*)$/, '$1');
		elem.name = name;
	}
}


// returns true if the given element is visible to the user
// ( display != none and visibility != hidden the in the element or any parent )
function visible(id) {
	var elem = el(id);
	if (elem && typeof elem == 'object') {
		if (elem.style) {
			if (elem.style.display == 'none' || elem.style.visibility == 'hidden') {
				return false;
			}
		}
	} else {
		return true;
	}
	var parent = elem.parentNode;
	if (parent) {
		return visible(parent);
	} else {
		return true;
	}
}




// Creates all of the elements specified by the nested object in tree as children of parent
// Each element with a _name field is also stored as a property of the object all
function addeltree(parent, tree, all) {
	
	var tagName = tree.tagName;
	delete tree.tagName;
	var name = tree._name;
	delete tree._name;
	var child = tree._child || new Array();
	delete tree._child;
	if (!(child.pop)) { child = [child]; }
	
	var elem = addel(parent, tagName, tree);
	if (name) { all[name] = elem; }
	for (var i=0; i<child.length; i++) {
		var kid = child[i];
		addeltree(elem, kid, all);
	}
	return parent;
}

function addel(parent, tagname, attrs) {
	var elem = document.createElement(tagname);
	for (var attr in attrs) {
		var value = attrs[attr];
//		if (attr == 'className') { attr = 'class'; }
//		elem.setAttribute(attr, value);
		elem[attr] = value;
	}
	parent.appendChild(elem);
	return elem;
}




// Browser nuetral interface for managing event handlers
// args: name, event, elem, handler
var _eventhandlers = new Object();
function addeventhandler(args) {
	var name = args.name;
	if (_eventhandlers[name]) { removeeventhandler(name); }
	var eventtype = args.event;
	var elem = args.elem;
	var handler = addeventhandler_handler(args.handler);
	
	if (elem.addEventListener) {
		elem.addEventListener(eventtype, handler, false);
	}
	else {
		elem.attachEvent('on'+eventtype, handler);
	}
	
	_eventhandlers[name] = {
		elem: elem,
		event: eventtype,
		handler: handler
	}
}
function addeventhandler_handler(handler) { return function(e) {
	if (typeof e != 'object') { e = window.event; }
	
	// provide a normalized cross platform mini event object
	var ev;
	if (e.target) {
		ev = {
			target: e.target
		};
	} else {
		ev = {	
			target: e.srcElement
		};
	}
	ev.event = e;
	var result = handler(ev);
	
	if (result) {
		if (e.stopPropigation) { e.stopPropigation(); }
		else { e.cancelBubble = true; }
	}
	return result;
}}

function removeeventhandler(name) {
	var args = _eventhandlers[name];
	var elem = args.elem;
	var eventtype = args.event;
	var handler = args.handler;
	
	if (elem.removeEventListener) {
		elem.removeEventListener(eventtype, handler, false);
	}
	else {
		elem.detachEvent('on'+eventtype, handler);
	}
}


// Sets up rollovers on an image.
// Assumes the rollover states end in _on and _off
function rolloverer(img) {
	img = el(img);
	if (!img) return;
	var src = img.src;
	var parts = src.match(/^(.*?)_off\.(.*)$/);
	var base = parts[1];
	var type = parts[2];
	
	var onsrc = base+'_on.'+type;
	var offsrc = base+'_off.'+type;

	var loader = new Image();
	loader.src = onsrc;

/*	img.onmouseover = function() {
		this.src = onsrc;
	} */
	img.onmouseout = function() {
		this.src = offsrc;
	}

	addeventhandler({
		name: img.id+'_onmouseover',
		event: 'mouseover',
		elem: img,
		handler: function(e) {
			e.target.src = onsrc;
		}
	});
	addeventhandler({
		name: img.id+'_onmouseout',
		event: 'mouseout',
		elem: img,
		handler: function(e) {
			e.target.src = offsrc;
		}
	});

}


// given a base url and an object of paramters and values, builds a url with query string
function buildurl(base, params) {
	var url = base + '&';
	var qarray = new Array();
	for (key in params) {
		qarray.push(encodeURIComponents(key+'='+params[key]));
	}
	url += qarray.join('&');
}


/*
function setCookie(name, value, expires, path, domain, secure) {
    document.cookie = 
    	name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

function deleteCookie(name, path, domain) {
	document.cookie = name + "=" + 
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		"; expires=Thu, 01-Jan-70 00:00:01 GMT";
}

*/
