//-- test blockCall in [ie:win]!!!

/*----------------------------------------------------------
| For greatest compatability I am not using "aequus"
| So do everything by hand, you lazy bastard!!
+---------------------------------------------------------*/
isIE = (function(){
	var ua = navigator.userAgent.toLowerCase();
	return (ua.indexOf("opera") < 0 && ua.indexOf("msie") >= 0) ? true : false;
})();
isMac = (function(){
	var ua = navigator.userAgent.toLowerCase();
	return (ua.indexOf("mac") >= 0) ? true : false;
})();

itemlist = {
	/*----------------------------------------------------------
	| initialization
	+---------------------------------------------------------*/
	init: function(lang) {
var now = new Date();

		var startView = this.curView = "all";

		//-- collect items
		this.list = document.getElementById("item-list");
		this.items = getByClass("item","div",this.list);
		if (this.items.length < 1) return;

		//-- init items
		for (var i = 0; i < this.items.length; i++) {

			//-- init detail toggling
			var item = this.items[i];
			item.trgr = getByClass("trgr","table",item,true);
			item.trgr.me = item;
			item.trgr.onmouseover = this.over;
			item.trgr.onmouseout = this.out;
			item.trgr.onclick = this.toggle;

			//-- set no stock items
			if (!getByClass("ok","a",item,true)) {
				className.add(item,"nostock");
				var msg = "";
				if (getByClass("x","em",item,true)) msg += '<em class="msg_x">' + this.str.stock_x + '</em> ';
				if (getByClass("w","em",item,true)) msg += '<em class="msg_w">' + this.str.stock_w + '</em> ';
				if (msg) {
					var insert = getByClass("code","td",item,true);
					insert.innerHTML = msg + insert.innerHTML;
				}
			}
		}

		//-- collect navigation parts
		this.prts = {};
		var i = 0;
		while (true) { //-- for each nav
			var nav = document.getElementById("pgnav_" + i);
			if (!nav) break;
			var prts = this.prts;
			var p = getByClass(/nav:/,"",nav);
			for (var j = 0; j < p.length; j++) {
				var id = p[j].className.match(/nav:([^.]+).([^\s]+)/);
				if (!id) continue;
				if (!prts[id[1]]) prts[id[1]] = {}; //-- build type container
				if (!prts[id[1]][id[2]]) prts[id[1]][id[2]] = []; //-- build part container
				prts[id[1]][id[2]][i] = p[j];
			}
			i++;
		}

		//-- hide loading message
		blockApply(this.prts.msg.load,function(obj){ obj.style.display = "none"; });

		//-- set layout style
		this.toggleCompact();

		//-- collect/init views
		this.views = {};
		for (var k in this.prts.view) {
			if (k == "all" || k == "stk" || getByClass(k,"em",this.list,true)) {
				//-- show instock only if nostock exists
				if (k == "stk" && !getByClass("nostock","div",this.list,true)) continue;
				//-- set view buton visibility
				blockApply(this.prts.view[k],function(obj){ className.add(obj,"disp-i"); });
				//-- set item flags
				this.views[k] = [];
				for (var i = 0; i < this.items.length; i++) {
					var item = this.items[i];
					var f = true;
					switch(k) {
						case "all": break;
						case "stk": if (className.has(item,"nostock")) f = false; break;
						default: if (!getByClass(k,"em",item,true)) f = false;
					}
					this.views[k][i] = f;
				}
			}
		}


		//-- check query
		var q = parseQuery();
		if (q) {

			//-- set view
			if (q.view) {
				if (this.views[q.view]) startView = this.curView = q.view;
				else if (document.getElementById(q.view)) startView = q.view;
			}

			//-- show passed items (by code)
			if (q.show) for (var i = 0; i < q.show.length; i++) {
				for (var j = 0; j < this.items.length; j++) {
					if (q.show == "all" || q.show[i] == this.items[j].id) {
						className.add(this.items[j],"a");
						if (q.show != "all") break;
					}
				}
			}
			
		}

		//-- set starting view
		this.setView(startView);

		slidingTopBtn.init();

//alert(new Date - now);
	},

	/*----------------------------------------------------------
	| item info toggling
	+---------------------------------------------------------*/
	over: function() {
		if (this.opened) this.opened = false;
		else className.add(this,"o");
	},

	out: function() {
		className.remove(this,"o");
	},

	toggle: function() {
		className.toggle(this.me,"a");
		className.remove(this,"o");
		this.opened = true;
	},

	toggleAll: function(show) {
		blockApply(this.items,function(obj){ className.set(obj,"a",show) });
	},

	toggleCompact: function(set) {
		//-- load setting
		if (set == null) {
			if (document.cookie.indexOf("itemlist=") >= 0)
				set = (document.cookie.match(/lay:(\w)(;|$)/)[1] == "c");
			else set = className.has(this.list,"compact");
		}

		className.set(this.list,"compact",set);
		blockApply(this.prts.rad.cmpct,function(obj){ obj.checked = set; });

		//-- save setting
		var exp = new Date();
		exp.setFullYear(exp.getFullYear() + 1);
		document.cookie = "itemlist=lay:" + ((set) ? "c" : "n") + "; expires=" + exp.toGMTString() + "; domain=.babywearing.jp";

	},

	/*----------------------------------------------------------
	| internal navigation
	+---------------------------------------------------------*/
	setView: function(view) {

		if (this.views[view]) { //-- show by view type
			this.curView = view;
			for (var i = 0; i < this.items.length; i++)
				className.set(this.items[i],"disp-n",!this.views[view][i]);
		} else if (view.indexOf("-") >= 0) { //-- show by item code
			var item = document.getElementById(view);
			if (item) {
				blockApply(this.items,function(obj){ className.add(obj,"disp-n"); });
				className.remove(item,"disp-n");
				className.add(item,"a");
			} else view = "all";
		}

		//-- update code menu
		var v = (this.views[view]) ? view : this.curView;
		var selected = view;
		var opts = [];
		opts[0] = { text: this.prts.view[v][0].firstChild.innerHTML, value: v };
		for (var i = 0; i < this.items.length; i++) if (this.views[v][i])
			opts[opts.length] = { text: "#" + this.items[i].id, value: this.items[i].id };
		blockApply(this.prts.sel.code,function(sel){ rebuildSelect(sel,opts,selected); });

		//-- update item count
		var cnt = 0;
		for (var i = 0; i < this.items.length; i++) if (!className.has(this.items[i],"disp-n")) cnt++;
		blockApply(this.prts.dat.cnt,function(obj){ obj.innerHTML = cnt + "/" + itemlist.items.length; });

		//-- set view btn state
		if (view.indexOf("-") < 0) {
			var vprts = this.prts.view;
			for (var k in vprts) {
				for (var i = 0; i < vprts[k].length; i++) {
					if (vprts[k][i]) className.set(vprts[k][i],"a",(view == k));
				}
			}
		}

		slideTo();

	},

	/*----------------------------------------------------------
	| external navigation
	+---------------------------------------------------------*/
	gotoItem: function(item) {
		window.location.href = "./?item=" + item;
	},

	addItem: function(code) {
		$window.open("shop","/cgi-bin/shop/cart.cgi?code=" + code);
	},

	goHome: function(uri) {
		var domain = window.location.href.match(/\/+([^\/]+\/)/)[1];
		if (opener && opener.location.href.indexOf(domain) >= 0) window.close();
		else {
			var newuri = uri.match(/\/+[^\/]+(\/.*)/);
			window.location.href = (newuri) ? newuri[1] : uri;
		}
		return false;
	}

};

/*----------------------------------------------------------
| utilities
+---------------------------------------------------------*/

function parseQuery() {
	var q = location.href.match(/\?([^#]+)(#|$)/);
	if (q) {
		q = new Object(q[1]);
		var qq = q.split("&");
		for (var i = 0; i < qq.length; i++) {
			var v = qq[i].split("=");
			if (v[0] == "show") q[v[0]] = (v[1].indexOf("+") < 0) ? [v[1]] : v[1].split("+");
			else q[v[0]] = v[1];
		}
	}
	return q;
}

function blockApply(objs,handler) { //-- ADD: objScope flag if necessary
	for (var i = 0; i < objs.length; i++) handler(objs[i]);
}

$window = {
	types: {
		  shop : { size: [768, 600], feat: "scrollbars,resizable=1" },
		viewer : { size: [200, 200], feat: "scrollbars,resizable=1" }
	},
	open: function(id,link) {
		if (!link) link = "";
		var size = this.types[id].size;
		var feat = this.types[id].feat;
		var left = Math.round((screen.availWidth - size[0]) / 2);
		var top = Math.round((screen.availHeight - size[1]) / 2);
		feat += ",left=" + left + ",top=" + top + ",width=" + size[0] + ",height=" + size[1];
		window.open(link,"win_" + id,feat);
	}

}

function getByClass(re,tag,branch,maxMatches) {
//-- RETURNS: (maxMatches === true) ? single element : array of elements
	if (!re) re = /.*/;
	else if (typeof re == "string") re = new RegExp("\\b(" + re + ")\\b");
	if (!branch) branch = document;
	else if (typeof branch == "string") branch = document.getElementById(branch);
	if (!tag) tag = "*";
	var out = [];
	var tags = branch.getElementsByTagName(tag);
	for (var i = 0; i < tags.length; i++) {
		var t = tags[i];
		if (t.className.match(re)) {
			if (maxMatches === true) return t;
			else {
				out[out.length] = t;
				if (maxMatches && out.length + 1 > maxMatches) return out;
			}
		}
	}
	return (out.length > 0) ? out : (maxMatches === true) ? null : [];
}

/*----------------------------------------------------------
| Class Manager
+-----------------------------------------------------------
| In the future: Create new functions for the class manager:
| addIfHas, removeIfHas, toggleIfHas -> with a more robust testing facility
+---------------------------------------------------------*/
className = {
	add: function(obj,cls) {
		return this.set(obj,cls,true);
	},
	remove: function(obj,cls) {
		return this.set(obj,cls,false);
	},
	toggle: function(obj,cls) {
		return this.set(obj,cls,(this.has(obj,cls)) ? false : true,true);
	},
	replace: function(obj,removeCls,addCls,alwaysAdd) {
		var removed = this.set(obj,removeCls,false);
		if (removed || alwaysAdd) this.set(obj,addCls,true);
		return removed;
	},
	addIfHas: function(obj,testCls,ifCls,elseCls) {
		return this.set(obj,(this.has(obj,testCls)) ? ifCls : elseCls,true);
	},
	removeIfHas: function(obj,testCls,ifCls,elseCls) {
		return this.set(obj,(this.has(obj,testCls)) ? ifCls : elseCls,false);
	},
	toggleIfHas: function(obj,testCls,ifCls,elseCls) {
		return this.toggle(obj,(this.has(obj,testCls)) ? ifCls : elseCls);
	},
	has: function(obj,cls) {
		return (cls) ? ((obj.className.match(this.toRE(cls))) ? true : false) : false;
	},
	set: function(obj,cls,setit,verified) {
		if (!cls) return false;
		if ((setit || typeof setit == "undefined")) {
			if (verified || !this.has(obj,cls)) {
				obj.className += (obj.className) ? " " + cls : cls;
				return true;
			}
		} else if (verified || this.has(obj,cls)) {
			obj.className = obj.className.replace(this.toRE(cls),"");
			return true;
		}
		return false;
	},
	toRE: function(cls) {
		return (typeof cls == "object" && cls.exec) ? cls : new RegExp("\\s*(" + cls + ")\\b");
	}
}

//-- ADD: selected value to opts array!
function rebuildSelect(sel,opts,sIndex) {
	if (sIndex === true) { //-- get current value|text
		if (sel.selectedIndex < 1) sIndex = 0;
		else sIndex = (sel.value) ? sel.value : sel[sel.selectedIndex].text;
	}
	sel.length = 0; //-- reset menu
	for (var i = 0; i < opts.length; i++) {
		var o = document.createElement('option');
		if (opts[i].text) { //-- by object
			o.text = opts[i].text;
			o.value = (opts[i].value != null) ? opts[i].value.toString() : o.text;
		} else if (opts[i].join) { //-- by nested array
			o.text = opts[i][0];
			o.value = (opts[i][1]) ? opts[i][1] : o.text;
		} else { //-- text only
			o.text = opts[i];
			o.value = o.text;
		}
		o.selected = (sIndex && (sIndex == i || sIndex == o.value)) ? true : false;
		if (o.selected != null) { if (opts[i].selected) o.selected = true; }
		if (isIE) {
			if (!isMac) { sel.options.add(o,sel.length); } //-- add option [win:ie]
			else { sel.add(o,sel.length); } //-- add option [mac:ie]
		} else { sel.add(o,null); } //-- add option [other browsers]
	}
	return sel.length;
}

slidingTopBtn = {
	pad: { top: 86, bottom: 182 },

	init: function() {
		this.body = document[(!window.opera && document.compatMode && document.compatMode != "BackCompat") ? "documentElement" : "body"];
		this.obj = document.getElementById("gotoTOP");
		document.onmousemove = this.update;
		document.onscroll = this.update;
	},

	update: function(evt) {
		var me = slidingTopBtn;
		var obj = me.obj;
		var p = me.getMousePos(evt);
		if (typeof p.y != "number") return;

		//-- set position
		var newY = p.y - (obj.offsetHeight / 2);
		if (newY < me.pad.top) newY = me.pad.top;
		else if (newY > me.body.offsetHeight - me.pad.bottom) newY = me.body.offsetHeight - me.pad.bottom;
		obj.style.top = newY + "px";

		//-- set visibility
		var cs = (typeof window.pageYOffset != "undefined") ? window.pageYOffset : document.body.scrollTop;
		obj.style.display = (cs == 0) ? "none" : "block";

	},

	getMousePos: function(evt, relTo) {
		if (typeof evt != "undefined") var c = { x: evt.pageX, y: evt.pageY };
		else var c = { x: this.body.scrollLeft + event.clientX, y: this.body.scrollTop + event.clientY };
		return c;
	}
}


//---------- slider ----------[begin]

var slideTimer;
var sliding = false;

function slideTo(who) {
	var sPos = getPageOffset();
	var ePos = getPos(who);
	var steps = 6;
	sliding = true;
	ePos.y -= 4;
	goSlide(sPos.x, sPos.y, 0, ePos.y, steps);
}

function goSlide(curX, curY, endX, endY, steps) {
	var newX, newY;
	if (slideTimer) { clearTimeout(slideTimer); }
	if (!endX || endX < 0) { endX = 0 }
	if (!endY || endY < 0) { endY = 0 }
	if (!curX) { curX = getPageOffset().x }
	if (!curY) { curY = getPageOffset().y }
	if (!steps) { steps = 6 }
	curX += (endX - curX) / steps;
	curY += (endY - curY) / steps;
	if (curX < 0) { curX = 0 }
	if (curY < 0) { curY = 0 }
	newX = Math.round(curX);
	newY = Math.round(curY);
	window.scrollTo(newX, newY);
	if (newX != endX || newY != endY) {
		slideTimer = setTimeout("goSlide("+curX+","+curY+","+endX+","+endY+","+steps+")",15);
	} else {
		sliding = false;
	}
}
function getPageOffset() {
	var x, y;
	x = (document.body.scrollLeft) ? document.body.scrollLeft : ((window.pageXOffset) ? window.pageXOffset : 0 );
	y = (document.body.scrollTop) ? document.body.scrollTop : ((window.pageYOffset) ? window.pageYOffset : 0 );
	return { x:x, y:y };
}
function getPos(who) { //-- v1.0 [03.09.13]
	who = (who) ? document.getElementById(who) : document;
	var offX = who.offsetLeft;
	var offY = who.offsetTop;
	var tempMe = who;
	while (tempMe.offsetParent != null) {
		tempMe = tempMe.offsetParent;
		offX += tempMe.offsetLeft;
		offY += tempMe.offsetTop;
	}
	if (isIE && isMac) {
		var adjX = (document.body.marginwidth) ? parseInt(document.body.marginwidth) : 10;
		var adjY = (document.body.marginheight) ? parseInt(document.body.marginheight) : 15;
		offX += (window.bodyPad) ? adjX + bodyPad.l : adjX;
		offY += (window.bodyPad) ? adjY + bodyPad.t : adjY;
	}
	return { x:offX, y:offY };
}

//---------- slider ----------[end]

