The Gravey 2.0 Framework and AIM RIA

aimbidders.js

Summary

Collection of application level classes.
This collection implements the rich-internet-application tier of the Bidders Module for AIM (Auction Inventory Management), which is a demonstration of the Gravey framework.

Version: 2.0

Requires:

Author: Bruce Wallace (PolyGlotInc.com)


Class Summary
Bidder This class encapsulates an Auction Bidder record.
BidderModel This class encapsulates the data model of a particular Bidder.
BidderModelView This class produces the view of the entire data panel.
BidderSelectionModel This class encapsulates the data model for "which Bidder is currently selected".
BidderSummary This class encapsulates the identifying attributes of an Auction Bidder.
BidderView This class produces a view of a Bidder.
BSCEDO This is the abstract base class for Bidder/Shipping/Contact EDOs.
BSCIndex This class encapsulates an EDO index for Bidder/Shipping/Contact.
Contact This class encapsulates a Bidder "contact" record.
ContactListView This class produces a view of a List of Contact EDOs.
ContactView This class produces a view of a Contact.
Shipping This class encapsulates a Bidder "Shipping" record.
ShippingListView This class produces a view of a List of Shipping EDOs.
ShippingView This class produces a view of a Shipping.

// This file uses JSDoc-friendly comments [ http://jsdoc.sourceforge.net/ ]

/**
 * @file         aimbidders.js
 * @fileoverview Collection of application level classes.<br/>
 * This collection implements the rich-internet-application tier of
 * the Bidders Module for AIM (Auction Inventory Management),
 * which is a demonstration of the Gravey framework.
 * @author       Bruce Wallace  (PolyGlotInc.com)
 * @requires     grvEDO.js
 * @requires     grvAJAX.js
 * @version      2.0
 */

////////////////////////////////////////////
//////////// Domain Objects ////////////////
////////////////////////////////////////////

Class(BidderSummary,["unique Key","Company Name","FICO Code","lot count","inactive flag"])
.Extends(EDOHolderSelectionItem);
/**
 * @class This class encapsulates the identifying attributes of an Auction Bidder.
 * @extends EDOHolderSelectionItem
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function BidderSummary()
{
	/** @param {int} theKey primary key of this record
	 *  @param {String} coName Bidder's company name
	 *  @param {String} fico Bidder's FICO code
	 *  @param {int} lotCount count of lots attached to this Bidder
	 *  @param {boolean} inactive no-longer-active flag
	 */
	this.konstructor = function( theKey, coName, fico, lotCount, inactive )
	{
		// define instance variables
		this.key	= theKey;
		this.coName	= coName;
		this.fico	= fico;
		this.count  = lotCount;
		this.dead   = inactive;
	}

	/** return "this" formatted for main menu item @type String */
	this.getDescription = function() {
		return grvDiamond(!this.dead)+this.coName;
	}

	/** return "this" as human-readable string @type String */
	this.toString = function()
	{
		var		s = new Array();
				s.push( this.key );
				s.push( this.coName );
				s.push( this.fico );
				s.push( this.dead );
		return	s.join( "-" );
	}

	/** set name to given value */
	this.updateProperties = function( bsum ){
		this.key	= bsum.key;
		this.coName	= bsum.coName;
		this.fico	= bsum.fico;
		this.count  = bsum.count;
		this.dead   = bsum.dead;
	}
}


Class(BSCIndex).Extends(EDOIndex);
/**
 * @class This class encapsulates an EDO index for Bidder/Shipping/Contact.
 * @extends EDOIndex
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function BSCIndex()
{
  if (!BSCIndex.Bidder){//keep this line above jsdoc comments!
	/** Static factory method to generate Bidder-flavored index
	 * @param {int} index Bidder index
	 * @type BSCIndex
	 */
	BSCIndex.Bidder = function() {
		return new BSCIndex(0,null,null);
	}
	/** Static factory method to generate Shipping-flavored index
	 * @param {int} index Shipping index
	 * @type BSCIndex
	 */
	BSCIndex.Shipping = function( index ) {
		return new BSCIndex(0,index,null);
	}
	/** Static factory method to generate Contact-flavored index
	 * @param {int} index Contact index
	 * @type BSCIndex
	 */
	BSCIndex.Contact = function( index ) {
		return new BSCIndex(0,null,index);
	}
  }

	/** @param {int} optB index into Bidders  list for current Auction
	 *  @param {int} optS index into Shipping list for specified Bidder
	 *  @param {int} optC index into contacts list for specified Bidder
	 * If args not specified or if all are null then this represents "no selection".
	 */
	this.konstructor = function( optB,optS,optC )
	{
		// define instance variables
		this.b = optB===undefined ? null : optB;
		this.s = optS===undefined ? null : optS;
		this.c = optC===undefined ? null : optC;
	}

	/** return "this" as event handler arg list string @type String */	
	this.asEventArgs = function() {
		return " new BSCIndex("+this.b+","+this.s+","+this.c+") ";
	}

	this.asString = function() {
		return this.invoke( this, this._noString, this._shpString, this._conString )
		     + this._bidString( this.b );
	}

	this._noString = function(){ return ""; }

	/** return Bidder description @type String */
	this._bidString = function( bindex ){ 
		var b = gBidderData._getBidder( bindex );
		return (b && b[ kStrIdCompany ]) ? b[ kStrIdCompany ] : "New Bidder";
	}
	/** return contact description @type String */
	this._conString = function( cindex ){
		cindex -= 0; //type cast to int
		return "Contact["+(cindex+1)+"] of ";
	}
	/** return Shipping description @type String */
	this._shpString = function( sindex ){
		sindex -= 0; //type cast to int
		return "Shipping["+(sindex+1)+"] of ";
	}

	/** return whether "this" contains a selection @type boolean */
	this.hasSelection = function(){ return this.b!=null
	                                    || this.s!=null
	                                    || this.c!=null; }
	
	/** return whether "this" equals given EDOIndex @type boolean */
	this.equals = function(x){
		return x ? (this.b==x.b && this.s==x.s && this.c==x.c) : false;
	}

	/** Invoke the appropriate method given the index type and
	 * return its result. Methods are expected to have the signature<pre>
	 * self.method(this.subindex,optionalArgument)
	 *</pre>
	 * @param {Object} self the parent object of the method
	 * @param {Function} bMethod method to call if xi is Bidder   type
	 * @param {Function} sMethod method to call if xi is Shipping type
	 * @param {Function} cMethod method to call if xi is Contact  type
	 * @param {Object} optArg optional extra param to pass to method
	 * @return the result of the called method
	 */
	this.invoke = function(self,bMethod,sMethod,cMethod,optArg){
		var aMethod;
		var i;
		if (this.s!=null) { aMethod = sMethod; i = this.s; } else
		if (this.c!=null) { aMethod = cMethod; i = this.c; } else
                          { aMethod = bMethod; i = this.b; }
		return aMethod.call( self, i, optArg );
	}

}

////////////////////////////////////////////////////////////////////////////////
// Constants defining property names for the Bidder/contact/Shipping properties
////////////////////////////////////////////////////////////////////////////////

var kStrIdCompany  = 'Company';
var kCodeIdFICO    = 'FICO';
var kBoolInactive  = 'Inactive?';
var kStrIdName     = 'Contact Person';
var kStrIdWireInst = 'Wiring Instructions';
var kAddrIdStreet  = 'Street';
var kAddrIdState   = 'State';
var kAddrIdCity    = 'City';
var kAddrIdZip     = 'Zip';
var kPhoneIdMain   = 'Phone';
var kPhoneIdFax    = 'Fax';
var kEMailIdAddr   = 'EMail Address';


Class(BSCEDO,["parent BidderModel","lot count",
	"edo Class","property values array",
	"edit Date","edit User","unique Key"])	
.Extends(EDO);
/**
 * @class This is the abstract base class for Bidder/Shipping/Contact EDOs.
 * @extends EDO
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function BSCEDO()
{
	/** 
	 *  @param {BidderModel} holder parent EDOHolderModel
	 *  @param {int} lotcount how many Lots are linked to this
	 *  @param {Function} CLAZZ this EDO's "class"
	 *  @param {array}  propValues array of property initial values
	 *  @param {String} editDate date of last edit
	 *  @param {String} editUser ID of last user to edit
	 *  @param {int} theKey unique key of this record
	 *  @param {int} optEditStatus optional edit status where the
	 * status codes are: 0=no-change; 1=delete; 2=create; 3=hidden; 4=update
	 *  @param {String} optName optional name of this instance
	 */
	this.konstructor = function
	(
		holder,
		lotcount,
		CLAZZ,
		propValues,
		editDate,
		editUser,
		theKey,
		optEditStatus,
		optName
	){
		this.souper( CLAZZ, holder, propValues, editDate, editUser,
					theKey, optEditStatus, optName );

		// define instance variables
		this.lotCount = lotcount;
	}

	this.toolTip = function( xi ){
		return this.edoToolTip(xi) + " Lots="+this.lotCount;
	}

	this.toString = function() {
		return this[ kStrIdCompany ];
	}

	this.canDelete = function()
	{
		if (!this.isActive())
		  return "This is already deleted.";

		var c = this.lotCount;
		if (c>0)
		  return "This can't be deleted. It is referenced by "
		            +c+" Lot"+(c==1?".":"s.");

		return null;
	}

	/** push into given array all BSCEDO-specific fields of the UpdateItem message
	 * formatted as<pre>
	 * "{parentBidderName}~{property1}~...~{propertyN}"
	 * where the fields are defined as follows...
	 *     {parentBidderName} = "my" parent Bidder company name
	 *     {propertyI}        = the i-th editable property of this EDO
	 *</pre>
	 * @param {Array} uFields  string array containing Update Msg fields
	 */
	this.pushUpdateFields = function( uFields )
	{
		uFields.push( encodeURIComponent(this.holder.getName()) );
		this.pushEncodedValues( uFields );
	}
}

Class(Bidder,["property values array","edit Date","edit User",
			 "unique Key","parent Bidder","lot count"])
.Extends(BSCEDO);
/**
 * @class This class encapsulates an Auction Bidder record.
 * @extends BSCEDO
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function Bidder()
{
	// init "static" Class methods/elements
	if (!Bidder.Properties) {//keep this line above jsdoc comments!

		/** Static factory method to generate blank Bidder @type Bidder */
		Bidder.Factory = function(index,holder) {
			var x = new Bidder( null, grvGetTodayAsMMDDYYYY(),kUserID,null,holder,0 );
			x[ kCodeIdFICO ] = 0;
			return x;
		}

		// init static member variables
		Bidder.UpdateID   = "Bidder";
		Bidder.Properties = [ kStrIdCompany, kCodeIdFICO, kBoolInactive ];
		Bidder.EditRules  = [ MVCEditRule.kReqd, MVCEditRule.kAlNo, MVCEditRule.kBOOL ];
	}

	/** @param {array} array of editable property values in same order as .Properties
	 *  @param {String} editDate date of last edit
	 *  @param {String} editUser ID of last user to edit
	 *  @param {int} theKey unique key of this record
	 *  @param {BidderModel} holder parent EDOHolderModel
	 *  @param {int} lotcount how many Lots are linked to this
	 *  @param {int} optEditStatus optional edit status
	 *  @param {String} optName optional name of this instance
	 */
	this.konstructor = function
	( propArray, editDate, editUser, theKey, holder, lotcount, optEditStatus, optName )
	{
		this.souper( holder, lotcount, Bidder,
		 propArray, editDate, editUser,	theKey, optEditStatus, optName );
	}

	/** return a clone of this object @type Bidder */
	this.clone = function() {
		return new Bidder( this.propValues(), this.date, this.whom,
			this.key, this.holder, this.lotCount, this.editStatus );
	}

	this.canCreate = function(appendFlag) {
	  return this.holder.isTrue()
		 ? "Can't add a new Bidder until pending changes have been saved"
		 : null;
	}

	/** If created, can we undo creation? @type boolean
	 * @param {boolean} appendFlag if true then append else insert
	 */
	this.canUncreate = function(appendFlag){ return false; }//override me
}

////////////////////////////////////////////////////////////////////////////////

Class(Contact,["property values array","edit Date","edit User",
			   "unique Key","parent Bidder","lot count"])
.Extends(BSCEDO);
/**
 * @class This class encapsulates a Bidder "contact" record.
 * @extends BSCEDO
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function Contact()
{
	// init "static" Class methods/elements
	if (!Contact.Properties) {//keep this line above jsdoc comments!

		/** Static factory method to generate blank Contact @type Contact */
		Contact.Factory = function(index,holder) {
		return new Contact( null,grvGetTodayAsMMDDYYYY(),kUserID,null,holder,0 );
		}

		// init static member variables
		Contact.UpdateID   = "Contact";
		Contact.Properties = [
				kStrIdName, kPhoneIdMain, kPhoneIdFax, kAddrIdStreet,
				kAddrIdCity, kAddrIdState, kAddrIdZip, kEMailIdAddr,
				kStrIdWireInst ];
		Contact.EditRules  = [
				MVCEditRule.kEdit, MVCEditRule.kFone, MVCEditRule.kFone, MVCEditRule.kEdit,
				MVCEditRule.kAlfa, MVCEditRule.kAlfa, MVCEditRule.kZip, MVCEditRule.kEdit,
				MVCEditRule.kEdit ];
	}

	/** @param {array} array of editable property values in same order as .Properties
	 *  @param {String} editDate date of last edit
	 *  @param {String} editUser ID of last user to edit
	 *  @param {int} theKey unique key of this record
	 *  @param {BidderModel} holder parent EDOHolderModel
	 *  @param {int} lotcount how many Lots are linked to this
	 *  @param {int} optEditStatus optional edit status
	 *  @param {String} optName optional name of this instance
	 */
	this.konstructor = function
	( propArray, editDate, editUser, theKey, holder, lotcount, optEditStatus, optName )
	{
		this.souper( holder, lotcount, Contact,
		 propArray, editDate, editUser, theKey, optEditStatus, optName );
	}

	/** return a clone of this object @type Contact */
	this.clone = function() {
		return new Contact( this.propValues(), this.date, this.whom,
			this.key, this.holder, this.lotCount, this.editStatus );
	}

	this.toString = function() {
		return this[ kStrIdName ];
	}
}

////////////////////////////////////////////////////////////////////////////////

Class(Shipping,["property values array","edit Date","edit User",
				"unique Key","parent Bidder","lot count"])
.Extends(BSCEDO);
/**
 * @class This class encapsulates a Bidder "Shipping" record.
 * @extends BSCEDO
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function Shipping()
{
	// init "static" Class methods/elements
	if (!Shipping.Properties) {//keep this line above jsdoc comments!

		/** Static factory method to generate blank Shipping @type Shipping */
		Shipping.Factory = function(index,holder) {
		return new Shipping( null,grvGetTodayAsMMDDYYYY(),kUserID,null,holder,0 );
		}

		// init static member variables
		Shipping.UpdateID   = "Shipping";
		Shipping.Properties = [
				kStrIdName, kPhoneIdMain, kPhoneIdFax, kAddrIdStreet,
				kAddrIdCity, kAddrIdState, kAddrIdZip, kEMailIdAddr,
				kStrIdCompany ];
		Shipping.EditRules  = [
				MVCEditRule.kEdit, MVCEditRule.kFone, MVCEditRule.kFone, MVCEditRule.kEdit,
				MVCEditRule.kAlfa, MVCEditRule.kAlfa, MVCEditRule.kZip, MVCEditRule.kEdit,
				MVCEditRule.kEdit ];
	}

	/** @param {array} array of editable property values in same order as .Properties
	 *  @param {String} editDate date of last edit
	 *  @param {String} editUser ID of last user to edit
	 *  @param {int} theKey unique key of this record
	 *  @param {BidderModel} holder parent EDOHolderModel
	 *  @param {int} lotcount how many Lots are linked to this
	 *  @param {int} optEditStatus optional edit status
	 *  @param {String} optName optional name of this instance
	 */
	this.konstructor = function
	( propArray, editDate, editUser, theKey, holder, lotcount, optEditStatus, optName )
	{
		this.souper( holder, lotcount, Shipping,
		 propArray, editDate, editUser,	theKey, optEditStatus, optName );
	}

	/** return a clone of this object @type Shipping */
	this.clone = function() {
		return new Shipping( this.propValues(), this.date, this.whom,
			this.key, this.holder, this.lotCount, this.editStatus );
	}
}

////////////////////////////////////////////
////////////// Data Models /////////////////
////////////////////////////////////////////

Class(BidderModel,["Bidder Selection Model"]).Extends(EDOHolderModel);
/**
 * @class This class encapsulates the data model of a particular Bidder.
 * This model subscribes to a {@link BidderSelectionModel}
 * so that new Contact and Shipping lists can be downloaded whenever
 * a new Bidder is selected.
 * <p>NOTE: Other parts of AIM assume that the Contact and Shipping
 * lists will never be null; zero items is ok though.</p>
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function BidderModel()
{
	/** @param {BidderSelectionModel} BidderSelectionModel model of which Bidder is selected
	 *  @param {String} optName optional name of this instance
	 */
	this.konstructor = function( BidderSelectionModel, optName )
	{
		// init static DOM (must do this here instead of above!)
		if (!BidderModel.LoadXslDOM) BidderModel.LoadXslDOM = grvGetXslDOM( kXSLPath+"AIMbidToJS.xsl" );
		var holderName = optName ? optName : "Bidder";
		this.souper( BidderSelectionModel, BidderModel.LoadXslDOM, holderName );

		// init instance variables
		this._resetEDOs();
	}

	/** return the parent Bidder name for this model @type String */
	this.getName = function(){
		return this.bidder ? this.bidder[kStrIdCompany] : null;
	}

	/** return the parent Bidder isInactive flag @type boolean */
	this.inactive = function(){
		return this.bidder ? this.bidder[kBoolInactive] : null;
	}

	/** return whether any EDOs are changed for this model @type boolean */
	this.isDirty = function()
	{
		if (this.bidder && this.bidder.inEdit()) return true;
		if (this.cList.isDirty()) return true;
		if (this.sList.isDirty()) return true;
		return false;
	}

	/** return whether all EDOs are valid for this model @type boolean */
	this.isValid = function()
	{
		if (!this.bidder || !this.bidder.isValid()) return false;

		//special case: if we are deleting Bidder then other errs dont matter
		if (this.bidder.isDeleted()) return true;

		if (!this.cList.isValid()) return false;
		if (!this.sList.isValid()) return false;
		return true;
	}

	/** clear EDOs */
	this._resetEDOs = function( optBidder )
	{
		this.bidder = optBidder ? optBidder : null;

		if ( this.cList ) this.cList.reset();
		else this.cList = new EDOListModel( Contact );

		if ( this.sList ) this.sList.reset();
		else this.sList = new EDOListModel( Shipping );
	}

	/** set our Bidder object   but dont publish */
	this._setBidder = function(o){ this.bidder = o; }

	/** get a new Contacts list @type MVCListModel */
	this._newContacts  = function(){ return this.cList.reset(); }
	/** get a new Shipping list @type MVCListModel */
	this._newShipping = function(){ return this.sList.reset(); }

	/** return the debug details of "this" @type String */
	this.dump = function()
	{
		var		dStr = new Array();
				dStr.push( "BidderModel>>>[" );
				dStr.push( "Bidder="+(this.bidder?this.bidder.dump():"null") );
				dStr.push( "conts=" +(this.cList ?this.cList .dump():"null") );
				dStr.push( "ships=" +(this.sList ?this.sList .dump():"null") );
				dStr.push( "]" );
		return	dStr.join("\n");
	}

	/** create a new item for the selection list from current EDO
	 * @type EDOHolderSelectionItem
	 */
	this.createSelectionItem = function() {
		return new BidderSummary( this.bidder.key,
								  this.bidder[kStrIdCompany],
								  this.bidder[kCodeIdFICO],
								  0,
								  this.bidder[kBoolInactive] );
	}
	/** return the updated properties from the current EDO needed for select list update
	 * @return arbitrary value as needed @type Object
	 */
	this.getUpdatedProperty = function() {
		return this.createSelectionItem();
	}

	/** return whether there is currently an EDO @type boolean */
	this.hasEDO = function(){ return this.bidder!=null; }

	/** return whether current EDO matches selection item "key"
	 * @type boolean
	 * @param {EDOHolderSelectionItem} item selection menu item
	 */
	this.keysMatch = function(item){ return this.bidder.key==item.key; }

	/** return whether current EDO matches selection item "properties"
	 * @type boolean
	 * @param {EDOHolderSelectionItem} item selection menu item
	 */
	this.propMatch = function(item){ return this.getName ()==item.coName
										&&  this.inactive()==item.dead; }

	/** push into given array all AJAX SAVE Post params for this model
	 * @param {Array} posts  string array containing POST params
	 */
	this.pushPosts = function( posts )
	{
		this.bidder.pushPosts( posts );	//THIS **MUST** BE FIRST!!
		this.cList.pushPosts( posts );
		this.sList.pushPosts( posts );
	}

	/** return a new blank EDO of the type implied by EDOIndex @type EDO
	 * @param {EDOIndex} xi edo index
	 */
	this._newEDO = function(xi) { 
		return xi.invoke( this, Bidder.Factory, Shipping.Factory, Contact.Factory, this );
	}

	/** return the specified contact @type Contact
	 * @param {int} i index into contact list
	 */
	this._getContact = function( i ) {
	  return (i!=null && i>=0
	          && i<this.cList.getCount())
				 ? this.cList.getItem( i ) : null;
	}
	/** return the specified Shipping @type Shipping
	 * @param {int} i index into Shipping list
	 */
	this._getShipping = function( i ) {
	  return (i!=null && i>=0
	          && i<this.sList.getCount())
				 ? this.sList.getItem( i ) : null;
	}
	/** return the specified Bidder @type Bidder
	 * @param {int} i index into Bidder list
	 */
	this._getBidder = function( i ) {
	  return (i==0 && this.bidder)
	                ? this.bidder : null;
	}
	/** return reference to the specified editable domain object
	 * @param {BSCIndex} xi edo index
	 */
	this.getEDO  = function(xi){
		return xi.invoke( this, this._getBidder, this._getShipping, this._getContact );
	}

	/** insert a new Contact
	 * @param {int} i contact list index
	 * @param {EDO} edo the contact
	 */
	this._insertContact = function( i, edo ) {
	    this.cList.addBefore( i, edo );
	}
	/** insert a new Shipping
	 * @param {int} i Shipping list index
	 * @param {EDO} edo the Shipping
	 */
	this._insertShipping = function( xi ) {
	    this.sList.addBefore( i, edo );
	}
	/** create new EDO which is inserted after selected EDO
	 * @return EDOIndex of new EDO
	 * @type EDOIndex
	 * @param {EDOIndex} xi edo index
	 */
	this.createEDO = function(xi){
		xi.invoke( this, this._newBidder, this._insertShipping, this._insertContact, this.newEDO(xi) );
		return xi;
	}

	/** append a new Contact
	 * @return EDOIndex of new EDO
	 * @type EDOIndex
	 * @param {int} i contact list index
	 * @param {EDO} edo the contact
	 */
	this._appendContact = function( i, edo ) {
	    return BSCIndex.Contact( this.cList.addItem( edo ) );
	}
	/** append a new Shipping
	 * @return EDOIndex of new EDO
	 * @type EDOIndex
	 * @param {int} i Shipping list index
	 * @param {EDO} edo the Shipping
	 */
	this._appendShipping = function( i, edo ) {
	    return BSCIndex.Shipping( this.sList.addItem( edo ) );
	}
	/** create a new Bidder
	 * @return EDOIndex of new EDO
	 * @type EDOIndex
	 * @param {int} i Bidder list index
	 * @param {EDO} edo the Bidder
	 */
	this._newBidder = function( i, edo ) {
		//HACK!
		this._resetEDOs( edo );
		this.updateStamp();
		return BSCIndex.Bidder();
	}
	/** create new EDO which is appended at end of EDO list
	 * @return EDOIndex of new EDO
	 * @type EDOIndex
	 * @param {EDOIndex} xi edo index
	 */
	this.appendEDO = function(xi){
		return xi.invoke( this, this._newBidder, this._appendShipping, this._appendContact, this.newEDO(xi) );
	}

	/** toggle the "expanded" flag of the specified EDOs.
	 * @param {boolean} doAllFlag if true, set all of the EDOs to new value
	 * @param {EDOIndex} xi edo index
	 */
	this.toggleExpand = function( doAllFlag, xi )
	{
		var edo = this.getEDO(xi);
		if (doAllFlag)
		{
			var newVal = !edo.isExpanded();
			this.cList.toggleExpandAll( newVal );
			this.sList.toggleExpandAll( newVal );
			this.bidder.toggleExpand  ( newVal );
		}
		else edo.toggleExpand();
		this.updateStamp();
	}
}


Class(BidderSelectionModel,["BidderSummary List Model"]).Extends(EDOHolderSelectionModel);
/**
 * @class This class encapsulates the data model for
 * "which Bidder is currently selected".
 * @extends EDOHolderSelectionModel
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function BidderSelectionModel()
{
	/** @param {ListModel} listModel {@link BidderSummary} list */
	this.konstructor = function( listModel ){
		this.souper( listModel, "Bidder " );
	}

	/** Return the list index of the specified Bidder or <0 if not found. @type int */
 	this.findBidder = function( bidderName, bidderKey )
	{
		var list = this.model;
		var N    = list.getCount();
		if (N<1) return -2;//NO DATA IN Bidder SUMMARY LIST!!

		for (var i=0; i<N; ++i)
		  if (list.getItem(i).coName == bidderName
		  ||  list.getItem(i).key    == bidderKey) return i;

		return -1;
	}

	/** Select the "initially selected" EDOHolder<br>
	 * @param {boolean} selectFirst if selection critera has no match then
	 * if selectFirst==true then select the first in list
	 *                      else leave selection alone 
	 */
 	this.selectInitial = function( selectFirst )
	{
		var i = this.findBidder( kBidderName, kBidderKey );
		if (i==-2){ this.selectNothing(); return; }//EMPTY LIST!!
		if (i>= 0){ this.select(i);       return; }//found it
		if (selectFirst) this.select(0);
	}
}

////////////////////////////////////////////
////////////// Controllers /////////////////
////////////////////////////////////////////


////////////////////////////////////////////
////////////// Data Views  /////////////////
////////////////////////////////////////////

Class(BidderView,["Bidder object"])
.Extends(EDOView);
/**
 * @class This class produces a view of a {@link Bidder}.
 * @extends EDOView
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function BidderView()
{
	/** @param {Bidder} bidder Bidder we are to observe
	 */
	this.konstructor = function( bidder ) {
		this.souper( bidder, BSCIndex.Bidder() );
	}

	this.preSelect = function() {
		this.sharedMenuSelect( gFICOSelected, kCodeIdFICO );
	}

	this.buildFields = function( HTML )
	{
		HTML.push( this.buildStrField( kStrIdCompany, 50, 50, false ) );
		HTML.push( this.buildPopField( kCodeIdFICO  ,         false, gFICOSelected ) );
		HTML.push( this.buildBoxField( kBoolInactive,         false ) );
	}
}

Class(ContactView,["Contact object","EDOIndex of Contact"])
.Extends(EDOView);
/**
 * @class This class produces a view of a {@link Contact}.
 * @extends EDOView
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function ContactView()
{
	/** @param {Contact} edo EDO we are to observe
	 *  @param {EDOIndex} edoIndex index to EDO
	 */
	this.konstructor = function( edo, edoIndex ) {
		this.souper( edo, edoIndex );
	}

	this.buildFields = function( HTML )
	{
		HTML.push( this.buildStrField( kStrIdName   ,50,50,false) );
		HTML.push( this.buildStrField( kAddrIdStreet,50,80,true ) );
		HTML.push( this.buildStrField( kPhoneIdMain ,20,20,false) );
		HTML.push( this.buildStrField( kAddrIdCity  ,20,50,true ) );
		HTML.push( this.buildStrField( kPhoneIdFax  ,20,20,false) );
		HTML.push( this.buildUprField( kAddrIdState , 2, 2,true ) );
		HTML.push( this.buildStrField( kEMailIdAddr ,50,80,false) );
		HTML.push( this.buildStrField( kAddrIdZip   ,10,10,true ) );
		HTML.push( this.buildTxtField( kStrIdWireInst,2,100,255,false,2 ) );
	}
}

Class(ShippingView,["Shipping object","EDOIndex of Shipping"])
.Extends(EDOView);
/**
 * @class This class produces a view of a {@link Shipping}.
 * @extends EDOView
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function ShippingView()
{
	/** @param {Shipping} edo EDO we are to observe
	 *  @param {EDOIndex} edoIndex index to EDO
	 */
	this.konstructor = function( edo, edoIndex ) {
		this.souper( edo, edoIndex );
	}

	this.buildFields = function( HTML )
	{
		HTML.push( this.buildStrField( kStrIdCompany,50,50,true  ) );
		HTML.push( this.buildStrField( kStrIdName   ,50,50,false ) );
		HTML.push( this.buildStrField( kAddrIdStreet,50,80,true  ) );
		HTML.push( this.buildStrField( kPhoneIdMain ,20,20,false ) );
		HTML.push( this.buildStrField( kAddrIdCity  ,20,50,true  ) );
		HTML.push( this.buildStrField( kPhoneIdFax  ,20,20,false ) );
		HTML.push( this.buildUprField( kAddrIdState , 2, 2,true  ) );
		HTML.push( this.buildStrField( kEMailIdAddr ,50,80,false ) );
		HTML.push( this.buildStrField( kAddrIdZip   ,10,10,false ) );
	}
}


Class(ContactListView,["EDO ListModel"])
.Extends(EDOListView);
/**
 * @class This class produces a view of a List of Contact EDOs.
 * @extends EDOListView
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function ContactListView()
{
	/** @param {EDOListModel} edoListModel EDO list we are to observe
	 */
	this.konstructor = function( edoListModel ) {
		this.souper( edoListModel, ContactView );
	}

	this.itemEDOIndex = function( index ) {
		return  BSCIndex.Contact( index );
	}
}

Class(ShippingListView,["EDO ListModel"])
.Extends(EDOListView);
/**
 * @class This class produces a view of a List of Shipping EDOs.
 * @extends EDOListView
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function ShippingListView()
{
	/** @param {EDOListModel} edoListModel EDO list we are to observe
	 */
	this.konstructor = function( edoListModel ) {
		this.souper( edoListModel, ShippingView );
	}

	this.itemEDOIndex = function( index ) {
		return BSCIndex.Shipping( index );
	}
}


Class(BidderModelView,["Bidder data model"])
.Extends(EDOHolderView);
/**
 * @class This class produces the view of the entire data panel.
 * @extends EDOHolderView
 * @see #konstructor
 * @author Bruce Wallace  (PolyGlotInc.com)
 * @version 2.0
 */
function BidderModelView()
{
	/** @param {BidderModel} bidModel Bidder Contacts/Shippings we are to observe */
	this.konstructor = function( bidModel ) {
		this.souper( bidModel );
	}

	this.buildFields = function( HTML )
	{
	  var vwID = this.getWidgetID();

	  if ( !this.model.bidder || this.model.bidder.inLimbo() )
	  {
		if (!grvWAITING())
		HTML.push( EDOView.ShellHTML( BSCIndex.Bidder(), Bidder ) );
	  }
	  else if ( this.model.bidder.isActive() )
      {
		HTML.push( this.embedHTML( vwID+".bidWdgt",
						new       BidderView( this.model.bidder ) ) );
 
		HTML.push( this.embedHTML( vwID+".coWdgt",
		                new  ContactListView( this.model.cList ) ) );

		HTML.push( this.embedHTML( vwID+".svWdgt",
		                new ShippingListView( this.model.sList ) ) );
      }
      else HTML.push( '<thead>This Bidder is deleted. You must Cancel, Save, or Undo.</thead>' );
	}
}

The Gravey 2.0 Framework and AIM RIA

Documentation generated by JSDoc on Sat Dec 8 21:51:03 2007