YAHOO.namespace('squarecompare');

YAHOO.squarecompare.formatNumber = function(num,dec,thou,pnt,curr1,curr2,n1,n2) {var x = Math.round(num * Math.pow(10,dec));if (x >= 0) n1=n2='';var y = (''+Math.abs(x)).split('');var z = y.length - dec; if (z<0) z--; for(var i = z; i < 0; i++) y.unshift('0');y.splice(z, 0, pnt); if(y[0] == pnt) y.unshift('0'); while (z > 3) {z-=3; y.splice(z,0,thou);}var r = curr1+n1+y.join('')+n2+curr2;return r;};

YAHOO.squarecompare.formatCurrency = function(num, dec) {
	return YAHOO.squarecompare.formatNumber(num, dec, ',', dec==0 ? '' : '.', '$', '', '(', ')');
};

YAHOO.squarecompare.parseFloat = function(text) {
	var newText = text.replace(/[^0-9\.]/g, '');
	return parseFloat(newText);
};

YAHOO.squarecompare.shorten = function(text, maxLength) {
	if (text===null || text===undefined) {
		result = null;
	}
	else if (text.length>maxLength) {
		preferredSize = maxLength-'...'.length;
		if (preferredSize>0) {
			if (text.length<preferredSize) {
				result = text;
			}
			else {
				result = text.substring(0, preferredSize) + '...';
			}
		}
		else {
			if (text.length<maxLength) {
				result = text;
			}
			else {
				result = text.substring(0, maxLength);
			}
		}
	}
	else {
		result = text;
	}
	return result;
};

YAHOO.squarecompare.DataTable = function(options) {

	var _private = {};
	var _public = {};

	_private.buildFullQueryString = function(state, dataTable) {
		return _private.buildQueryString(state.recordOffset, state.rowsPerPage);
	};

	_private.buildQueryString = function(offset, limit) {
        var paramString = '&ck=161';

        for (var i=0; i<options.filterInputs.length; i++) {
        	paramString += '&';
        	paramString += options.filterInputs[i].paramName;
        	paramString += '=';
        	if (options.filterInputs[i].getValueFunc) {
        		paramString += options.filterInputs[i].getValueFunc();
        	}
        	else if (YAHOO.lang.isArray(options.filterInputs[i].input)) {
        		var filterValue = '';
        		for (var j=0; j<options.filterInputs[i].input.length; j++) {
        			if (options.filterInputs[i].input[j].checked) {
        				filterValue += (filterValue==='' ? '' : ',') + options.filterInputs[i].input[j].value;
        			}
        		}
        		paramString += filterValue;
        	}
        	else if (options.filterInputs[i].input.type=='checkbox') {
        		paramString += options.filterInputs[i].input.checked ? 1 : 0;
        	}
        	else {
        		paramString += options.filterInputs[i].input.value;
        	}
        }

		return 'step=' + options.getDataStep + paramString;
	};

	_private.initFlaggedProducts = function() {
		_private.flaggedProducts = {};
		if (options.userId) {
			var postData = 'step=get-user-products&options.userId=' + options.userId;
			var request = YAHOO.util.Connect.asyncRequest('POST', '/service/index.jsp', {
				success: function(o) {
					var results = YAHOO.lang.JSON.parse(o.responseText);
					for (var i=0; i<results.records.length; i++) {
						_private.flaggedProducts[results.records[i].ProductId] = results.records[i].Flagged;
					}
					var a = 1;
				}
			}, postData);
		}
	};

	_private.listenForFilterInputChanges = function() {
	    for (var i=0; i<options.filterInputs.length; i++) {
	    	if (YAHOO.lang.isArray(options.filterInputs[i].input)) {
	    		for (var j=0; j<options.filterInputs[i].input.length; j++) {
	    			YAHOO.util.Event.addListener(options.filterInputs[i].input[j], 'click', function(e) {
	    				_public.requery();
	    			});
	    		}
	    	}
	    	else if (options.filterInputs[i].input && options.filterInputs[i].input.tagName.toLowerCase()=='select') {
	    		YAHOO.util.Event.addListener(options.filterInputs[i].input, 'change', function(e) {
	    			_public.requery();
	    		});
	    	}
	    	else {
	    		YAHOO.util.Event.addListener(options.filterInputs[i].input, 'click', function(e) {
	    			_public.requery();
	    		});
	    	}
	    }
	};

	_private.buildFormatters = function(customFormatters) {
		var defaultFormatters = {
			flagged: function(elLiner, oRecord, oColumn, oData) {
				var productId = oRecord.getData(options.keyFieldName);
				var flagged = _private.flaggedProducts[productId];
				elLiner.innerHTML = flagged ? '<img src="/ext/silk/icons/flag_yellow.png" width="12" height="12">' : '';
				YAHOO.util.Dom.setStyle(elLiner, 'text-align', 'center');
			},
			checked: function(elLiner, oRecord, oColumn, oData) {
				var value = oRecord.getData(oColumn)[oColumn.key];
				elLiner.innerHTML = value==1 ? '<img src="/ext/silk/icons/accept.png" width="12" height="12">' : '';
				YAHOO.util.Dom.setStyle(elLiner, 'text-align', 'center');
			},
			// http://www.squarecompare.com/c/<productQueryId>-<syndicateSiteId>-<categoryId>-<merchantSiteId>-<productId>-<productListingTypeId>
		    merchantSiteName: function(elLiner, oRecord, oColumn, oData) {
				var merchantSiteId = oRecord.getData('MerchantSiteId');
				var merchantSiteName = oRecord.getData('MerchantSiteName');
				var productId = oRecord.getData(options.keyFieldName);
				var enhancedListingRecord = _private.enhancedListingRecordByProductId[productId];
				var productListingTypeId = (enhancedListingRecord ? 2 : 1);
				var listingPage = _private.paginator.getCurrentPage() || 1;
				var listingRowsPerPage = _private.paginator.getRowsPerPage();
				var listingPosition = (_private.dataTable.getRecordIndex(oRecord) % listingRowsPerPage) + 1;
				elLiner.innerHTML = '<a href="/pc/' + _private.productQueryId + '-' + options.layoutRef +'-' + options.syndicateSiteId + '-' + options.categoryId + '-' + merchantSiteId + '-' + productId + '-' + productListingTypeId + '/' + listingRowsPerPage + '-' + listingPage + '-' + listingPosition + '/" target="_blank">' + merchantSiteName + '</a>';
			},
			text: function(elLiner, oRecord, oColumn, oData) {
				var rawText = oRecord.getData(oColumn)[oColumn.key];
	        	var field = _private.fieldByName[oColumn.key];
	        	if (rawText!==null && field!==null) {
	        		if (field.maxLength) {
	        			var newText = YAHOO.squarecompare.shorten(rawText, field.maxLength);
	        			if (newText===null || newText===undefined) {
	        				elLiner.innerHTML = '';
	        			}
	        			else if (newText.length<rawText.length) {
	        				elLiner.innerHTML = '<span title="' + rawText + '">' + newText + '</span>';
	        			}
	        			else {
	        				elLiner.innerHTML = newText;
	        			}
	        		}
	        		else {
	        			elLiner.innerHTML = rawText;
	        		}
	        	}
			},
			number: function(elLiner, oRecord, oColumn, oData) {
		    	var rawNumber = oRecord.getData(oColumn)[oColumn.key];
		    	if (rawNumber!==null && rawNumber!==undefined) {
		        	var field = _private.fieldByName[oColumn.key];

		        	var formattedNumber;
		        	var toolTipText;
		    		if (field.magicValues) {
		    			var magicValue = field.magicValues[rawNumber];
		    			if (magicValue) {
			    			var magicValueParts = magicValue.split('|');
			    			formattedNumber = magicValueParts[0];
			    			if (magicValueParts.length>1) {
			    				toolTipText = magicValueParts[1];
			    			}
		    			}
		    		}
		    		if (!formattedNumber) {
		    			formattedNumber = YAHOO.squarecompare.formatNumber(rawNumber, field.numberDecimals, ',', field.numberDecimals===0 ? '' : '.', field.numberPrefix, field.numberSuffix, '(', ')');
		    		}
					elLiner.innerHTML = formattedNumber;
					YAHOO.util.Dom.setStyle(elLiner, 'text-align', 'right');

					if (toolTipText) {
						YAHOO.util.Dom.addClass(elLiner, 'info-icon');
						elLiner.setAttribute('title', toolTipText);
					}
		    	}
		    	else {
					elLiner.innerHTML = 'n/a';
					YAHOO.util.Dom.setStyle(elLiner, 'text-align', 'center');
		    	}
		    }
		};
		if (customFormatters) {
			return YAHOO.lang.merge(defaultFormatters, customFormatters);
		}
		else {
			return defaultFormatters;
		}
	};

	_private.initFields = function() {
	    _private.dataTableColumnDefs = [];
	    _private.calculatedFields = [];
	    _private.fieldNames = [];
		_private.fieldByName = {};

		var formatters = _private.buildFormatters(options.customFormatters);

		for (var i=0; i<options.fields.length; i++) {
			_private.fieldNames[_private.fieldNames.length] = options.fields[i].name;
			_private.fieldByName[options.fields[i].name] = options.fields[i];

			if (!options.fields[i].internal) {
				var dataTableColumnDef = {};
				dataTableColumnDef.key = options.fields[i].name;
				dataTableColumnDef.label = options.fields[i].title;
				if (options.initialGroup && options.fields[i].group && options.initialGroup!=options.fields[i].group) {
					dataTableColumnDef.hidden = true;
				}
				if (options.fields[i].sortable) {
					dataTableColumnDef.sortable = options.fields[i].sortable;
				}
				if (options.fields[i].sizable) {
					dataTableColumnDef.sizable = options.fields[i].sizable;
				}
				if (options.fields[i].width) {
					dataTableColumnDef.width = options.fields[i].width + 'px';
				}
				if (options.fields[i].formatter) {
					dataTableColumnDef.formatter = formatters[options.fields[i].formatter];
				}
				if (options.fields[i].calculationFunc) {
					_private.calculatedFields[_private.calculatedFields.length] = options.fields[i];
				}
				dataTableColumnDef.resizable = true;
				_private.dataTableColumnDefs[_private.dataTableColumnDefs.length] = dataTableColumnDef;
			}
		}
	};

	_private.initDataSource = function() {
	    _private.dataSource = new YAHOO.util.DataSource('/service/index.jsp?');
	    _private.dataSource.responseType   = YAHOO.util.DataSource.TYPE_JSON;
	    _private.dataSource.responseSchema = {
	        resultsList : 'records',
	        fields      : _private.fieldNames,
	        metaFields : {
	            totalRecords: 'totalRecords',
	            productQueryId: 'productQueryId'
	        }
	    };
	    if (_private.calculatedFields.length>0) {
		    _private.dataSource.subscribe('responseParseEvent', function(o) {
		    	for (var i=0; i<o.response.results.length; i++) {
		    		var result = o.response.results[i];
		    		for (var j=0; j<_private.calculatedFields.length; j++) {
		    			var value = _private.calculatedFields[j].calculationFunc(_private.inputs, result);
		    			result[_private.calculatedFields[j].name] = value;
		    		}
		    	}
		    });
	    }
	};

	_private.initPaginator = function() {
	    if (YAHOO.widget.Paginator) {
	    	var template = '<div>';
	    	template += '<div style="float:right">';
	    	template += '{PreviousPageLink} {PageLinks} {NextPageLink}';
	    	if (options.showRowsPerPage) {
	    		template += ' {RowsPerPageDropdown}';
	    	}
	    	template += '</div>';
	    	template += '<h2>Results';
	    	if (options.showResultsDropDownLink) {
	    		template += ' <a id="results-drop-down-link" class="drop-down-link" href="#"><img src="/img/drop-down-14x13.gif" width="14" height="13"></a>';
	    	}
	    	template += '</h2>';
	    	template += '</div>';

			_private.paginator = new YAHOO.widget.Paginator({
				containers         : [options.paginatorId || 'paginator'],
				pageLinks          : 10,
				rowsPerPage        : options.initialRows,
				rowsPerPageOptions : [options.initialRows, 100],
		    	template           : template
			});
	    }
	    else {
	    	_private.paginator = null;
	    }
	};

	_private.initRowFormatter = function() {
		_private.rowFormatter = function(elTr, oRecord) {
			var productId = oRecord.getData(options.keyFieldName);
			var enhancedListingRecord = _private.enhancedListingRecordByProductId[productId];
		    if (enhancedListingRecord) {
		    	var recordIndex = _private.dataTable.getRecordIndex(oRecord);
		        YAHOO.util.Dom.addClass(elTr, (recordIndex % 2) == 1 ? 'enhanced-listing-odd' : 'enhanced-listing-even');
		    }
		    else {
		    	YAHOO.util.Dom.removeClass(elTr, 'enhanced-listing-odd');
		    	YAHOO.util.Dom.removeClass(elTr, 'enhanced-listing-even');
		    }
		    return true;
		};

	};

	_private.initDataTable = function() {
		var dataTableConfig = {
			initialRequest         : _private.buildQueryString(0, options.initialRows),
	        generateRequest        : _private.buildFullQueryString,
			paginationEventHandler : YAHOO.widget.DataTable.handleDataSourcePagination,
	    	paginator              : _private.paginator,
	    	draggableColumns       : true,
	    	formatRow              : _private.rowFormatter,
	    	sortedBy               : options.defaultSort
		};
		_private.dataTable = new YAHOO.widget.DataTable(options.dataTableId || 'data-table', _private.dataTableColumnDefs, _private.dataSource, dataTableConfig);

		_private.dataTable.sortColumn = function(oColumn, sDir) {
			if(oColumn && (oColumn instanceof YAHOO.widget.Column)) {
		        if(!oColumn.sortable) {
		            Dom.addClass(this.getThEl(oColumn), YAHOO.widget.DataTable.CLASS_SORTABLE);
		        }

		        // Validate given direction
		        if(sDir && (sDir !== YAHOO.widget.DataTable.CLASS_ASC) && (sDir !== YAHOO.widget.DataTable.CLASS_DESC)) {
		            sDir = null;
		        }

		        // Get the sort dir
		        var sSortDir = sDir || this.getColumnSortDir(oColumn);

		        var ok = this.doBeforeSortColumn(oColumn, sSortDir);
		        if(ok) {
                    // Get the field to sort
                    var sField = (oColumn.sortOptions && oColumn.sortOptions.field) ? oColumn.sortOptions.field : oColumn.field;

                    var sortFnc = function(a, b, desc) {
                        if(!YAHOO.lang.isValue(a)) {
                            return (!YAHOO.lang.isValue(b)) ? 0 : 1;
                        }
                        else if(!YAHOO.lang.isValue(b)) {
                            return -1;
                        }

                        var aEnhancedListing = _private.enhancedListingRecordByProductId[a.getData(options.keyFieldName)];
                        var bEnhancedListing = _private.enhancedListingRecordByProductId[b.getData(options.keyFieldName)];
                        if (aEnhancedListing && bEnhancedListing) {
                        	var aEnhancedListingScore = aEnhancedListing.getData('EnhancedListingScore');
                        	var bEnhancedListingScore = bEnhancedListing.getData('EnhancedListingScore');
                        	var returnValue = YAHOO.util.Sort.compare(aEnhancedListingScore, bEnhancedListingScore, YAHOO.widget.DataTable.CLASS_ASC);
                        	return returnValue==0 ? YAHOO.util.Sort.compare(a.getData(sField), b.getData(sField), desc) : returnValue;
                        }
                        else if (aEnhancedListing) {
                        	return -1;
                        }
                        else if (bEnhancedListing) {
                        	return 1;
                        }
                        else {
                        	return YAHOO.util.Sort.compare(a.getData(sField), b.getData(sField), desc);
                        }
                    };

                    this._oRecordSet.sortRecords(sortFnc, ((sSortDir == YAHOO.widget.DataTable.CLASS_DESC) ? true : false));

	                // Reset to first page if paginated
	                var oPaginator = this.get('paginator');
	                if (oPaginator) {
	                    // Set page silently, so as not to fire change event.
	                    oPaginator.setPage(1,true);
	                }

	                // Update UI via sortedBy
	                this.render();
	                this.set("sortedBy", {key:oColumn.key, dir:sSortDir, column:oColumn});

		            this.fireEvent("columnSortEvent",{column:oColumn,dir:sSortDir});
		            return;
		        }
		    }
		};

		_private.dataTable.doBeforeSortColumn = function(oColumn, sSortDir) {
			// Determine best enhanced listing per merchant site id
			var enhancedListingRecordByMerchantSiteId = {};
			var recordSet = _private.dataTable.getRecordSet();
			for (var i=0; i<recordSet.getLength(); i++) {
				var record = recordSet.getRecord(i);
				var merchantSiteListingTypeId = record.getData('MerchantSiteListingTypeId');
				if (merchantSiteListingTypeId==2) {
					var feePerClickTypeId = record.getData('FeePerClickTypeId');
					if (options.allowDirectBid || feePerClickTypeId==1) {
						var merchantSiteId = record.getData('MerchantSiteId');
						var existingRecord = enhancedListingRecordByMerchantSiteId[merchantSiteId];
						if (
							!existingRecord
							|| (sSortDir===YAHOO.widget.DataTable.CLASS_DESC && existingRecord.getData(oColumn.key)<record.getData(oColumn.key))
							|| (sSortDir===YAHOO.widget.DataTable.CLASS_ASC && existingRecord.getData(oColumn.key)>record.getData(oColumn.key))
						) {
							enhancedListingRecordByMerchantSiteId[merchantSiteId] = record;
						}
					}
				}
			}

			// Sort the enhanced listings
			var topEnhancedListingMerchantSiteIds = [];
			for (var merchantSiteId in enhancedListingRecordByMerchantSiteId) {
				var insertIndex = null;
				var curEnhancedListingScore = enhancedListingRecordByMerchantSiteId[merchantSiteId].getData('EnhancedListingScore');
				for (var i=0; i<topEnhancedListingMerchantSiteIds.length; i++) {
					var topMerchantSiteId = topEnhancedListingMerchantSiteIds[i];
					var topEnhancedListingScore = enhancedListingRecordByMerchantSiteId[topMerchantSiteId].getData('EnhancedListingScore');
					if (curEnhancedListingScore>topEnhancedListingScore) {
						insertIndex = i;
						break;
					}
				}
				if (insertIndex===null) {
					topEnhancedListingMerchantSiteIds[topEnhancedListingMerchantSiteIds.length] = merchantSiteId;
				}
				else {
					topEnhancedListingMerchantSiteIds.splice(insertIndex, 0, merchantSiteId);
				}
			}

			// Remove all but the top 3 listings
			_private.enhancedListingRecordByProductId = {};
			var length = topEnhancedListingMerchantSiteIds.length > 3 ? 3 : topEnhancedListingMerchantSiteIds.length;
			for (var i=0; i<length; i++) {
				var merchantSiteId = topEnhancedListingMerchantSiteIds[i];
				var enhancedListingRecord = enhancedListingRecordByMerchantSiteId[merchantSiteId];
				var productId = enhancedListingRecord.getData(options.keyFieldName);
				_private.enhancedListingRecordByProductId[productId] = enhancedListingRecord;
			}

			return true;
		};

		_private.dataTable.handleDataReturnPayload = function (oRequest, oResponse, oPayload) {
            var sortedBy = _private.dataTable.get('sortedBy') || options.defaultSort;
            var column = _private.dataTable.getColumn(sortedBy.key);
			_private.dataTable.sortColumn(column, sortedBy.dir);

			_private.productQueryId = oResponse.meta.productQueryId;
			_private.skipNextPostRender = true;

		    return oPayload;
		};

		_private.dataTable.subscribe('rowMouseoverEvent', function(e) {
			_private.dataTable.onEventHighlightRow(e);
		});
	    _private.dataTable.subscribe('rowMouseoutEvent', function(e) {
	        _private.dataTable.onEventUnhighlightRow(e);
	    });
	    _private.dataTable.subscribe('cellClickEvent', function(oArgs) {
	    	var column = _private.dataTable.getColumn(oArgs.target);
	    	if (column.key=='Flagged') {
		    	var record = _private.dataTable.getRecord(oArgs.target);

		    	var productId = record.getData(options.keyFieldName);

		    	var curFlagged = _private.flaggedProducts[productId];
		    	var newFlagged = curFlagged==1 ? 0 : 1;

		    	_private.flaggedProducts[productId] = newFlagged;

		    	var data = record.getData();
		    	_private.dataTable.updateRow(record, data);

		    	var postData = 'step=flag-user-product&productId=' + productId + '&flagged=' + newFlagged;
				var request = YAHOO.util.Connect.asyncRequest('POST', '/service/index.jsp', null, postData);
	    	}
	    });
	    _private.dataTable.subscribe('postRenderEvent', function(o) {
	    	if (_private.skipNextPostRender) {
	    		_private.skipNextPostRender = false;
	    	}
	    	else {
	    		// Setup toolTips
	    		var existingToolTip = YAHOO.util.Dom.get('my-tool-tip');
	    		if (existingToolTip) {
	    			existingToolTip.parentNode.removeChild(existingToolTip);
	    		}
	    		var tooltipElements = YAHOO.util.Selector.query('.info-icon');
	    		var toolTip = new YAHOO.widget.Tooltip("my-tool-tip", {monitorresize: false, context:tooltipElements});

	    		// Record product views
	    		var tbodyEl = _private.dataTable.getTbodyEl();

		    	var productViews = [];
		    	for (var i=0; i<tbodyEl.childNodes.length; i++) {
		    		var trEl = tbodyEl.childNodes[i];
		    		var record = _private.dataTable.getRecord(trEl);
					var productId = record.getData(options.keyFieldName);
					var enhancedListingRecord = _private.enhancedListingRecordByProductId[productId];
					var productListingTypeId = (enhancedListingRecord ? 2 : 1);
					var productView = {
			    			ProductId: productId,
			    			ProductListingTypeId: productListingTypeId
		    		};
		    		productViews[productViews.length] = productView;
		    	}

		    	var postData = 'step=register-product-set-view';
				postData += '&categoryId=' + options.categoryId;
				postData += '&layoutRef=' + options.layoutRef;
				postData += '&listingRowsPerPage=' + _private.paginator.getRowsPerPage();
				postData += '&listingPage=' + (_private.paginator.getCurrentPage() || 1);
				postData += '&productQueryId=' + _private.productQueryId;
				postData += '&productViews=' + YAHOO.lang.JSON.stringify(productViews);
				var request = YAHOO.util.Connect.asyncRequest('POST', '/service/index.jsp', {}, postData);
	    	}
	    });
	};

	_private.resizeDataTable = function() {
		var bdContentEl = YAHOO.util.Dom.get('bd-content');
		var bdContentRegion = YAHOO.util.Dom.getRegion(bdContentEl);
		var bdContentWidth = (bdContentRegion.right-bdContentRegion.left);

		var dataTableInputsEl = YAHOO.util.Dom.get('data-table-options-list');
		if (YAHOO.util.Dom.getStyle('data-table-options', 'display')=='none') {
			var dataTableInputsWidth = 0;
			var gap = 0;
		}
		else {
			var dataTableInputsRegion = YAHOO.util.Dom.getRegion(dataTableInputsEl);
			var dataTableInputsWidth = (dataTableInputsRegion.right-dataTableInputsRegion.left);
			var gap = 15;
		}

		var dataTableResultsEl = YAHOO.util.Dom.get('data-table-results');

		var dataTableResultsWidth = bdContentWidth-dataTableInputsWidth-gap;

		YAHOO.util.Dom.setStyle(dataTableResultsEl, 'width', dataTableResultsWidth + 'px');
	};

	_private.init = function() {

	    _private.inputs = options.initialInputs || {};
		_private.enhancedListingRecordByProductId = {};

		_private.initFlaggedProducts();

		_private.initFields();

		_private.initDataSource();

		_private.initPaginator();

		_private.initRowFormatter();

		_private.initDataTable();

	    _private.listenForFilterInputChanges();

	    _private.resizeDataTable();
	};

	_private.init();

	_public.setInput = function(key, value) {
		_private.inputs[key] = value;
	};

	_public.requery = function() {
		var queryString = _private.buildFullQueryString(_private.paginator, _private.dataTable);
		_private.dataSource.sendRequest(queryString, function(sRequest, oResponse, oPayload) {
			_private.dataTable.onDataReturnInitializeTable(sRequest, oResponse, oPayload);
			if (_private.paginator) {
				_private.paginator.set('totalRecords', parseInt(oResponse.meta.totalRecords, 10));
			}
		}, _private.dataTable);
	};

	_public.showColumnGroup = function(group) {
	    for (var i=0; i<_private.fieldNames.length; i++) {
	    	var fieldName = _private.fieldNames[i];
	    	var field = _private.fieldByName[fieldName];
	    	if (field.group) {
	    		if (field.group==group) {
	    			_private.dataTable.showColumn(fieldName);
	    		}
	    		else {
	    			_private.dataTable.hideColumn(fieldName);
	    		}
	    	}
	    }
	};

	return _public;
};
