YAHOO.namespace("booking");
Ext.namespace("paxes");
Ext.namespace("services");

YAHOO.booking.service = null;

paxes.record = Ext.data.Record.create(['value', 'text', 'misc']);

YAHOO.booking.initService = function(service) {
	YAHOO.booking.service = service;	
}

services.init = function(cfg) {
	Ext.each(cfg, function(ctrl, index) {
		Ext.getCmp(ctrl.isActiveId).on("check", function(cmp) {
			services.changeCountCmpState(ctrl.isActiveId, ctrl.countId);
			services.updateExtraPrice(ctrl.isActiveId, ctrl.countId, ctrl.serviceIndex, ctrl.serviceTypeIndex, ctrl.indexInService,ctrl.basketIndex);			
		});
		Ext.getCmp(ctrl.countId).on("spin", function(cmp) {
			services.updateExtraPrice(ctrl.isActiveId, ctrl.countId, ctrl.serviceIndex, ctrl.serviceTypeIndex, ctrl.indexInService,ctrl.basketIndex);
		});
	});
}

services.changeCountCmpState = function(isActiveId, countId) {
	var isActive = Ext.getCmp(isActiveId).getValue();
	var countCmp = Ext.getCmp(countId);
	if (isActive && countCmp.getValue() == 0)
		countCmp.setValue(1);
	else
		countCmp.setValue(0);
	countCmp.setDisabled(!isActive); 
}

services.updateExtraPrice = function(isActiveId, countId, serviceIndex, serviceTypeIndex, indexInService,basketIndex) {
	var isActive = Ext.getCmp(isActiveId).getValue();
	var count = Ext.getCmp(countId).getValue();
	var extraPriceStore = new Ext.data.Store({
		proxy: new Ext.ux.data.DwrProxy({
			apiActionToHandlerMap : {
				read : {
					dwrFunction : YAHOO.booking.service.onExtraServiceChange,
					getDwrArgsFunction : function(trans) {
						return [serviceIndex, isActive, count, serviceTypeIndex, indexInService, basketIndex];
					}
				}
			}
		}),
		reader: new Ext.data.JsonReader({
			root : 'rows[0]',
			fields : [
				{name: 'value'},
				{name: 'text'},
				{name: 'misc'}
			]
		})
	});
	extraPriceStore.load({
		callback: function(r, success) {
			if (success) {
				if(r.length > 0){
					jQuery('#extraConvertedPrice_' + serviceTypeIndex + "_" + indexInService + "_" + basketIndex).text(r[0].json);
					jQuery('#extraPrice_' + serviceTypeIndex + "_" + indexInService + "_" + basketIndex).text(r[1].json);
					services.updateTotalPrice(r[2]);
			    }
			}
		}
	});
	
}

paxes.updateRequiredExtra = function(requiredExtraLabel, serviceTypeIndex, indexInService, basketIndex) {
	jQuery('#requiredExtra_' + serviceTypeIndex + "_" + indexInService + "_" + basketIndex).text(requiredExtraLabel).text(requiredExtraLabel);
}

paxes.updatePrices = function(prices, serviceTypeIndex, indexInService, basketIndex) {
	jQuery('#price_' + serviceTypeIndex + "_" + indexInService+"_"+basketIndex).text(prices[0].json);
	jQuery('#convertedPrice_' + serviceTypeIndex + "_" + indexInService +"_"+basketIndex).text(prices[1].json);
	/** render total price */
	services.updateTotalPrice(prices[2]);
}

services.updateTotalPrice = function(data)
{
	/** render total price */
	jQuery(".price-info>.green").text(data.json);
	jQuery(".total>strong>.green").text(data.json);
}

paxes.init = function(cfg, commonRequiredExtra, commonRequiredExtraId) {
	
	if (!commonRequiredExtra) {
		Ext.each(cfg, function(ctrl, index) {
	
			Ext.getCmp(ctrl.paxId).on("select", function(cmp) {
				paxes.paxChange_sm(ctrl.paxId, ctrl.requiredExtraId, ctrl.adultIndex, ctrl.child, ctrl.childIndex, ctrl.serviceTypeIndex, ctrl.indexInService, ctrl.basketIndex);
			});
			Ext.getCmp(ctrl.requiredExtraId).on("select", function(cmp) {
				paxes.paxChange_sm(ctrl.paxId, ctrl.requiredExtraId, ctrl.adultIndex, ctrl.child, ctrl.childIndex, ctrl.serviceTypeIndex, ctrl.indexInService,  ctrl.basketIndex);
			});
		});
	} else {
		
		Ext.each(cfg.ctrls, function(ctrl) {
			Ext.getCmp(ctrl.paxId).on("select", function(cmp) {
				paxes.paxChange_cm(cfg.ctrls, cfg.requiredExtraId, ctrl.paxId, ctrl.adultIndex, ctrl.child, ctrl.childIndex, ctrl.serviceTypeIndex, ctrl.indexInService, ctrl.basketIndex, commonRequiredExtraId);
			});
			if (commonRequiredExtraId == null) {
				Ext.getCmp(cfg.requiredExtraId).on("select", function(cmp) {
					paxes.paxChange_cm(cfg.ctrls, cfg.requiredExtraId, null, null, null, null, ctrl.serviceTypeIndex, ctrl.indexInService, ctrl.basketIndex, null);
				});
			}
		});
		
	}
}

paxes.paxChange_cm = function(ctrls, requiredExtraId, paxId, adultIndex, child, childIndex, serviceTypeIndex, indexInService, basketIndex, commonRequiredExtraId) {
	var pax = null;
	if (paxId != null) {
		pax = Ext.getCmp(paxId).getValue();
	}
	var requiredExtraCmp = Ext.getCmp(requiredExtraId);
	
	paxes.load_cm(ctrls, requiredExtraCmp, pax, adultIndex, child, childIndex, serviceTypeIndex, indexInService, basketIndex, commonRequiredExtraId);
}

paxes.load_cm = function(ctrls, requiredExtraCmp, pax, adultIndex, child, childIndex, serviceTypeIndex, indexInService, basketIndex, commonRequiredExtraId) {
	var paxCmps = [];
	var requiredExtraCmps = [];
	Ext.each(ctrls, function(ctrl) {
		paxCmps.push(Ext.getCmp(ctrl.paxId));
		if (commonRequiredExtraId == null) {
			requiredExtraCmps.push(Ext.getCmp(ctrl.requiredExtraId));
		}
	});

	if (commonRequiredExtraId == null) {
		requiredExtraId = requiredExtraCmp.getValue()
	} else {
		requiredExtraId = commonRequiredExtraId;
	}
	
	var requiredExtraStore = new Ext.data.Store({
		proxy: new Ext.ux.data.DwrProxy({
			apiActionToHandlerMap : {
				read : {
					dwrFunction : YAHOO.booking.service.onPaxOrCommonRequiredExtrasChange,
					getDwrArgsFunction : function(trans) {
						return [requiredExtraId , pax, adultIndex, child, childIndex, serviceTypeIndex, indexInService, basketIndex];
					}
				}
			}
		}),
		reader: new Ext.data.JsonReader({
			root : 'rows[0]',
			fields : [
				{name: 'value'},
				{name: 'text'},
				{name: 'misc'}
			]
		})
	});
	requiredExtraStore.load({
		callback: function(r, success) {
			if (success) {
				Ext.each(requiredExtraCmps, function(curRequiredExtraCmp, index) {
					curRequiredExtraCmp.store.removeAll();
					curRequiredExtraCmp.store.add(r);
					curRequiredExtraCmp.setValue(requiredExtraCmp.getValue());
				});
				Ext.each(paxCmps, function(paxCmp, index) {
					var paxStore = new Ext.data.Store({
						reader: new Ext.data.JsonReader({
							root : 'rows[' + (index + 1) + ']',
							fields : [
								{name: 'value'},
								{name: 'text'},
								{name: 'misc'}
							]
						})
					});
					paxStore.on("load", function(store, records, options) {
						paxCmp.store.removeAll();
						paxCmp.store.add(records);
						paxCmp.setValue(paxCmp.getValue());
					});
					paxStore.loadData(requiredExtraStore.reader.jsonData);
				});
				
				var requiredExtraLabelStore = new Ext.data.Store({
					reader: new Ext.data.JsonReader({
						root : 'rows[' + (paxCmps.length + 1) + ']',
						fields : [
							{name: 'value'},
							{name: 'text'},
							{name: 'misc'}
						]
					})
				});
				requiredExtraLabelStore.loadData(requiredExtraStore.reader.jsonData);
				if (requiredExtraLabelStore.data.items[0] != null) {
					paxes.updateRequiredExtra(requiredExtraLabelStore.data.items[0].json, serviceTypeIndex, indexInService, basketIndex);
				}
				
				var priceLabelStore = new Ext.data.Store({
					reader: new Ext.data.JsonReader({
						root : 'rows[' + (paxCmps.length + 2) + ']',
						fields : [
							{name: 'value'},
							{name: 'text'},
							{name: 'misc'}
						]
					})
				});
				priceLabelStore.loadData(requiredExtraLabelStore.reader.jsonData);
				paxes.updatePrices(priceLabelStore.data.items, serviceTypeIndex, indexInService, basketIndex);
			}
		}
	});
	
}

paxes.paxChange_sm = function(paxId, requiredExtraId, adultIndex, child, childIndex, serviceTypeIndex, indexInService, basketIndex) {
	var paxCmp = Ext.getCmp(paxId);
	var requiredExtraCmp = Ext.getCmp(requiredExtraId);
	var paxStore = new Ext.data.Store({
		proxy: new Ext.ux.data.DwrProxy({
			apiActionToHandlerMap : {
				read : {
					dwrFunction : YAHOO.booking.service.onPaxOrRequiredExtraChange,
					getDwrArgsFunction : function(trans) {
						return [ paxCmp.getValue(), requiredExtraCmp.getValue(),adultIndex, child, childIndex, serviceTypeIndex, indexInService, basketIndex ];
					}
				}
			}
		}),
		reader: new Ext.data.JsonReader({
			root : 'rows[0]',
			fields : [
				{name: 'value'},
				{name: 'text'},
				{name: 'misc'}
			]
		})
	});
	paxStore.load({
		callback: function(r, success) {
			if (success) {
				paxCmp.store.removeAll();
				paxCmp.store.add(r);
				paxCmp.setValue(paxCmp.getValue());
				
				var requiredExtraStore = new Ext.data.Store({
					reader: new Ext.data.JsonReader({
						root : 'rows[1]',
						fields : [
							{name: 'value'},
							{name: 'text'},
							{name: 'misc'}
						]
					})
				});
				
				requiredExtraStore.on("load", function(store, records, options) {
					requiredExtraCmp.store.removeAll();
					requiredExtraCmp.store.add(records);
					requiredExtraCmp.setValue(requiredExtraCmp.getValue());
				});
				requiredExtraStore.loadData(paxStore.reader.jsonData);
				
				var requiredExtraLabelStore = new Ext.data.Store({
					reader: new Ext.data.JsonReader({
						root : 'rows[2]',
						fields : [
							{name: 'value'},
							{name: 'text'},
							{name: 'misc'}
						]
					})
				});
				requiredExtraLabelStore.loadData(paxStore.reader.jsonData);
				paxes.updateRequiredExtra(requiredExtraLabelStore.data.items[0].json, serviceTypeIndex, indexInService, basketIndex);
				
				var priceLabelStore = new Ext.data.Store({
					reader: new Ext.data.JsonReader({
						root : 'rows[3]',
						fields : [
							{name: 'value'},
							{name: 'text'},
							{name: 'misc'}
						]
					})
				});
				priceLabelStore.loadData(paxStore.reader.jsonData);
				paxes.updatePrices(priceLabelStore.data.items, serviceTypeIndex, indexInService,basketIndex);
			}
		}
	});
}



Ext.namespace("popup");

popup.showPopup = function(id,position,offset, title) {
	var clPanel = Ext.getCmp(id);
    var xy = clPanel.el.getAlignToXY(window.document, (position?position:'c-c'),offset);
    clPanel.setPagePosition(xy[0], xy[1]);
    if(title)
    	clPanel.setTitle(title);
    clPanel.show();
}

popup.hidePopup = function(id) {
	var clPanel = Ext.getCmp(id);
    clPanel.hide();
}
