Ext.app.RT.CartItem=Ext.data.Record.create([{name:"item_id",type:"int"},{name:"item_name"},{name:"model_no"},{name:"quantity",type:"float"},{name:"unit_name"},{name:"sales_price",type:"float"},{name:"amount",type:"float"}]);AddressSelector=function(A){Ext.apply(this,A);this.store=new Ext.data.Store({reader:new Ext.data.ArrayReader({},Ext.app.RT.ShippingAddress)});this.grid=new Ext.app.AddressGrid({title:"选择预定义地址",store:this.store});this.form=new Ext.app.AddressForm({title:"输入新地址"});this.form.add({xtype:"checkbox",name:"save-addr",hideLabel:true,checked:true,hideParent:true,boxLabel:"提交订单时自动保存该地址到您的预定义发货地址清单以便下次使用"});this.items=[this.grid,this.form];AddressSelector.superclass.constructor.call(this)};Ext.extend(AddressSelector,Ext.TabPanel,{activeTab:0,initEvents:function(){AddressSelector.superclass.initEvents.call(this);this.form.on("activate",this.form.doLayout);this.on("show",this.loadAddress,this,{single:true})},loadAddress:function(){Ext.Ajax.request({url:"/user/json",jsonData:{version:"1.1",method:"getAddresses",params:{}},success:function(A){var B=Ext.decode(A.responseText);this.store.loadData(B.result);var C=this.store.getCount();if(C>0){this.grid.getSelectionModel().selectFirstRow();this.grid.enable();if(C>=5){var D=this.form.find("name","save-addr")[0];D.setValue(false);D.hide()}}else{this.grid.disable();this.activate(this.form)}},scope:this,nocache:true})},getAddress:function(){var A=this.getActiveTab();if(A==this.grid){var C=A.getSelectionModel().getSelected();return C?C.data:null}else{var B=A.getForm();return A.isValid()?B.getValues():null}},needSaveAddr:function(){return(this.getActiveTab()==this.form)&&(this.form.getForm().findField("save-addr").getValue())}});Ext.app.ShoppingCart=function(){var A=new Ext.ux.grid.ActionColumn({action:"delete",text:"删除",width:50,tooltip:{text:"删除商品"},handler:function(C,B){C.store.remove(B);C.getView().refresh()}});this.store=new Ext.data.Store({reader:new Ext.data.ArrayReader({},Ext.app.RT.CartItem)});this.store.on("update",function(C,B){B.data.amount=B.data.sales_price*B.data.quantity;this.refreshSummaryData();this.refreshSummaryDisplay();Ext.getCmp("btn-update-cart").enable();Ext.getCmp("btn-cancel-cart").enable();Ext.getCmp("btn-submit-cart").disable()},this);this.store.on("remove",function(){this.refreshSummaryData();this.refreshSummaryDisplay();Ext.getCmp("btn-update-cart").enable();Ext.getCmp("btn-cancel-cart").enable();Ext.getCmp("btn-submit-cart").disable()},this);this.grid=new Ext.grid.EditorGridPanel({id:"cart-grid",store:this.store,cm:new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(),{header:"商品号",width:20,dataIndex:"item_id"},{header:"商品名称",width:60,dataIndex:"item_name"},{header:"型号",width:20,sortable:true,dataIndex:"model_no"},{header:"售价",width:25,align:"right",sortable:true,renderer:function(C,D,B){return Ext.util.Format.cnMoney(B.data.sales_price)+" / "+B.data.unit_name},dataIndex:"sales_price"},{header:"数量",width:15,align:"center",sortable:true,summaryType:"sum",dataIndex:"quantity",editor:new Ext.form.NumberField({allowBlank:false,allowNegative:false,style:"text-align:center"}),renderer:function(C,B){B.css="col-edit";return C}},{header:"金额",width:20,align:"right",sortable:true,summaryType:"sum",renderer:Ext.util.Format.cnMoney,dataIndex:"amount"},A]),sm:new Ext.grid.RowSelectionModel({singleSelect:true}),buttons:[{id:"btn-close-cart",text:"继续购物",tooltip:"关闭购物车窗口，继续购物",iconCls:"x-icon-close",handler:function(){this.win.hide()},scope:this},{id:"btn-update-cart",text:"保存变更",iconCls:"btn-ok",tooltip:"保存对购物车所做的更改",disabled:true,handler:function(){this.updateCart()},scope:this},{id:"btn-cancel-cart",text:"取消变更",iconCls:"btn-cancel",tooltip:"取消对购物车所做的更改",disabled:true,handler:function(){this.reload()},scope:this},{id:"btn-submit-cart",text:"下一步",iconCls:"x-icon-next",tooltip:"选择送货地址",handler:function(){if(this.store.getCount()>0){this.win.getLayout().setActiveItem(Ext.app.loggedIn?"select-address":"not-logged-in")}else{Ext.MessageBox.show({title:"购物车没有商品",msg:"您的购物车没有商品，请添加商品后再提交。",buttons:Ext.MessageBox.OK,icon:Ext.MessageBox.ERROR})}},scope:this}],buttonAlign:"center",tbar:[{text:"清空购物车",tooltip:"从购物车中删除所有项目",iconCls:"btn-delete",handler:function(){this.clearCart();Ext.getCmp("btn-update-cart").enable();Ext.getCmp("btn-cancel-cart").enable()},scope:this}],plugins:[A,new Ext.ux.grid.GridSummary()],viewConfig:{forceFit:true},width:700,stripeRows:true,height:350,clicksToEdit:1,enableColumnMove:false,trackMouseOver:true});this.addressSelector=new AddressSelector({id:"select-address",baseCls:"x-plain",buttonAlign:"center",buttons:[{id:"btn-back-to-cart",text:"返回购物车",iconCls:"x-icon-previous",handler:function(){this.win.getLayout().setActiveItem("cart-grid")},scope:this},{id:"btn-confirm-address",text:"下一步",tooltip:"填写发货日期等",iconCls:"x-icon-next",handler:function(){if(this.addressSelector.getAddress()){this.win.getLayout().setActiveItem("order-header")}else{Ext.MessageBox.show({title:"发货地址错误",msg:"您未选择选择发货地址或输入的地址有误。出错字段由红色边框标识，出错字段下可以看到出错原因。请检查更正后继续。",buttons:Ext.MessageBox.OK,icon:Ext.MessageBox.ERROR})}},scope:this}]});this.win=new Ext.Window({width:720,height:380,layout:"card",iconCls:"x-icon-cart",animateTarget:"cart",activeItem:0,title:"购物车",closable:true,closeAction:"hide",defaultButton:"btn-close-cart",plain:false,constrain:true,renderTo:Ext.getBody(),items:[this.grid,{id:"not-logged-in",html:"只有登录后的顾客才能提交订单，请先登录。",baseCls:"x-plain",bodyStyle:"padding: 5px",buttonAlign:"center",buttons:[{id:"btn-login",text:"立即登录",iconCls:"x-icon-login",handler:function(){loginWin.show(function(){this.win.getLayout().setActiveItem("select-address")},this)},scope:this},{id:"btn-close-win",text:"关闭",iconCls:"btn-cancel",handler:function(){this.win.hide()},scope:this}]},this.addressSelector,{xtype:"form",id:"order-header",labelWidth:90,autoScroll:true,bodyStyle:"padding: 5px",defaults:{msgTarget:"under"},items:[{bodyStyle:"padding-bottom: 5px",border:false,html:"请输入订单的其他信息"},{xtype:"datefield",name:"shipping_date",fieldLabel:"要求发货日期*",itemCls:"required",allowBlank:false,format:"Y-m-d",altFormats:"Y/m/d|Y/m/j|Y/N/d|Y/N/j",width:100,minValue:new Date().clearTime()},{xtype:"textarea",name:"memo",autoScroll:true,fieldLabel:"订单备注",anchor:"95% -53"}],buttonAlign:"center",buttons:[{text:"上一步",iconCls:"x-icon-previous",handler:function(){this.win.getLayout().setActiveItem("select-address")},scope:this},{text:"提交订单",handler:function(){if(this.win.getComponent("order-header").getForm().isValid()){this.submitCart()}else{Ext.MessageBox.show({title:"表单错误",msg:"表单仍有错误，请修正后继续。",buttons:Ext.MessageBox.OK,icon:Ext.MessageBox.ERROR})}},scope:this}]},{xtype:"infopanel",id:"success-message",cls:"success-message",startHidden:false,collapsed:false,icon:Ext.ux.InfoPanel.SUCCESS,bodyStyle:"padding: 5px;",msg:'<p>感谢您购买我们的产品。您的订单已成功提交，订单编号为<span id="order-id"></span>。</p><p>我们的工作人员将于24小时内审核您订单中商品的库存状况以及物流方式和费用，并对订单做出修改。如果您留了联系方式，我们会在审核后和您联系。</p><p>您也可以到页面右上方<a href="/user/@@manage?activepane=pending-orders"><img src="/img/icon-orders.gif" />我的订单</a>中查看跟踪订单的处理状态。</p>',buttonAlign:"center",buttons:[{text:"关闭",iconCls:"x-icon-close",handler:function(){this.win.hide()},scope:this}]}],tools:[{id:"help",qtip:"查看购物车使用指南",handler:function(D,C,B){window.open("/howtobuy")}}],listeners:{beforehide:{fn:this.onCloseCartWin,scope:this},hide:{fn:function(){Ext.get("cart").fadeOut({duration:1}).fadeIn({duration:1})}},show:{fn:function(){if(!this.loaded&&!this.loading){this.reload()}},scope:this}}})};Ext.app.ShoppingCart.prototype={addToCart:function(A){this.loading=true;Ext.Ajax.request({url:"/cart/json",jsonData:{version:"1.1",method:"add",params:{items:A}},success:function(B){var C=Ext.decode(B.responseText);this.refresh(C.result);this.loading=false;this.loaded=true;this.grid.getView().focusRow(C.result.items.length-1)},scope:this})},clearCart:function(){this.store.removeAll();this.refreshSummaryData();this.refreshSummaryDisplay()},updateCart:function(){var A=[];this.store.each(function(B){A.push({item_id:B.data.item_id,quantity:B.data.quantity})});Ext.Ajax.request({url:"/cart/json",jsonData:{version:"1.1",method:"update",params:{items:A}},success:function(B){var C=Ext.decode(B.responseText);this.refresh(C.result)},scope:this})},submitCart:function(){var A=this.win.getComponent("order-header").getForm();Ext.Ajax.request({url:"/cart/json",jsonData:{version:"1.1",method:"submit",params:{address:this.addressSelector.getAddress(),shipping_date:A.findField("shipping_date").getValue(),memo:A.findField("memo").getValue(),save_address:this.addressSelector.needSaveAddr()}},success:function(B){var C=Ext.decode(B.responseText);if(C.result){Ext.select("#success-message #order-id").update(C.result);this.win.getLayout().setActiveItem("success-message");this.clearCart()}},scope:this})},reload:function(){Ext.Ajax.request({url:"/cart/json",jsonData:{version:"1.1",method:"data",params:{}},success:function(A){var B=Ext.decode(A.responseText);this.refresh(B.result);this.loaded=true},async:false,scope:this,nocache:true})},refresh:function(A){this.number_of_items=A.number_of_items;this.amount=A.amount;this.store.loadData(A.items);this.refreshSummaryDisplay();Ext.getCmp("btn-update-cart").disable();Ext.getCmp("btn-cancel-cart").disable();Ext.getCmp("btn-submit-cart").enable()},onCloseCartWin:function(){if(!this.grid.buttons[1].disabled){Ext.MessageBox.confirm("购物车已更改","您的购物车商品已发生更改，是否需要保存所作的变动?",function(A){if(A=="yes"){this.updateCart()}else{this.reload()}},this)}this.win.getLayout().setActiveItem("cart-grid")},refreshSummaryData:function(){this.number_of_items=this.store.getCount();this.amount=this.store.sum("amount")},refreshSummaryDisplay:function(){Ext.select("#cart #num_items").update(this.number_of_items);Ext.select("#cart #amount").update(Ext.util.Format.cnMoney(this.amount))},show:function(){this.win.center();this.win.show()}};Ext.onReady(function(){Ext.app.ShoppingCart.globalCart=new Ext.app.ShoppingCart();var A=Ext.app.ShoppingCart.globalCart;Ext.get("cart").on("click",function(){A.show()});Ext.select(".buy input").each(function(C){var D=new Ext.form.NumberField({applyTo:C})});function B(F){var D=[];Ext.select(".buy input").each(function(G){var I=Number(G.getValue());if(I>0){var H=Number(G.dom.id);D.push({item_id:H,quantity:I});G.dom.value=""}});if(D.length===0){var C=Ext.get(F.getTarget("div")).child("input");var E=Number(C.dom.id);D.push({item_id:E,quantity:1})}A.addToCart(D);A.show(Ext.get("cart"))}Ext.select(".buy a").on("click",B)});