var isDOM = document.getElementById;
function getParentNodeByType(obj, type) {
		var pn = obj.parentNode;
		if (pn.nodeName == type || pn.nodeName == type.toUpperCase()) {
				return pn;
			}
				
		return getParentNodeByType(pn, type);
	}

function getParentByClass(obj, classn) {
		if (!obj)
			return false;
		
		pn = obj.parentNode;
		if (pn && pn.className == classn) {
				return pn;
			}
				
		return getParentByClass(pn, classn);
	}
function getParentByAttr(obj, attr, attrval) {
		pn = obj.parentNode;
		if (pn.getAttribute(attr) == attrval) {
				return pn;
			}
				
		return getParentNodeByType(pn, type);
		
	
	}
function createElem(t, attrs) {
			
			var elem = document.createElement(t);			
			for (a in attrs) {
				elem.setAttribute(a, attrs[a]);
			}
			return elem;
	}
function removeElem(evt) {
		return evt.parentNode.removeChild(evt);
	}
function createTxt(t) {
		return document.createTextNode(t);	
	}
	
function append(el, ael) {
		
		return el.appendChild(ael);
	
	}
function getTarget(e) {
		
	return E.target(e);
	
	}

function getByTag(parent, tag) {
	return D.Get.tag(parent, tag);
	}

function getByType(type, par) {
	return D.Get.tag(par, tag);	
}

function getByClass(t, clas, par) {
		if(!par)
			par = document;
			
		tags = getByTag(par, t);
		tl = tags.length;
		ta = new Array(0);
		
		for(i=0; i<tl; i++) {
				//__DEBUG('getByClass', tags[i]);
				if (tags[i].className == clas)
					ta.push(tags[i]);
			}
		
		return ta;
	}

function getByAttr(attr, val, parent, tag) {
		return D.Get.attr(attr, val, parent, tag);
	}


function getByName(name) {
		return D.Get.name(name);
	}


function createSelectField(n, opts) {
		
		s = createElem('select', {'name' : n});
		
		for (i=0; i<opts.length; i++) {
				o = createElem('option', {'value' : opts[i]});
				append(o, createTxt(opts[i]));
				append(s, o);
			}
		return s;
	
	}
function getById(id) {
		return D.Get.id(id);
	}
function getByID(id) {
		return D.Get.id(id);
	}
//event attacher
function attachEvent(obj, func, action) {

	if (!(obj && func))
		return;
	if (!action)
		action = 'onclick';
		
	obj[action] = func;
	
	return;
}
var D = {
	append: function(el, ael) {
		return DOM.append(el, ael);
	},
	remove: function (evt) {
		return evt.parentNode.removeChild(evt);
	},
	Make: {
		Select: function(n, opts) {
			s = createElem('select', {'name' : n});
			
			if ((typeof opts) != 'object') {
				for (i=0; i<opts.length; i++) {
						o = createElem('option', {'value' : opts[i]});
						D.append(o, createTxt(opts[i]));
						D.append(s, o);
					}
			} else {
				for (opt in opts) {
						o = createElem('option', {'value' : opt});
						D.append(o, createTxt(opts[opt]));
						D.append(s, o);

				}
			}

			return s;
		},
		txt: function() {
			return document.createTextNode(t);
		}
	},
	Get: {
		id: function(id) {
			return document.getElementById(id);
			
		},
		attr: function(attr, val, parent, tag) {
			par = parent ? parent : document;
			t = tag ? tag : '*';

			tgs = D.Get.tag(par, t);
			tgsl = tgs.length;
			ta = new Array(0);

			for(jk=0; jk<tgsl; jk++) {
				if (tgs[jk].getAttribute(attr) == val) {
						ta.push(tgs[jk]);
					}
			}

			if (ta.length == 0)
				return false;

			return ta;
			
		},
		name: function(name) {
			elems = D.Get.attr('name', name, '', '');

			if (elems)
				if (elems.length == 1)
					return elems[0];

			return elems;	
		},
		tag: function(parent, tag) {
			if (!parent)
				parent = document;

				return parent.getElementsByTagName(tag);
			
		},
		_class: function(t, clas, par) {
				if(!par)
					par = document;
				
				tags = D.Get.tag(par, t);
				tl = tags.length;
				ta = new Array(0);

				for(i=0; i<tl; i++) {
						//__DEBUG('getByClass', tags[i]);
						if (tags[i].className == clas)
							ta.push(tags[i]);
					}

				return ta;
		},
		Parent: {
			
			attr: function(obj, attr, attrval) {
					pn = obj.parentNode;
					if (pn.getAttribute(attr) == attrval) {
							return pn;
						}

					return D.Get.Parent.attr(pn, type);
			},
			type: function(obj, type) {
					pn = obj.parentNode;
					if (pn.nodeName == type || pn.nodeName == type.toUpperCase()) {
							return pn;
						}

					return D.Get.Parent.type(pn, type);	
			},
			tag: function(obj, type) {
				return D.Get.Parent.type(obj, type);
			},
			_class: function(obj, classn) {
					if (!obj)
						return false;

					pn = obj.parentNode;
					if (pn && pn.className == classn) {
							return pn;
						}

					return D.Get.Parent._class(pn, classn);
			}
			
			
		}
	},	
	highLight: function(obj) {

		hlobj = obj;
		hlnum = 0

		hlintrvl = setInterval("this.__highlight()",30);

	},
	__highlight: function()   {
	
		color_array = ["#FFD100","#FFFFFF","#FFD931","#FEDB43","#FFE260","#FFE675","#FFE987","#FEEDA2","#FFF3BD","#FFF9DD","#FFFFFF",""]

		hlobj.style.backgroundColor = color_array[hlnum];
		hlnum += 1;

		if (hlnum > color_array.length) {
				clearInterval(hlintrvl);
				hlnum = 0;
				hlobj = '';
			}
	}
}

var DOM = {
	Select: function(n, opts) {
		var s = this.elem('select', {'name' : n});
		
		for (opt in opts) {
				o = D.Create.elem('option', {'value' : opts[opt]});
				D.append(o, D.Create.txt(opt));
				D.append(s, o);
			
			}
		return s;
	},
	textField: function(name, value) {
		return this.elem("input", {'name': name, 'id': name, 'value': value, 'type': 'text'});
	},
	New: {
		elem: function(name, attrs) {
			try {
				e = document.createElement(name);
				for (a in attrs) {
					if (a == 'class') 
					 	e.className = attrs[a] 
					else if (a == 'name')
						e.setAttribute('name', attrs[a]);
					else 
						e[a] = attrs[a];
					}
				return e;
			} catch (e) {return false}
		},
		text: function(text) {
			try {
				return document.createTextNode(text);
			} catch(e) { return false }
		},
		div: function(attrs) {
			return DOM.New.elem('div', attrs);
		}
	},	
	append: function(par, nodes) {	
		try {	
			nodes.each(function(node) {
				par.appendChild(node);	
			})
			return par;
		} catch(e) {
			try {
				return par.appendChild(nodes);
			} catch(e) {
				return false;
			}
		}
	},
	prepend: function(parent, newelem, oldelem) {
		try {
			return parent.insertBefore(newelem, parent.firstChild);
		} catch (e) {}
	},
	Insert: {
		before: function() {},
		after: function() {}
	},
	remove: function(o) {
		return o.parentNode.removeChild(o);
	}
}




var F = {
	serialize: function(form) {
		fields = form.elements;
		sl = fields.length;
		serstr = '';
		
		for(i=0; i<sl; i++) {
			val = fields[i].value;
			
			if (fields[i].type == 'checkbox' && !fields[i].checked)
				val = '';
			
			if (val != '')
				serstr += '&'+fields[i].name +'=' + encodeURI(val);
		}

		return serstr;
		
	}
	
}

function serializeForm(form) {
		return F.serialize(form);
	}

function getReq() {
	return A.__req();
}


var A = {
	__req: function() {
		var req = false;
	    if(window.XMLHttpRequest) {
	        try {
	              req = new XMLHttpRequest();
	        } catch(e) {
	             req = false;
	        }
	    } else if(window.ActiveXObject) {
			try {
					req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
					try {
						req = new ActiveXObject("Microsoft.XMLHTTP");
					} catch(e) {
						req = false;
					}
				}
	    }

		return req;
	},
	call: function(url, q, cb, attrs, response_type) {
		var ref = location.href;
		var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
		if (!response_type)
			response_type = 'text';
			
		creq = A.__req();
	
		if(!creq) {
			var alertbox = getById('alert_') || getById('alert');
			if (!alertbox)
				alert('Could not establish connection. Please use a newer version of the browser');
			else
				alertbox.innerHTML = 'Could not establish connection. Please use a newer version of the browser';

			return false;
		}
		
	
		creq.onreadystatechange = function () {
				this.call = cb;

				if (creq.readyState == 4) {
					__DEBUG('processingChange', creq.status);
					
					if (creq.status == 200) {
						if (creq.responseText.indexOf('html') >= 0) {
							location.href='/store/account/login';
						} else {
							__DEBUG('response', creq.responseText);
							
							r_type = creq.getResponseHeader('RESPONSE_TYPE');				
							
							if (!r_type)
								r_type = 'TEXT';
							
							if (r_type == 'JSON')
								r = JSON.eval(creq.responseText);
							else if(r_type == 'XML')
								r = creq.responseXML;
							else
								r = creq.responseText;
						
							 this.call(r, attrs);
							 creq.onreadystatechange = new function() {};
						}
					} else {
						//alert("There was a problem retrieving the Data. " + creq.status);
					}
				}
			};

		creq.open("post", url, true);
		creq.setRequestHeader("Content-Type", contentType);
		creq.setRequestHeader("REFERER", ref);
		creq.setRequestHeader("REQUEST_TYPE", 'XMLHTTP');
		creq.setRequestHeader("RESPONSE_TYPE", response_type);
		creq.send(q);

		__DEBUG('sending', q);
		
	}	
	
}


function AjaxReq(url, q, cb, attrs, response_type) {
	A.call(url, q, cb, attrs, response_type);
}

var E = {
	add: function(obj, evt, func) {
		if (!obj)
			return;
		
		if (document.addEventListener) {
			obj.addEventListener(evt, func, false);
		} else if(document.attachEvent) {
			obj.attachEvent('on'+evt,func);
		}
	},
	remove: function(obj, evt, func) {
		__DEBUG("removeHandler()",obj);

		obj.removeEventListener(evt, func, false);
	},
	target: function(e) {
		e = e || window.event;
		return e.target || e.srcElement;
	},
	prevent: function(e) {
		if (e.stopPropagation) {
   			 e.stopPropagation();
  		} else if(e.cancelBubble) {
    		e.cancelBubble = true;
		} 
		
		if (e.preventDefault) {
			e.preventDefault();
		} else {
			e.returnValue = false;
			return false; 
		}
		
	}
}


function attachHandler(obj, evt, func) {
		E.add(obj, evt, func);
	
	}	
function removeHandler(obj, evt, func) {
		E.remove(obj, evt, func);
	}
	
function _pDe(e) {
		return E.prevent(e);
	}
	
var JSON = {
	eval: function(str) {
		var result;
		return eval('result = ' + str+';');
	}

};	
var Indicator = {
	current: [],
	currentClassNames: [],
	defaultClass: 'loading',
	add: function(obj, classn) {
		if (!classn)
			classn = this.defaultClass;
			
		obj.className += ' ' + classn;
		if (obj) {
			this.current.push(obj);
			this.currentClassNames.push(classn);
		}
		
	},
	clear: function(obj, classn) {
		if (!classn)
			classn = this.defaultClass;
			
		obj.className = obj.className.replace(classn, '');
	},
	clearAll: function(classn) {
		if (!classn)
			classn = this.defaultClass;

		cl = this.current.length;
		
		for (i=0;i<cl;i++) {
			this.current[i].className = this.current[i].className.replace(this.currentClassNames[i], '');
		}
		this.current = [];
		this.currentClassNames = [];
	}
	
};
//these are here for backward compatibility
function showLoading(obj, classn) {
	Indicator.add(obj, classn);
}

function clearLoading(obj, classn) {
	Indicator.clear(obj, classn);
}
function clearAllLoading(obj, classn) {
	Indicator.clearAll(classn);
}	
	

PopUp = {
	open: function(a, w, h) {
		if (!a)
			return;
		
		if (!w)
			w = 450;
		
		if (!h)
			h = 550;
		
		href=a.href;
		nwin = window.open(href, 'nwin', "width=" + w +",height="+h+",scrollbars=yes,status=yes,resizable=yes,dependent=yes,alwaysRaised=yes,location=no,menubar=no,toolbar=no");
		nwin.focus();
		return false;
		
	},
	close: function(e) {
		window.close();
		
	}
	
	
	
}














	