function Bs_FlipFlop(objectName) {
this._objectName = objectName;
this.buttonSelect;
this.buttonSelectAll;
this.buttonDeselect;
this.buttonDeselectAll;
this.fieldAvailableCssClass;
this.fieldSelectedCssClass;
this.textAvailable = 'Available:';
this.textAvailableCssClass;
this.textSelected = 'Selected:';
this.textSelectedCssClass;
this.showCaptionLine = false;
this.captionLineClass;
this.moveOnDblClick = true;
this.moveOnClick    = false;this.maxSelectedNumber;
this.maxSelectedWarning = 'No more than __maxSelectedNumber__ options can be selected.';this._renderTopToBottom = false;this.hiddenFieldName;this._fldAvailable;this._fldSelected;this._attachedEvents;this._lastOnClickOptionElm;this.constructor = function() {
this.buttonSelect = new Bs_Button();this.buttonSelect.objectName      = this._objectName + '_btnSel';this.buttonSelect.imgName         = 'bs_forward.gif';this.buttonSelect.title           = 'Select';this.buttonSelect.cssClassDefault = 'bsBtnMouseOver';this.buttonSelect.attachEvent(this._objectName + '.selectSelected();');this.buttonSelectAll = new Bs_Button();this.buttonSelectAll.objectName      = this._objectName + '_btnSelAll';this.buttonSelectAll.imgName         = 'bs_forforward.gif';this.buttonSelectAll.title           = 'Select All';this.buttonSelectAll.cssClassDefault = 'bsBtnMouseOver';this.buttonSelectAll.attachEvent(this._objectName + '.selectAll();');this.buttonDeselect = new Bs_Button();this.buttonDeselect.objectName      = this._objectName + '_btnDe';this.buttonDeselect.imgName         = 'bs_back.gif';this.buttonDeselect.title           = 'Deselect';this.buttonDeselect.cssClassDefault = 'bsBtnMouseOver';this.buttonDeselect.attachEvent(this._objectName + '.deselectSelected();');this.buttonDeselectAll = new Bs_Button();this.buttonDeselectAll.objectName      = this._objectName + '_btnDeAll';this.buttonDeselectAll.imgName         = 'bs_baback.gif';this.buttonDeselectAll.title           = 'Deselect All';this.buttonDeselectAll.cssClassDefault = 'bsBtnMouseOver';this.buttonDeselectAll.attachEvent(this._objectName + '.deselectAll();');}
this.convertField = function(elementId) {
var origFld = document.getElementById(elementId);this.hiddenFieldName = origFld.name;var s = new Bs_FormFieldSelect();s.init(origFld);var fldOne = '<select name="' + elementId + '_fldAvailable" id="' + elementId + '_fldAvailable" size="' + origFld.size + '" multiple';fldOne += ' onclick="' + this._objectName + '.onClickAvailable(this);"';fldOne += ' ondblclick="' + this._objectName + '.onDblClickAvailable();"';if (typeof(this.fieldAvailableCssClass) != 'undefined') {
fldOne += ' class="' + this.fieldAvailableCssClass + '"';}
fldOne += '>';var fldTwo = '<select name="' + elementId + '_fldSelected" id="' + elementId + '_fldSelected" size="' + origFld.size + '" multiple';fldTwo += ' onclick="' + this._objectName + '.onClickSelected(this);"';fldTwo += ' ondblclick="' + this._objectName + '.onDblClickSelected();"';if (typeof(this.fieldSelectedCssClass) != 'undefined') {
fldTwo += ' class="' + this.fieldSelectedCssClass + '"';}
fldTwo += '>';var defaultsArr = new Array;for (var i=0; i<origFld.options.length; i++) {
var key = origFld.getValueOrText(i);if (origFld.options[i].selected) {
defaultsArr[defaultsArr.length] = key;fldTwo += '<option value="' + key + '">' + origFld.options[i].text + '</option>';} else {
fldOne += '<option value="' + key + '">' + origFld.options[i].text + '</option>';}
}
fldOne += '</select>';fldTwo += '</select>';var out = '';out += '<table border="0" cellspacing="0" cellpadding="0"><tr><td valign="top"';if (typeof(this.textAvailableCssClass) != 'undefined') out += ' class="' + this.textAvailableCssClass + '"';out += '>';out += this.textAvailable;out += '</td><td>&nbsp;</td>';var textSelectedWithTd = '';textSelectedWithTd += '<td valign="top"';if (typeof(this.textSelectedCssClass) != 'undefined') textSelectedWithTd += ' class="' + this.textSelectedCssClass + '"';textSelectedWithTd += '>';textSelectedWithTd += this.textSelected;textSelectedWithTd += '</td>';if (!this._renderTopToBottom) {
out += textSelectedWithTd;}
out += '</tr><tr><td valign="top">';out += fldOne;out += '</td>';if (this._renderTopToBottom) out += '</tr><tr>';var buttonDivStyle = (this._renderTopToBottom) ? ' style="display:inline;"' : '';out += '<td align="center" valign="middle">';out += '<div id="' + elementId + '_btnSel"'    + buttonDivStyle + '></div>';out += '<div id="' + elementId + '_btnSelAll"' + buttonDivStyle + '></div>';out += '<div id="' + elementId + '_btnDe"'     + buttonDivStyle + '></div>';out += '<div id="' + elementId + '_btnDeAll"'  + buttonDivStyle + '></div>';out += '</td>';if (this._renderTopToBottom) out += '</tr><tr>';if (this._renderTopToBottom) {
out += textSelectedWithTd;out += '</tr><tr>';}
out += '<td valign="top">';out += fldTwo;out += '</td></tr>';if (this.showCaptionLine) {
out += '<tr><td colspan="3"';if (typeof(this.captionLineClass) != 'undefined') {
out += 'class="' + this.captionLineClass + '"';}
out += ' id="' + this._objectName + '_captionLine"';out += '>';out += '</td></tr>';}
out += '</table>';out += '<span id="' + this._objectName + '_hiddenFldSpan">';out += this._renderHiddenField(defaultsArr);out += '<span>';origFld.outerHTML = out;this._fldAvailable = document.getElementById(elementId + '_fldAvailable');this._fldSelected  = document.getElementById(elementId + '_fldSelected');s.init(this._fldAvailable);s.init(this._fldSelected);if (!this.moveOnClick) {
this.buttonSelect.drawInto(elementId + '_btnSel');eval(this._objectName + '_btnSel' + ' = ' + this._objectName + '.buttonSelect;');this.buttonDeselect.drawInto(elementId + '_btnDe');eval(this._objectName + '_btnDe' + ' = ' + this._objectName + '.buttonDeselect;');}
if (typeof(this.maxSelectedNumber) == 'undefined') {
this.buttonSelectAll.drawInto(elementId + '_btnSelAll');eval(this._objectName + '_btnSelAll' + ' = ' + this._objectName + '.buttonSelectAll;');this.buttonDeselectAll.drawInto(elementId + '_btnDeAll');eval(this._objectName + '_btnDeAll' + ' = ' + this._objectName + '.buttonDeselectAll;');}
}
this.getValue = function() {
return this._fldSelected.getAllKeys();}
this.selectSelected = function() {
this._fldAvailable.moveSelectedTo(this._fldSelected);this._updateHiddenField();}
this.selectAll = function() {
this._fldAvailable.moveAllTo(this._fldSelected);this._updateHiddenField();}
this.deselectSelected = function() {
this._fldSelected.moveSelectedTo(this._fldAvailable);this._updateHiddenField();}
this.deselectAll = function() {
this._fldSelected.moveAllTo(this._fldAvailable);this._updateHiddenField();}
this.moveAvailableOptionToSelected = function(optionValue) {
if (this.maxSelectionReached()) {
this.alertMaxSelectionWarning();} else {
var status = this._fldAvailable.moveTo(this._fldSelected, optionValue);this._updateHiddenField();return status;}
}
this.moveSelectedOptionToAvailable = function(optionValue) {
return this._fldSelected.moveTo(this._fldAvailable, optionValue);this._updateHiddenField();}
this.onClickAvailable = function() {
this._onClickAvailableOption();}
this.onClickSelected = function() {
this._onClickSelectedOption();}
this.onDblClickAvailable = function() {
if (this.moveOnDblClick) this.moveAvailableOptionToSelected(event.srcElement.value);}
this.onDblClickSelected = function() {
if (this.moveOnDblClick) this.moveSelectedOptionToAvailable(event.srcElement.value);}
this._onClickAvailableOption = function(b) {
if (b == true) {
try {
var srcElm = (!bs_isNull(event) && !bs_isNull(event.srcElement)) ? event.srcElement : this._lastOnClickOptionElm;var opt    = srcElm.options[srcElm.selectedIndex];if (this.showCaptionLine) {
document.getElementById(this._objectName + '_captionLine').innerHTML = opt.value;}
} catch (e) {
}
if (this.moveOnClick) {
this.moveAvailableOptionToSelected(srcElm.value);}
} else {
this._lastOnClickOptionElm = event.srcElement;setTimeout(this._objectName + '._onClickAvailableOption(true)', 50);return;}
}
this._onClickSelectedOption = function(b) {
if (b == true) {
try {
var srcElm = (!bs_isNull(event) && !bs_isNull(event.srcElement)) ? event.srcElement : this._lastOnClickOptionElm;var opt    = srcElm.options[srcElm.selectedIndex];if (this.showCaptionLine) {
document.getElementById(this._objectName + '_captionLine').innerHTML = opt.value;}
} catch (e) {
}
if (this.moveOnClick) {
this.moveSelectedOptionToAvailable(srcElm.value);}
} else {
this._lastOnClickOptionElm = event.srcElement;setTimeout(this._objectName + '._onClickSelectedOption(true)', 50);return;}
}
this.setRenderOrientation = function(upDown) {
this._renderTopToBottom = upDown;this.buttonSelect.imgName         = (this._renderTopToBottom) ? 'bs_down.gif'   : 'bs_forward.gif';this.buttonSelectAll.imgName      = (this._renderTopToBottom) ? 'bs_dodown.gif' : 'bs_foforward.gif';this.buttonDeselect.imgName       = (this._renderTopToBottom) ? 'bs_up.gif'     : 'bs_back.gif';this.buttonDeselectAll.imgName    = (this._renderTopToBottom) ? 'bs_upup.gif'   : 'bs_baback.gif';}
this.maxSelectionReached = function() {
return (this.howManySelected() >= this.maxSelectedNumber);}
this.alertMaxSelectionWarning = function() {
		alert(this.maxSelectedWarning.replace('__maxSelectedNumber__', this.maxSelectedNumber));
}
this.howManySelected = function() {
return this._fldSelected.options.length;}
this._renderHiddenField = function(defaultsArr) {
var ret = new Array;for (var i=0; i<defaultsArr.length; i++) {
ret[ret.length] = '<input type="hidden" name="' + this.hiddenFieldName + '" value="' + defaultsArr[i] + '">';}
return ret.join('');}
this._updateHiddenField = function() {
var defaultsArr = this._fldSelected.getAllKeys();var str         = this._renderHiddenField(defaultsArr);document.getElementById(this._objectName + '_hiddenFldSpan').innerHTML = str;}
this.attachEvent = function(trigger, yourEvent) {
if (typeof(this._attachedEvents) == 'undefined') {
this._attachedEvents = new Array();}
if (typeof(this._attachedEvents[trigger]) == 'undefined') {
this._attachedEvents[trigger] = new Array(yourEvent);} else {
this._attachedEvents[trigger][this._attachedEvents[trigger].length] = yourEvent;}
}
this.hasEventAttached = function(trigger) {
return (this._attachedEvents && this._attachedEvents[trigger]);}
this.fireEvent = function(trigger) {
if (this._attachedEvents && this._attachedEvents[trigger]) {
var e = this._attachedEvents[trigger];if ((typeof(e) == 'string') || (typeof(e) == 'function')) {
e = new Array(e);}
for (var i=0; i<e.length; i++) {
if (typeof(e[i]) == 'function') {
var status = e[i](this);} else if (typeof(e[i]) == 'string') {
var status = eval(e[i]);}
if (status == false) return false;}
}
return true;}
this.constructor();}
