/**
 * FileName:plug-in.js
 * @author
 */
var c = 0;
$.fn.extend({
	menuOpener:function(obj){
		var aClass        = (obj.aClass)?obj.aClass:'active';
		var oClass        = (obj.oClass)?obj.aClass:'open';
		var style         = (obj.style)?obj.style:{'position':'absolute'};
		var autoClose     = (obj.autoClose)?obj.autoClose:false;
		var autoCloseTime = (obj.autoCloseTime)?obj.autoCloseTime:100;
		var handle        = (obj.handle)?obj.handle:'click';
		var speed         = (obj.speed)?obj.speed:1;
		var interval      = (obj.interval)?obj.interval:10;
		var $closeBtn     = (obj.closeBtn)?$(obj.closeBtn):false;
		var $openTrigger   = (obj.openTrigger)?$(obj.openTrigger):false;
		var $openElement  = false;
		var k = 0;
		var trgLength = this.length;

		var chPosition,chAutoClose,chCloseBtn,$div,$next,$this;
		chPosition  = 'static'

		/* set slide element */
		this.each(function(){
			$this = $(this);
			if($this.next().length){
				if($openTrigger && $this.get(0) == $openTrigger.get(0)){
					$div = $('<div>');
				}else{
					$div = $('<div>').css({
						'overflow':'hidden'
						,'height':0 + 'px'
					});
				}
				$div.css(style);
				$next = $this.nextAll();
				$next.wrapAll($div).css({
					'display':'block',
					'position':'static',
					'visibility':'visible'
				});
				this.data = {
					index:k,
					timer:0,
					bindCheck:false,
					chPosition:chPosition,
					auto:chAutoClose,
					chCloseBtn:chCloseBtn
				}
				if ($openTrigger && $this.get(0) == $openTrigger.get(0)) {
					$openElement = $this.next();
				}
				k++;
			}
		});
		/* set slide element */

		this.bind(handle,function(){
			var $tar = $(this).next();
			var $trg = $(this);
			if($tar.length){
				_event($tar,$trg)
				return false;
			}
		});
		this.focus(function(){
			this.blur();
		});
		function _event($tar,$trg){
			var h    = _getHeight($tar)
			var data = $trg.get(0).data;
			$tar.removeClass(oClass);
			$trg.addClass(aClass);
			$trg.parent().addClass(aClass);
			if(!$openElement){
				if(autoClose){
					_autoCloser([$tar,$trg]);
				}
				_bypassSlide($tar,h,$trg);
				$openElement = $tar;
			}else if($openElement && $tar.get(0) == $openElement.get(0) && handle == 'click'){
				_closer($openElement,$openElement.prev());
				$openElement = false;
			}else{
				_closer($openElement,$openElement.prev());
				if(autoClose){
					_autoCloser([$tar,$trg]);
				}
				_bypassSlide($tar,h,$trg);
				$openElement = $tar;
			}
			if(!data.bindCheck && $openElement){
				$openElement.find('> div > ul > li > a').menuOpener({
					speed:4,
					interval:1,
					style:{
						'position':data.chPosition,
						'width':$openElement.width() +'px',
						'left':(data.index == trgLength - 1)?$openElement.width() * -1 - 5 + 'px':$openElement.width() - 5 + 'px',
						'zIndex':20,
						'top':-5 + 'px'
						},
					autoClose:data.auto,
					closeBtn:data.chCloseBtn
				});
			}
			data.bindCheck = true;
			if($closeBtn){
				$closeBtn.click(function(){
					var tar;
					if($openElement){
						$tar = $openElement;
						_closer($tar,$tar.prev());
						$openElement = false;
						}else{
						return false;
					}
				});
			}
			return false;
		}
		function _getHeight($tar){
			var total = 0;
			var y     = 0;
			$tar.children().each(function(){
				if($(this).position().top == y){
					if(total < this.offsetHeight){
						total = this.offsetHeight;
					}
				}else{
					y = $(this).position().top;
					total += this.offsetHeight;
				}
				
			});
			return total;
		}
		function _autoCloser(ary) {
			var len = ary.length;
			var $ary;
			var t = ary[0].get(0).autoCloseTimer;
			for(var i = 0; i < len; i++){
				$ary = ary[i];
				$ary.unbind('mouseout');
				$ary.mouseout(function(){
					clearTimeout(t);
					t = setTimeout(function(){
						ary[0].removeClass(oClass);
						ary[0].css({'overflow':'hidden'});
						_bypassSlide(ary[0],0,ary[1]);
						if($openElement && $openElement.get(0) == ary[0].get(0)){
							$openElement = false;
						}
					},autoCloseTime);
				});
				$ary.mouseover(function(){
					clearTimeout(t);
				});
			}
		}
		function _closer($tar,$trg){
			$tar.removeClass(oClass);
			$tar.css({'overflow':'hidden'});
			_bypassSlide($tar,0,$trg);
		}
		function _bypassSlide($tar,h,$trg){
			clearInterval($trg.get(0).data.timer);
			$trg.get(0).data.timer = setInterval(function(){
				_slider($tar,h,$trg);
			},interval);
		}
		function _slider($tar,lastH,$trg){
			var type  = (lastH == 0)?-1:1;
			var strH  = $tar.height();
			var nextH = Math.ceil(Math.abs(lastH - strH) / speed);
			$tar.css({'height': (strH + nextH * type) +'px'});
			if(lastH !=0 && lastH - strH == 1){
				$tar.css({'height':'auto','overflow':'visible'});
				$tar.addClass(oClass);
				clearInterval($trg.get(0).data.timer);
			}
			else if(lastH == 0 && strH == 1){
				$trg.removeClass(aClass);
				$trg.parent().removeClass(aClass);
				clearInterval($trg.get(0).data.timer);
			}
		}
	},
	carousel:function(obj){

		var $trgPrev   = $(this).find(obj.prevBtn);
		var $trgNext   = $(this).find(obj.nextBtn);
		var $tar       = $(this).find(obj.target).wrap('<div></div>').parent().css({'marginLeft':0});
		var wid        = obj.width;
		var span       = obj.span;
		var interval   = (obj.interval)?obj.interval:1;
		var speed      = (obj.speed)?obj.speed:1;
		var max        = $tar.find('li').length;
		var timer      = 0;
		var counter    = max;
		var limt       = wid / span;

		if(limt < max){$trgNext.fadeIn(300);}

		$trgPrev.click(function(){
 			_goPrev();
		});
		$trgNext.click(function(){
			_goNext();
		});
		function _goNext(){
			_bypassSlide(-1);
			counter--;
			if(counter <= limt){
				$trgNext.hide();
				$trgPrev.show();
			}else{
				$trgPrev.show();
			}
			return false;
		}
		function _goPrev(){
			_bypassSlide(1);
			counter++;
			if(counter == max){
				$trgPrev.hide();
				$trgNext.show();
			}else{
				$trgNext.show();
			}
			return false;
		}
		function _bypassSlide(type){
			$trgNext.unbind('click');
			$trgPrev.unbind('click');
			var defMargin;
			clearInterval(timer);
			defMargin =  parseInt($tar.css('marginLeft'));
			timer = setInterval(function(){
				_slider($tar,defMargin +(type * span));
			},interval);
		}
		function _slider($tar,lastM){
			var strM  = parseInt($tar.css('marginLeft'));
			var nextM = Math.ceil((lastM - strM) / speed);
			$tar.css({'marginLeft': strM + nextM +'px'});
			if(nextM == 0){
				$tar.css({'marginLeft': lastM +'px'});
				clearInterval(timer);
				$trgPrev.click(function(){
 					_goPrev();
				});
				$trgNext.click(function(){
					_goNext();
				});
				return false;
			}
		}
	},
	itemGallery:function() {
		if(!itemArray){ return false; } //itemArray is global
		var len = itemArray.length;
		/* Object size root */
		var sizeObj = new Object();
		for (var i = 2; i < len; i++) {
			sizeObj[itemArray[i][1]] = {
				'jncode':itemArray[i][0]
				,'txt':itemArray[i][2]
				,'quantity':itemArray[i][3]
			}
		}
		if(itemArray[0]){
			this.find('.request .cart,.request .contact,.orders').hide()
			this.find('.ask').show();
			this.find('.request .share').css( 'margin-top', '-2px' );
		}else{
			this.find('.request .cart,.request .contact,.orders').show()
			this.find('.ask').hide();
			this.find('.request .share').css( 'margin-top', '22px' );
		}
		/* set className */
		var dClass         = 'disable';
		var aClass         = 'active';

		/* target elements */
		var $this          = this;
		var progressed     = [itemArray[1],'','','',''];
		var $sizeElem      = this.find('dl.size dd')
		var $dataElem      = this.find('dl.data dd');
		var $sizeNameElem  = this.find('dl.size .name');
		var $quantityElem  = this.find('.orders .quantity dd select');
		var $disabled      = this.find('.request .disabled');

		/* **** Size *** */
		_setSizeObj($sizeElem,sizeObj,true);
		function _setSizeObj($tar, obj, flg){
			var $ul = $('<UL>');
			$tar.html($ul);
			var check = false;
			var $first = false;
			for (var a in obj) {
				var s = obj[a];
				var $a = $('<a>').attr('href','#').html(a);
				if (!$first) {
					$first = $a;
				}
				$a.get(0).data = a;
				$a.click(function(){
					progressed[1] = obj[this.data]['jncode'];
					progressed[2] = this.data;
					progressed[3] = obj[this.data]['quantity'];
					var sizeName = this.data;
					if(!obj[this.data]['quantity']){
						_setElem([
							{$tar:$sizeNameElem,elem:$('<span>'+sizeName+'<em class="out">SOLD OUT</em></span>')},
							{$tar:$dataElem,elem:obj[this.data]['txt']}
						]);
					}else{
						_setElem([
							{$tar:$sizeNameElem,elem:this.data},
							{$tar:$dataElem,elem:obj[this.data]['txt']}
						]);
					}
					_setDisable();
					_setActive($ul,progressed[2]);
					_setQuantity();
					return false;
				});
				$a.mouseover(function(){
					var dataTxt  = obj[this.data]['txt'];
					var sizeName = this.data;
					if(!obj[this.data]['quantity']){
						_setElem([
							{$tar:$sizeNameElem,elem:$('<span>'+sizeName+'<em class="out">SOLD OUT</em></span>')},
							{$tar:$dataElem,elem:dataTxt}
						]);
					}else{
						_setElem([
							{$tar:$sizeNameElem,elem:sizeName},
							{$tar:$dataElem,elem:dataTxt}
						]);
					}
				});
				$a.mouseout(function(){
					var dataTxt  = (progressed[2])?obj[progressed[2]]['txt']:'&nbsp;';
					var sizeName = (progressed[2])?progressed[2]:'&nbsp;';
					if(!obj[sizeName]['quantity']){
						_setElem([
							{$tar:$sizeNameElem,elem:$('<span>'+sizeName+'<em class="out">SOLD OUT</em></span>')},
							{$tar:$dataElem,elem:dataTxt}
						]);
					}else{
						_setElem([
							{$tar:$sizeNameElem,elem:sizeName},
							{$tar:$dataElem,elem:dataTxt}
						]);
					}
				});
				var li = $('<li>').appendTo($ul).append($a);
				if(!s['quantity']){
					$a.addClass(dClass);
				}
				$a.focus(function(){
					this.blur();
				});
				if(s['quantity'] && !check ){
					$a.trigger('click');
					check = true;
				}
				_setDisable();
			}
			if(!check){
				$first.trigger('click');
			}
		}
		function _setElem(ary){
			var len = ary.length;
			for(var i = 0; i < len; i++){
				ary[i].$tar.html(ary[i].elem);
			}
		}
		function _setActive(tar,index){
			tar.find('li').removeClass(aClass);
			tar.find('li').each(function(){
				if($(this).find('a').get(0).data == index){
					$(this).addClass(aClass);
				};
			});
		}
		function _setQuantity(){
			$quantityElem.unbind('change');
			if(!progressed[3]){
				_setValue();
				return false
			}
			var $tar = $quantityElem;
			var q = progressed[3];
			progressed[3] = 1;
			_setValue();
			if(q){
				$tar.html('');
			}
			var opt = $('<option>').appendTo($tar).html('1');
			for(var i = 2; i <= q; i++){
				var opt = $('<option>').appendTo($tar).html(i);
			}
			$tar.change(function(){
				var n = $(this).val();
				progressed[3] = n;
				_setValue();
				return false;
			});
		}
		function _setDisable(){
			if(progressed[3]){
				$disabled.hide();
				$quantityElem.get(0).disabled = false;
			}else{
				if (itemArray[0]) {
					$disabled.hide();
				}else{
					$disabled.show();
				}
				$quantityElem.get(0).disabled = true;
			}
		}
		function _setValue(){
			$this.find('.request input:eq(0)').val(
				progressed[1]
			);
			$this.find('.request input:eq(1)').val(
				progressed[0] + ',' + progressed[1] + ',' + progressed[3]
			);
		}
	},
	setDefaultValue:function(obj){
		this.focus(function(){
			if(this.value == this.defaultValue){
				this.value = "";
				this.style.color = obj.foc;
			}
		})
		this.blur(function(){
			if(!this.value){
				this.value = this.defaultValue;
				this.style.color = obj.def;
			}else{
				this.style.color = obj.foc;
			}
		})
	},
	jsSubmit:function(){
		$(this).click(function(){
//			if($(this).closest('form').find('input[type="hidden"]').length){alert($(this).closest('form').find('input[type="hidden"]').val());return false}
			$(this).closest('form').get(0).submit();
		})
	},
	equalHeightSetter:function(obj){
		var $elems = (obj.elem)?this.find(obj.elem):this.find('div');
		var col = (obj.col)?obj.col:2;
		var len = $elems.length;
		var defBodyHeight = $('body').height();
		var itvl = setInterval(function(){_heightWatcher()},500);
		var h = 0;
		var thisHeight = this.height();
		_do();
		function _heightWatcher(){
			if(defBodyHeight != $('body').height()){
				_do();
				defBodyHeight = $('body').height();
			}
		}
		function _do(){
			$elems.each(function(index){
				var $this = $(this);
				$this.css('height','auto');
				if(index % col < 1 ){
					h = $this.height();
				}else{
					var len = index % col;
					if(h < $this.height()){
						h = $this.height();
					}
					for(var i = 1; i <= len; i++){
						$elems.eq(index-i).height(h);
					}
					$this.height(h);
				}
			});
		}
	},
	itemViewer:function(obj){
		if(!viewerObject){return false;}
		var fadeSpeed = (obj.fadeSpeed)?obj.fadeSpeed:100;
		var $ul = $('<ul>');
		var $p = $('<p>');
		var $span = $('<span>').hide();
		var alp = ['A','B','C','D','E','F'];
		var loader = new Image();
		loader.src = "/g_images/icn-loader-01.gif";
		$loader = $('<img src="'+loader.src+'" alt="" class="loader">');
		var imgStrArry = viewerObject['images'].split(';');
		var len = imgStrArry.length;
		for(var i = 0; i<len; i++){
			var path = viewerObject['path'] + imgStrArry[i];
			var thmImg = new Image();
			thmImg.src = path + '-s.jpg';
			var $thmImg =$('<img src="'+thmImg.src+'">');
			var $a = $('<a href="#"></a>').append($thmImg);
			var $li = $('<li>').appendTo($ul).append($a);
			$a.get(0).data = path;
			$li.addClass('li-'+alp[i]);
			$a.click(function(){
				var url = this.data + '-m.jpg';
				$p.html($loader);
				$loader.fadeIn(400);
				var imgPreloader = new Image();
				var $img =$('<img src="'+url+'" class="item">').hide();
				imgPreloader.onload = function(){
					imgPreloader.onload = null;
					$loader.hide();
					$p.html($img);
					$img.fadeIn(fadeSpeed);
				}
				imgPreloader.src = url;
				return false;
			});
		}
		this.append($p).append($ul);
		this.find('a:eq(0)').trigger('click');
	}
});
