/* vim: set tabstop=2 shiftwidth=2 foldmethod=marker: */
/**
 * @author      Shogo Kawase <shogo@virtuawave.jp>
 * @copyright   2007-2008 VirtuaWave Inc.
 * @version     CVS: $Id: public.js,v 1.2.4.6 2008/08/27 16:03:27 shogo Exp $
 */
vw.public = {
	/** プロパティ **/
	url: null,
	/** 初期化 **/
	init: function(url, path)
	{
		this.url     = url;
		this.path    = path;
		window.loadingImage = path + 'img/loading.gif';
		window.closeButton  = path + 'img/close.gif';
		window.initLightbox();
		this.swapImage.init();
		vw.lbCtrl.init();
	},
	/** カートに追加 **/
	addCart: function(id)
	{
		var callback = this._addCart.bind(this);
		if (id) {
			var params = {id:id, qty:1};
		} else {
			var params = Form.serialize('itemForm');
		}
		new Ajax.Request(
			this.url + '/cart/addj/', {method:'post', parameters:params, onComplete:callback}
		);
		return false;
	},
	_addCart: function(http, json)
	{
		var callback = function(){
			new Effect.Highlight('cart', {duration: 2.0, startcolor: '#666633', endcolor: '#000000'});
		};
		var url = this.url + '/cart/summary/_=' + (new Date()).getTime();
		if (json.result) {
			vw.notify.add('カートに商品を追加しました。');
			new Ajax.Updater('cart', url, {method:'post',onComplete:callback});
		} else {
			vw.notify.add(decodeURIComponent(json.msg));
		}
	},
	/** お気に入りに追加 **/
	addFavorite: function(id)
	{
		var callback = this._addFavorite.bind(this);
		new Ajax.Request(
			this.url + '/item_favorite/addj/',
			{method:'post', parameters:{id:id}, onComplete:callback}
		);
		return false;
	},
	_addFavorite: function(http, json)
	{
		var callback = function(){
			new Effect.Highlight('favorite', {duration: 2.0, startcolor: '#666633', endcolor: '#000000'});
			vw.switchList.init();
		};
		var url = this.url + '/module_favorite/_=' + (new Date()).getTime();
		if (json.result) {
			vw.notify.add('お気に入りに商品を追加しました。');
			new Ajax.Updater('favorite', url, {method:'post',onComplete:callback});
		} else {
			vw.notify.add(decodeURIComponent(json.msg));
		}
	},
	/** お気に入りから削除 **/
	removeFavorite: function(id)
	{
		if (!confirm('削除してもよろしいですか？')) return false;
		var callback = this._removeFavorite.bind(this);
		new Ajax.Request(
			this.url + '/item_favorite/removej/',
			{method:'post', parameters:{id:id}, onComplete:callback}
		);
		return false;
	},
	_removeFavorite: function(http, json)
	{
		vw.notify.add(json.result ? 'お気に入りから商品を削除しました。' : 'お気に入りの削除に失敗しました。');
	}
};


/** 通知領域処理 **/
vw.notify = {
	active: false,
	// 表示処理
	add: function(msg)
	{
		if (this.active) {
			setTimeout(function(){ vw.notify.add(msg); }, 500);
		} else {
			// 生成
			var div  = $(document.createElement('div'));
			var body = vw.body();
			div.className = 'notify';
			div.update(msg);
			div.setStyle({top:'0px', left:'0px', opacity:0.01});
			document.getElementsByTagName('body')[0].appendChild(div);
			
			// 表示位置の決定
			div.setStyle({
				top:  Math.floor((body.clientHeight - div.offsetHeight) / 2) + body.scrollTop  + 'px',
				left: Math.floor((body.clientWidth  - div.offsetWidth)  / 2) + body.scrollLeft + 'px'
			});
			
			// 表示
			this.active = true;
			new Effect.Appear(div, {duration:0.5, from:0.01, to:0.90});
			
			// 隠す
			var callback = function(){
				div.parentNode.removeChild(div);
				vw.notify.active = false;
			};
			setTimeout(function(){ new Effect.Fade(div, {duration:1.0, afterFinishInternal:callback}); }, 1000);
		}
	}
};


/** 画像切替処理 **/
vw.public.swapImage = {
	// プロパティ
	container: null,
	
	// 初期化
	init: function vw_swapImage_init()
	{
		var x = this;
		x.container = $('swapImageContainer');
		if (x.container) {
			document.getElementsByClassName('swapImageItem').each(function(e){
				e.observe('mouseover', x.swap.bind(e), false);
			});
		}
	},
	swap: function vw_swapImage_swap()
	{
		var src    = this;
		var dst    = vw.public.swapImage.container;
		var img    = src.firstChild.cloneNode(true);
		dst.href   = src.href;
		dst.replaceChild(img, dst.firstChild);
	}
};


/** 郵便番号検索処理 **/
vw.public.postalSearch = {
	url: null,
	// 初期化
	init: function(url)
	{
		this.url = url;
		document.write('<input type="button" value="検索" id="postalSearchBtn" />');
		var btn = $('postalSearchBtn');
		btn.onclick = this.onClick;
	},
	// クリック時処理
	onClick: function()
	{
		var date = (new Date()).getTime();
		var url  = vw.public.postalSearch.url;
		var zip  = [
			encodeURIComponent($('main-zip1').value),
			encodeURIComponent($('main-zip2').value)
		].join('-');
		$('postalSearch').src = url + '/postal/zipcode=' + zip + '/' + date;
	}
};

/*+ LightBox風Q&A **/
vw.lbCtrl = {
	/** 初期化 */
	init: function()
	{
		vw.overlay = $('overlay2');
		vw.overlay.hide();
		
		// イベント設定
		var lbs    = document.getElementsByClassName('vwlb');
		if (lbs.length) {
			var i = 0;
			lbs.each(function(e){ Element.hide(e); });
			$A(document.getElementsByTagName('a')).each(function(a){
				if (a.rel == 'vwlb') {
					if (a.target) {
						a._vwlb = lbs[a.target];
					}
					Event.observe(a, 'click', vw.lbCtrl.open.bindAsEventListener(a), false);
				}
			});
		}
		this.onKeyDown = this._onKeyDown.bindAsEventListener(this);
	},
	/** アクセス開始 */
	open: function(event)
	{
		Event.stop(event);
		if (vw.lightbox) {
			vw.lbCtrl.close();
		}
		var size    = [600, 400];
		var b       = vw.body();
		var height  = $A([b.scrollHeight, b.clientHeight, window.innerHeight]).max();
		vw.lightbox = $(this._vwlb);
		
		// オーバーレイ処理
		vw.overlay.setStyle({height: height + 'px', display: 'block'});
		
		// レイヤー表示
		vw.lightbox.setStyle({
			left:      Math.floor((b.clientWidth - size[0]) / 2 + b.scrollLeft) + 'px',
			top:       Math.floor((b.clientHeight - size[1]) / 2 + b.scrollTop) + 'px',
			width:     size[0] + 'px',
			height:    size[1] + 'px',
			display:   'block',
			overflowY: 'auto'
		});
		
		// Escキーで閉じる
		Event.observe(document, 'keydown', vw.lbCtrl.onKeyDown, true);
		
		return null;
	},
	/** 隠す */
	close: function()
	{
		vw.lightbox.hide();
		vw.overlay.hide();
		Event.stopObserving(document, 'keydown', this.onKeyDown, true);
		return false;
	},
	/** キーボード入力処理 **/
	_onKeyDown: function(e)
	{
		var code = e.keyCode;
		if (code == 27) {
			vw.lbCtrl.close();
		}
	}
};

