
/*
	"Hemi" JavaScript Framework
	Engine for Web Applications 3.1
	Composite file "hemi.comp.js" release: 3.1.1
	Copyright 2002 - 2010. All Rights Reserved.
	Author: Stephen W. Cote
	Email: sw.cote@gmail.com
	Project: http://www.whitefrost.com/Hemi/
	BSD License: http://www.whitefrost.com/Hemi.license.txt
*/
(function(){H.include("hemi.object");H.include("hemi.util");H.namespace("transaction",H,{service:null,addServiceAPI:
function(o){if(!D.TO(o)||!D.TO(o.p)){H.logWarning("Object is null or does not define a.p hash");return 0;}if(!D.TF(o.getPacket))o.getPacket=function(n){var _t=H.transaction.service;if(n)return _t.getPacketByName(n);else return _t.getPacket(this.p.PacketId);};if(!D.TF(o.startTransaction))o.startTransaction=function(s,p){var	_m=H.message.service,t=this;if(typeof t._handle_begin_transaction==D.F)t._handle_begin_transaction(s,p);_m.S("Start transaction "+p.packet_name+" for "+t.t,"200.1");return 1;};if(!D.TF(o.endTransaction))o.endTransaction=function(s,p){var t=this;if(typeof t._handle_end_transaction==D.F)t._handle_end_transaction(s,p);H.message.service.S("End transaction "+p.packet_name+" for "+t.t,"200.1");return 1;};if(!D.TF(o.doTransaction))o.doTransaction=function(s,p){var t=this,q,qh,x=0,y=0;if(typeof t._handle_transaction==D.F)x=t._handle_transaction(s,p);q=p.data.type;qh='_handle_'+q;if(q&&typeof t[qh]==D.F)y=t[qh](s,p);H.message.service.S("Do Transaction for "+t.i+" on target "+qh,"200.1");return 0;};if(!D.TF(o.serveTransaction))o.serveTransaction=function(v,r,b,n){var _t=H.transaction.service,p,t=this;p=t.getPacket(n);if(p){p.data.type=v;p.data.src=r;_t.serveTransaction(p,t.i,(!b));return 1;}return 0;};if(!D.TF(o.joinTransactionPacket))o.joinTransactionPacket=function(n){var _t=H.transaction.service,p,t=this,i,b=1;if(!n&&t.p)n=t.p.TransactionName;if(!n){H.logWarning('Invalid packet name:'+n);return 0;}p=_t.getPacketByName(n);if(p){i=p.packet_id;p.setBlockStartTransaction(false);b=_t.addTransactionParticipant(t,p);}else{i=_t.openTransaction(n,t,{type:0,src:0,data:0});}t.p.PacketId=i;return(!b?0:i);};return 1;},serviceImpl:
function(){var t=this;t.o={r:[],rm:[]};t.p={a:0,c:0,l:"hemi.transaction"};t.sigterm=function(){var t=this,_p,a,i=0;_p=t.o;if(t.r!=5){_p.r=[];_p.rm=[];a=_p.packets;for(;i<a.length;i++)t.closeTransaction(a[i].packet_id);t.clearPackets();}};t.getRegisteredObjects=function(){return this.o.r;};t.getRegisteredObjectsMap=function(){return this.o.rm;};t.canRegister=function(o){var _o=H.registry.service;if(!_o.isRegistered(o.i)||!D.TF(o.doTransaction)||!D.TF(o.startTransaction)||!D.TF(o.endTransaction)){return 0;}return 1;};t.isRegistered=function(o){var _p=t.o;if(D.TO(o)&&o!=null&&D.TN(_p.rm[o.i])&&_p.r[_p.rm[o.i]]){return 1;}return 0;};t.register=function(o,b){var _p=t.o,_m=H.message.service;if(t.isRegistered(o)){_m.S("Object "+o.t+" is already registered with transaction service","511.4");return 0;}if(b)H.transaction.addServiceAPI(o);if(!t.canRegister(o)||o.t=="transaction_service"){_m.S("Unable to register object "+o.t+" with transaction service","511.4");return 0;}_p.rm[o.i]=_p.r.length;_p.r[_p.r.length]=o.i;return 1;};t.unregister=function(o){var _p=t.o,_m=H.message.service;if(!t.isRegistered(o))return 0;t.removeTransactionParticipants(o);_p.r[_p.rm[o.i]]=0;delete _p.rm[o.i];return 1;};t.removeTransactionParticipants=function(o){p=t.o.packets,i=0;for(;i<p.length;)t.removeTransactionParticipant(o,p);};t.addTransactionParticipant=function(o,p){var _m=H.message.service;if(t.isRegistered(o)&&t.isPacket(p)&&!p.participants[o.i]){p.participants[o.i]=1;p.participant_count++;if(!p.bst)o.startTransaction(t,p);return 1;}return 0;};t.removeTransactionParticipant=function(o,p){var _m=H.message.service;if(t.isRegistered(o)&&t.isPacket(p)&&p.participants[o.i]){delete p.participants[o.i];p.participant_count--;return 1;}return 0;};t.serveTransaction=function(p,x,b){var _m=H.message.service,_o=H.registry.service,o,a,i,d,r;if(t.isPacket(p)){if(!p.is_open||!p.participant_count)return 0;if(D.TU(x))x=p.owner_id;a=p.participants;if(x&&_o.isRegistered(x)&&!b&&((p.serve_type==1&&a[x]!=2)||(p.serve_type==2&&!a[x]))){o=_o.getObject(x);if(t.isRegistered(o)&&a[o.i]){r=(o.doTransaction(t,p)?1:0);if(r&&p.serve_type==1)a[x]=2;}}if(!x||!p.btt){for(i in a){d=a[i];if(a[i]&&((p.serve_type==1&&a[i]!=2)||(p.serve_type==2&&!a[i]))&&_o.isRegistered(i)&&i!=x){o=_o.getObject(i);if(t.isRegistered(o)){r=(o.doTransaction(t,p)?1:0);if(r&&p.serve_type==1)a[i]=2;}}}}r=1;for(i in a){if((p.serve_type==1&&a[i]!=2)||(p.serve_type==2&&!a[i])){r=0;break;}}if(r)t.XT(p);return 1;}else{_m.S("Invalid transaction packet.","511.4");}return 0;};t.XT=function(p){var _m=H.message.service,_o=H.registry.service,a,i,o;if(t.isPacket(p)){if(p.is_open){a=p.participants;p.is_open=0;if(p.owner_id&&_o.isRegistered(p.owner_id)){o=_o.getObject(p.owner_id);o.endTransaction(t,p);}if(!p.owner_id||!p.bet){for(i in a){if(p.owner_id!=i){o=_o.getObject(i);if(o!=null){o.endTransaction(t,p);}else{_m.S("Null object reference "+i,"540.4");}}a[i]=0;}}p.sp=H.util.getDate();p.is_finalized=1;if(D.TF(p.handler))p.handler(t,p);}else{_m.S("Transaction packet is not open.","200.4");}}else{_m.S("Invalid transaction packet.","200.4");}};t.ST=function(p,o){var n,a=t.o.r,c;if(D.TO(p)){o.bst=1;v=o.participants[p.i]=(p.startTransaction(t,o)?1:0);o.participant_count+=v;}if(o.participant_count){o.st=H.util.getDate();o.is_open=1;return 1;}return 0;};t.closeTransaction=function(i){var _p=t.o,o,m,_m=H.message.service;o=t.getPacket(i);if(t.isPacket(o)){t.removePacket(m);}else{_m.S("Invalid packet id "+i,"200.4");}};t.newTransactionPacket=function(i,n,o,v,f){var p={packet_id:i,packet_name:n,participants:[],participant_count:0,packet_state:0,bst:0,btt:0,bet:0,serve_type:1,setBlockStartTransaction:
function(b){this.bst=(b?1:0);},setBlockServeTransaction:
function(b){this.btt=(b?1:0);},setBlockEndTransaction:
function(b){this.bet=(b?1:0);},setServeType:
function(i){this.btt=(!isNaN(i)?i:0);},st:0,sp:0,is_open:0,is_finalized:0,errors:0,owner_id:o,data:v,handler:f};H.prepareObject("transaction_packet","3.1.1",1,p);return p;};t.openTransaction=function(n,p,d,f){var i,o,c,_p=t.o,_s=t.p,_m=H.message.service;i=_s.l+":"+(++_s.c);if(D.TU(n))n=i;if(D.TU(d))d=0;if(D.TU(f))f=0;if(D.TO(p)){if(!t.isRegistered(p)){_m.S("Invalid transaction owner.","200.4");return 0;}}else p=0;if(D.TO(t.getPacketByName(n))&&t.getPacketByName(n).is_open){_m.S("Transaction "+n+" is already open.","200.4");return 0;}o=t.newTransactionPacket(i,n,p.i,d,f);t.addNewPacket(o,n,i);if(t.ST(p,o)){if(_s.a)t.serveTransaction(o);}else _m.S("Transaction "+n+" was not opened.","200.4");return i;};H.object.addObjectAccessor(t,"packet");H.prepareObject("transaction_service","3.1.1",1,t);t.r=4;}},1);}());
/* End Hemi Framework 3.1 */
