/**
* $Id: xpressItem.js 37577 2011-01-05 15:10:50Z rjohnson $
* @author Eber Herrera 
*/

function GSI_Widget_ExpressItem(){
	this.name = 'expressitem';
	this.height = 445;
	this.width = 800;
	this.loadOrder = 9;
	
	var loadSteps = 1;
	
	this.getLoadSteps = function(){
		return loadSteps;
	}
	
	var zoom;
	
	var collection = GSI.se;
	
	var _mthis = this;
	
	var load = function(){
		var tRes = true;
		try{
			if (typeof GSI=="undefined") return false;
			if ($('#express-shop').length !=1) {
				GSI.setError('Widget: '+_this.name+' -> template missing','WARNING');
				tRes = false;
				}
			
			if (!GSI.functions.isset(tb_remove)) {
				GSI.setError('Widget: '+_this.name+' -> jQuery plugin: thickbox missing','WARNING');
				tRes = false;
				} 
			return tRes;
			} catch(e){
			return false;
			}
		return true;
	};
	
	this.setCollection = function(cn){
		collection = cn;
	};
	
	this.getCollection = function(){
		return collection;
	};
	
	this.show = function(id){
		_mthis.loader(true);
		tb_show('', '#TB_inline?height='+_mthis.height+'&amp;width='+_mthis.width+'&amp;inlineId=express-shop',false);
		if (id) {
			if (!GSI.getItem(id)){
				try{
					collection.insert(id);
					}
				catch(e){
					_mthis.setError('The collection does not allow insert() @ xpressItem', 'WARNING');
					}
			}
			activateItem(id);
		}
	};
	
	this.hide = function(){
		tb_remove();
	};
	
	this.addToBasket = function(callback){
		if (minibasket = GSI.widgets.getWidget('minibasket')) {
			minibasket.addToBasket(callback);
			return true;
			}
		try{
			_mthis.setError('Trying external addToBasket function', 'INFO');
			addToBasket();
			return true;
		} catch(e) {}
		
		_mthis.setError('addToBasket not executed!', 'ERROR');
		return false;
	};
	
	this.loader = function(on){
		if (on){
			$('#express-shop-content').hide();
			$('#express-shop-loader').html('<img src="'+GSI_APP_IMG_PATH+'shared/loader_big.gif">').show();
			$('#express-shop-loader img').css("position", "absolute").css("top", $("#TB_ajaxContent").height()/2 - $('#express-shop-loader img').height()/2).css("left", $("#TB_ajaxContent").width()/2 - $('#express-shop-loader img').width()/2);
		} else {
			$('#express-shop-content').show();
			$('#express-shop-loader').hide();
		}
	};
	
	var activateItem = function(id, callback){
		if (!GSI.functions.isset(callback)) callback = function(){};
		
		var retrieveItemCallback = function(){
			var endAddRvpFb = function(){
				var tRVPBox  = GSI.widgets.getWidget('rvpbox');
				if (tRVPBox) tRVPBox.refresh();	
			};
			
			$('#express-shop-dyn').empty();
			draw();
			setTimeout(function(){_mthis.loader(false);}, 500);
			GSI.rvp.add(GSI.activeItem, GSI.activeItem.filters, endAddRvpFb);
			callback();
		};
		_mthis.loader(true);
		if (GSI.setActiveItem(id)){
			if(!GSI.activeItem.loaded) {
				GSI.activeItem.retrieve(retrieveItemCallback);
			} else {
				GSI.activeItem.resetFilters();
				GSI.activeItem.quantity = 1;
				retrieveItemCallback();
			}
		}
		else {
			_mthis.hide();
			_mthis.setError('ERROR setting active the ITEM '+id, 'ERROR');
			}
		
	};
	
	var draw = function(){ 
		var id = GSI.activeItem.getData('id');
		//pic
			var imgZoom = GSI.activeItem.getImage('zoom');
			if (!imgZoom) {
				zoom.deactivate(); 
				$("#express-activate-zoom").hide();
			}
			else $("#express-activate-zoom").show(); //zoom.activate();
			var imBig = GSI.activeItem.getImage('medium');
			var imSml = GSI.activeItem.getImage('small');
			//this line has been removed as was causing problems
			//$(".item-box-image img",".item-box[id=sku_"+id+"]").attr('src', imSml);
			$(".express-shop-image-main", "#express-shop-image").attr("src", imBig);
			$(".jqimage", "#express-shop-image").attr("src", imgZoom);
		//pic
		$("#express-shop-availability").html('');
		$("#express-shop-basket-add").attr("disabled","disabled").trigger("disable");
		initDynamics();
		
		$("#express-shop-dyn").fadeIn('slow',null);
		
		var orgPrice = GSI.activeItem.getData('orgprice');
		var offrPrice = GSI.activeItem.getData('offrprice');
		
		$("#express-shop-name").html(GSI.activeItem.getData('name'));
		$("#express-shop-sku").html('item #'+GSI.activeItem.getData('id'));
		$("#express-shop-description").html(GSI.activeItem.getData('description'));
		
		var sizeInfo = GSI.activeItem.data.content.INFO.size_info;
		var buySave = GSI.activeItem.data.content.INFO.buy_save;
		
		if (sizeInfo) $("#express-shop-data .size_info").html(sizeInfo);
		if (buySave) $("#express-shop-data .buy_save").html(buySave);
		
		if (offrPrice) {
			$(".old-price").html(GSI.functions.moneyFormat(orgPrice, GSI.activeItem.getData('currencyid')));
			$(".new-price").html(GSI.functions.moneyFormat(offrPrice, GSI.activeItem.getData('currencyid')));
			$(".price").hide();
			$(".item-price img, .item-price-data").show();
			} else {
			$(".price").html(GSI.functions.moneyFormat(orgPrice, GSI.activeItem.getData('currencyid'))).show();
			$(".item-price img, .item-price-data").hide();
			}
		$('#express-shop-previous-next-item').trigger('refresh');
		$('.express-shop-quantity-select').trigger('reset');
	};

	
	// common functions
		var initDynamics = function(){
			GSI.activeItem.refreshAvailableProperties();
			initSelects();
			initColorPicker();
			$('.express-shop-dynamic-element').trigger('refresh').trigger('deactivateme');
			
		};
		
		var initImages = function(id){
				$(".item-box-image img",".item-box[id=sku_"+id+"]").bind('refresh', function(){
					$(this).attr('src', GSI.activeItem.getImage('small'));
				}).addClass('express-shop-dynamic-images');
				
				$(".express-shop-image-main", "#express-shop-image").bind('refresh', function(){
					$(this).attr("src", GSI.activeItem.getImage('medium'));
					var imgZoom = GSI.activeItem.getImage('zoom');
					if (!imgZoom) {
						zoom.deactivate(); 
						$("#express-activate-zoom").hide();
					}
					else $("#express-activate-zoom").show(); //zoom.activate();
					$(".jqimage", "#express-shop-image").attr("src", imgZoom);
				}).addClass('express-shop-dynamic-images');
		};
	
		var initColorPicker=function(){
			var reset = function(){
			$('img', '#express-shop-color-pickers').each(function(){
				$(this).removeClass('disabled').removeClass('selected').addClass('available');}
				);
			GSI.activeItem.removeFilter('COLOR');
			GSI.activeItem.refreshAvailableProperties();
			$('.express-shop-dynamic-images').trigger('reset');
			};
			
			var refresh = function (){
				var colors = GSI.activeItem.availProperties['COLOR'];
				var _FLAG  = (GSI.functions.count(GSI.activeItem.availProperties['COLOR'])==1) ? true : false;
				$('img', '#express-shop-color-pickers').each(function(){
						$(this).addClass('disabled');						
						for(var aColor in colors){
							if ($(this).attr('id') == colors[aColor]) {
								$(this).removeClass('disabled');
								if (_FLAG){
									$(this).addClass('selected');
									setFilter('COLOR', colors[aColor]);
								}
								break;
							}
						}
					});
				$('.express-shop-dynamic-images').trigger('refresh');
			};
			
			var activate = function(){
				refresh();
				$('#express-shop-color-pickers').removeClass('inactive').addClass('active');
				$('#express-shop-color-pickers span').fadeTo("fast", 1);
				$('#express-shop-color-pickers img').fadeTo("fast", 1);
				$('img', '#express-shop-color-pickers').click(onClick);
			};
			
			var deactivate = function(){
				reset();
				$('#express-shop-color-pickers').removeClass('active').addClass('inactive');
				$('#express-shop-color-pickers span').fadeTo("fast", 0.33);
				$('#express-shop-color-pickers img').fadeTo("fast", 0.33);
				$('img', '#express-shop-color-pickers').unbind('click', onClick);
			};
			
			var colors = GSI.activeItem.data['PROPERTIES']['COLOR'];
			if(!colors) return false;
			
			var html = '<div id="express-shop-color-pickers" class="express-shop-dynamic-element"><span>'+ GSI.dict.getText('property_selector', 'COLOR_selector') + ':</span>';
			for (var aColor in colors){
					try{
					var aSwatchImg = GSI_CATALOG_IMG_PATH + 'swatch/'+GSI.activeItem.data.content.IMG['swatch'][colors[aColor]].name;
					html += '<img src="'+aSwatchImg+'" id="'+colors[aColor]+'" alt="'+colors[aColor]+'" title="'+colors[aColor]+'" >';
					}
					catch(e){
						//GSI.setError('this color I do not like it!!! -> ' + colors[aColor], 'WARNING');
					}
			}
			html+="</div>";
			var domObj = $(html);
			
			$(domObj).bind('reset', function(e, obj){
						var obj = obj;
						if (obj != this) reset();
					}).bind('refresh', function(e, obj){
						var obj = obj;
						if (obj != this) refresh();
					}).bind('activateme', function(e, obj){
						var obj = obj;
						if ($(obj).hasClass('last-select') && $(obj).val() != "") activate();
					}).bind('deactivateme', function(e, obj){
						 if (GSI.functions.count(GSI.activeItem.data.PROPERTIES)>2) deactivate();
					});
					
			var onHoverIn = function(){
						if (!$(this.parentNode).hasClass('inactive')) return;
							var tTip = GSI.widgets.getWidget('tooltip');
							if (!tTip) return;
							tTip.show(this, null, GSI.dict.getText('item', 'select_size_first'),null, 150, null, true);
						};
						
			var onHoverOut = function(){
							var tTip = GSI.widgets.getWidget('tooltip');
							if (!tTip) return;
							tTip.hide();
						};
			
			var onClick = function(){
				
				var me = this.parentNode;
				if ($(this).hasClass('disabled')) {
					  alert('Color invalid, try other size ');
					  return false;
					} else {
					setFilter('COLOR',this.id);
					$('img', domObj).removeClass('selected');
					}
				$(this).addClass('selected');
				$('.express-shop-dynamic-images').trigger('refresh');
				checkStock();
				return false;
				};
				
			$('img', domObj).click(onClick);//.hover(onHoverIn, onHoverOut);
			$("#express-shop-dyn").append(domObj);
		};
			
		var initSelects = function(){
			var itemPropsOrder = {'SIZE':1,'WAIST':1,'default':1};
			var selectNumber = 0;
			
			var reset = function(cmb){
				var cmb = cmb;
				$('option', cmb).removeClass('selected').removeClass('disabled').addClass('available');
				cmb.options[0].selected = "selected";
				var filtername =  cmb.name; 
				GSI.activeItem.removeFilter(filtername);
				GSI.activeItem.refreshAvailableProperties();
			};
			
			var refresh = function(cmb){
				if (cmb.refreshing) return;
				cmb.refreshing = true;
				$(cmb).empty();
				try {
					cmb.add(new Option("---", ""), null);
					} catch(e){
					cmb.add(new Option("---", "")); 
					}
				var tI = 0;
				for(var i in GSI.activeItem.availProperties[cmb.name]){
					var tActive = (GSI.activeItem.availProperties[cmb.name][i] == GSI.activeItem.filters[cmb.name]) ? true : false;
					var tOpt = document.createElement('option');
					tOpt.text = GSI.activeItem.availProperties[cmb.name][i];
					tOpt.value = GSI.activeItem.availProperties[cmb.name][i];
					if (tActive) tI = i+1;
					try{
						cmb.add(tOpt, null);
						} catch(e){
						cmb.add(tOpt);
						}
				}
				cmb.selectedIndex = tI;
				cmb.refreshing = false;
				return;
			};
			
			var activate = function(cmb){
				refresh(cmb);
				$(cmb).removeAttr('disabled').parent().fadeTo("fast", 1);
			};
			
			var deactivate = function(cmb){
				reset(cmb);
				$(cmb).attr('disabled','true').parent().fadeTo("fast", 0.33);
			};
			
			var initSelect = function(k,values){
				var _FLAG = false;
				if (selectNumber == 0) _FLAG = true;				

				var div = $("<div class='item-dynamic-element-div'><span class='title'>"+ GSI.dict.getText('property_selector', k+'_selector') + ":</span>");
				var sel = $("<select>");
				
				sel.addClass('express-shop-dynamic-element').attr("id",'id_'+ selectNumber++).attr("name",k).bind('reset', function(e, obj){
					var obj = obj;
					if (obj.id.replace(/id_/,'') < this.id.replace(/id_/,'')) reset(this); 
				}).bind('refresh', function(e, obj){
					var obj = obj;
					if (obj && obj != this) refresh(this);
				}).bind('activateme', function(e, obj){
					var obj = obj;
					if (parseInt(this.id.replace(/id_/,'')) == parseInt(obj.id.replace(/id_/,'')) + 1) activate(this);
				}).bind('deactivateme', function(e, obj){
					var obj = (obj == undefined) ? $('select.express-shop-dynamic-element').get(0) : obj;
					if (this.id.replace(/id_/,'') > obj.id.replace(/id_/,'')) deactivate(this);
				}).change(function(){
					if (this.id=='express-shop-color-pickers') return;
					var me = this;
					$('option', this).removeClass('selected');
					setFilter(this.name,this.value);
					
					if ($(this).hasClass('last-select') && $(this).val()!="") {
						$(this.options[this.selectedIndex]).addClass('selected');	
						$('.express-shop-dynamic-element').trigger('deactivateme',[me]).trigger('activateme', [me]).trigger('refresh', [me]);
					} else if ($(this.options[this.selectedIndex]).hasClass('disabled')) {
						  $('.express-shop-quantity-select').trigger('reset');
						  $('option', this).removeClass('disabled').addClass('available');
						  $(this.options[this.selectedIndex]).addClass('selected');
						  $('.express-shop-dynamic-element').trigger('deactivateme',[me]).trigger('activateme', [me]);
					} else {
						if ($(this.options[this.selectedIndex]).val() == "") {
							$('.express-shop-quantity-select').trigger('reset');
							$(".express-shop-dynamic-element").trigger('deactivateme',[me]).trigger('refresh', [me]);
							reset(this);
							refresh(this);
							} else {
							$(".express-shop-dynamic-element").trigger('refresh', [me]).trigger('activateme', [me]);
							$(this.options[this.selectedIndex]).addClass('selected');
							}
					}

					checkStock();
					return false;
				}).append('<option value=""> --- </option>');

				
				for(var index in values){
					var v = values[index];
					sel.append('<option value="'+v+'">'+ v + '</option>');
				}
				$(div).append(sel);
				if (_FLAG) $(div).append("<span class='sizing-chart'><a href='"+$('#sizing_chart').attr("value")+"' target='_blank'>"+GSI.dict.getText('item', 'sizing_chart')+"</a></span>");
				$("#express-shop-dyn").append(div);
			};
			
			var PROPS = GSI.activeItem.data['PROPERTIES'];
			if(!PROPS) return false;
			for (var aPos in itemPropsOrder){
				if(aPos=='indexOf') continue;
				if(aPos=="default"){
					for(var optName in PROPS){
						if(optName=='indexOf') continue;
						if(optName=='PRIMARY_COLOR') continue;
						if(optName=='COLOR') continue;
						if (!itemPropsOrder[optName]) {
							initSelect(optName, PROPS[optName]);
							continue;
							}
						else continue;
					}
					continue;
				} else {
					if (PROPS[aPos]) {
						initSelect(aPos, PROPS[aPos]);
						continue;
					} else continue;
				}
			}
			
			selectNumber--;
			$(".express-shop-dynamic-element#id_"+selectNumber).addClass('last-select');
		};
		
		var setFilter = function(k,v) {
			var key = k;
			GSI.activeItem.addFilter(key,v);
			GSI.activeItem.refreshAvailableProperties();
		};
		
		var checkStock = function(){
			var whenStock = function() {
				if(!GSI.activeItem.data.available) {
						$("#express-shop-availability").html(GSI.dict.getText('availability', 'out of stock'));
						$("#express-shop-basket-add").attr("disabled","disabled").trigger("disable");
						$('.express-shop-quantity-select').trigger('reset');
						return;
					}
				$("#express-shop-availability").html(GSI.dict.getText('availability', 'in_stock'));
				$("#express-shop-basket-add").removeAttr('disabled').trigger("enable");
				$('.express-shop-quantity-select').trigger('refresh');
			};
		
			if (!GSI.activeItem.getStock(whenStock)) {
				$("#express-shop-basket-add").attr("disabled","disabled").trigger("disable");
				$('.express-shop-quantity-select').trigger('reset');
				$("#express-shop-availability").html('');
			} else {
				$("#express-shop-availability").html('<img src="'+GSI_APP_IMG_PATH+'shared/loader_small.gif" alt="" title="">');
			}
		};
		

		
	var disableGUI = function(){
		$('#express-shop-basket-add').attr('disabled', 'disabled').trigger("disable");
	};

	var enableGUI = function(){
		$('#express-shop-basket-add').removeAttr('disabled').trigger("disable");
	};

	this.init = function(){
		if (!load()) {
			GSI.updateProgressBar(_mthis.name +" "+ GSI.dict.getText('JSAPI', 'widget_initiation_error'));
			return false;
		}
		
		//add to basket button
		$('#express-shop-basket-add').click(function(){
				var addToBasketFb = function(){
					enableGUI();
				};
			try{		
				disableGUI();
				_mthis.hide();
				_mthis.addToBasket(addToBasketFb);	
				}catch(e){
				_mthis.setError('Widget minibasket not found!!!'+'\n'+e.message, 'ERROR');
				}
		});
		
		//images
		initImages();
		
		//quantity selector
		$('.express-shop-quantity-select').change(function(){
			GSI.activeItem.quantity = $(this).val();
		}).bind('reset', function(){
			$(this).empty();
			$(this).attr("disabled","disabled");
			$('.express-shop-quantity').fadeTo("fast", 0.33);
		}).bind('refresh', function(){
			$(this).empty();
			var qty = parseInt(GSI.activeItem.data.iol_stock_qty);
			qty = qty<=10?qty:10;
			if (qty<=0) {
				$(this).attr('disabled', 'disabled');
				$('.express-shop-quantity').fadeTo("fast", 0.33);
				return;
				}
			$(this).append('<option value="1" selected>1</option>');
			for (var i=2; i<=qty; i++){
				$(this).append('<option value="'+i+'">'+i+'</option>');
			}
			$(this).removeAttr('disabled');
			$('.express-shop-quantity').fadeTo("fast", 1);
			return;
		});
		
		zoom = $('.jqzoom', '#express-shop-image').jqueryzoom({
				xzoom: 385, //zooming div default width(default width value is 200)
				yzoom: 380, //zooming div default height(default height value is 200)
				xoffset: 390, //zooming div default left offset(default offset value is 10)
				yoffset: false, //zooming div default top offset(default offset value is 10)
				//IdContainer: 'express-shop-data'
				IdContainer: 'express-shop-content'
		});
		
		var createToolTip = function(tItem){
						
						var orgPrice = tItem.getData('orgprice');
						var offrPrice = tItem.getData('offrprice');
						var tWidth= 80;
						
						
						if (offrPrice){
						$(".item-box-contents-price-offer, .item-tooltip-offer-percentage", "#item-tooltip-thumb").show();
						$(".item-box-contents-price", "#item-tooltip-thumb").addClass('originalprice').css({position: "absolute"});
						tWidth= 120;
						}
						else {
							$(".item-box-contents-price-offer, .item-tooltip-offer-percentage", "#item-tooltip-thumb").hide();
							$(".item-box-contents-price", "#item-tooltip-thumb").removeClass('originalprice')
								.css({position: "relative"});
						}
					
						var name  =tItem.getData('name');
						if (name.length >=50) name = name.substr(0,50)+'...';
						
						var tooltipTemplate = $("#item-tooltip-thumb").html(); 
						var tooltipTemplate = $("#item-tooltip-thumb").html(); 
						var tStr = tooltipTemplate.replace(/__itemPriceOrg__/g,GSI.functions.moneyFormat(orgPrice, tItem.getData('currencyid')));
						if (offrPrice) tStr = tStr.replace(/__itemPriceOffr__/g,GSI.functions.moneyFormat(offrPrice, tItem.getData('currencyid')));
						tStr = tStr.replace(/__itemName__/g,name);
						tStr = tStr.replace(/__itemImage__/g,'<img src="' +tItem.getImage('small')+ '" />') ;
						
						return tStr;
					};
					
					var onHoverInNext = function(){
									var item = collection.getNextItem();
									var tTip = GSI.widgets.getWidget('tooltip');
									if (!tTip) return;
									tTip.show(this, null, createToolTip(item),null, 170, null, true);
								};
								
					var onHoverInPrev = function(){
									var item = collection.getPreviousItem();
									var tTip = GSI.widgets.getWidget('tooltip');
									if (!tTip) return;
									tTip.show(this, null, createToolTip(item),null, 170, null, true);
								};
								
					var onHoverOut = function(){
									var tTip = GSI.widgets.getWidget('tooltip');
									if (!tTip) return;
									tTip.hide();
								};	
		//next/prev item
		$('#express-shop-next-item-next').click(function(){
			var item = collection.getNextItem();
			_mthis.loader(true);
			activateItem(item.getData('id'));
			return false;
		}).hover(onHoverInNext, onHoverOut);
		
		$('#express-shop-next-item-previous').click(function(){
			var item = collection.getPreviousItem();
			_mthis.loader(true);
			activateItem(item.getData('id'));
			return false;
		}).hover(onHoverInPrev, onHoverOut);
		
		$('#express-shop-previous-next-item').bind('refresh', function(){
			var prevItem = collection.getPreviousItem();
			if (!prevItem) $('#express-shop-next-item-previous').hide(); else $('#express-shop-next-item-previous').show();
			var nextItem = collection.getNextItem();
			if (!nextItem) $('#express-shop-next-item-next').hide(); else $('#express-shop-next-item-next').show();
			if (!prevItem && !nextItem) $('#express-shop-product-navigation').hide(); else $('#express-shop-product-navigation').show();
		});
		
		zoom.deactivate();
		zoom.zoomReady(false);
		
		$("#express-placeholder-zoom").hover(
		function(){
			$(this).hide();
			zoom.zoomReady(true);
		},
		function(){}
		);
		$("#express-activate-zoom").click(function(){
			if ($(this).hasClass("on")){
				$("#express-placeholder-zoom").hide();
				zoom.deactivate();
				zoom.zoomReady(false);	
				$(this).removeClass("on").html(GSI.dict.getText('item', 'view_larger'));
			} else {
				$("#express-placeholder-zoom").show();
				$(this).addClass("on").html(GSI.dict.getText('item', 'desactivate_view_larger'));
				zoom.activate();				
			}	
			
			return false;
		});
		
		_mthis.loaded = true;
		GSI.updateProgressBar(_mthis.name +" "+ GSI.dict.getText('JSAPI', 'widget_initiated'));
		return true;
	};
};
GSI_Widget_ExpressItem.prototype=new GSI_Widget();

function showExpressItem(ID) {
	GSI.widgets.getWidget('expressitem').show(ID);
}

var tW = new GSI_Widget_ExpressItem();
GSI.widgets.loadWidget(tW);
