<?xml version="1.0" encoding="UTF-8"?>
<config title="cars">

<!--  <DBURL>jdbc:mysql://localhost:3306/test?user=mylogin&amp;password=mypwd</DBURL> -->
  <DBURL>jdbc:derby:databases/derby/testdb;create=false</DBURL>

  <fromClause>car_car5</fromClause>

  <preferencesAllowed>true</preferencesAllowed>
  <prospectiveAnalysisDisplayed>false</prospectiveAnalysisDisplayed>
  <conflictAnalysisDisplayed>true</conflictAnalysisDisplayed>
  <exampleDisplayed>true</exampleDisplayed>
  <contextualToolTipDisplayed>false</contextualToolTipDisplayed>
  <constraintStringFunctionsEnabled>false</constraintStringFunctionsEnabled>

  <itemTableRendererClassName>external.CarItemTableRenderer</itemTableRendererClassName>
  <criteriaPanelWidth>425</criteriaPanelWidth>

<!--	     withConstraintStringFunction = "multipleValuesWithText('', 'selected Brands');"-->

  <!-- BRAND =========================================================================================== -->
  <attribute id="sMarke" label="Brand" helpPrompt="Car brand"

	     defaultConstraintIndex="1">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="INCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="EXCLUDE"/></constraint>
  </attribute>


  <!-- MODEL =========================================================================================== -->
  <attribute id="sModell" label="Model" helpPrompt="Car model"
	     withConstraintStringFunction = "multipleValuesWithText('', 'selected Models');"
	     defaultConstraintIndex="1">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="INCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="EXCLUDE"/></constraint>
  </attribute>

  
  <!-- MODEL TYPE =========================================================================================== -->
  <attribute id="sTyp" label="Model Type" helpPrompt="Car model type"
	     withConstraintStringFunction = "multipleValuesWithText('', 'selected Model Types');"
	     defaultConstraintIndex="1">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="INCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="EXCLUDE"/></constraint>
  </attribute>


  <!-- CURRENT PRICE =========================================================================================== -->
  <attribute id="iPreisVerkauf" label="Current price" type="number" defaultConstraintType="lessThanOrEqual" helpPrompt="The selling price for this second-hand car"
	     valueStringFunction = "utils.toInt(valueId) + ' CHF'"

	     withConstraintStringFunction  = "numberWithText(utils.toInt(valueId), 
					      'for ', ' CHF or less',   'for ', ' CHF or more',   'for ', ' CHF')"

	     relaxConstraintStringFunction = "numberRelaxText(utils.toInt(valueId), 
					      'maximum selling price to ', ' CHF',   'minimum selling price to ', ' CHF')"
     defaultConstraintIndex="1">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="EQUAL" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="LESS_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="LESS" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="MORE_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="MORE" offsetFraction="0.4"/></cconfig>
    </constraint>
  </attribute>


  <!-- ORIGINAL PRICE =========================================================================================== -->
  <attribute id="iPreisTotal" label="Original price" type="number" defaultConstraintType="lessThanOrEqual" helpPrompt="The selling price at new, including the accesoris"
	     valueStringFunction="utils.toInt(valueId) + ' CHF'"

	     withConstraintStringFunction = "numberWithText(utils.toInt(valueId),
					     'for ', ' CHF or less at new',   'for ', ' CHF or more at new',   'for ', ' CHF at new')"

	     relaxConstraintStringFunction = "numberRelaxText(utils.toInt(valueId),
					      'maximum original price to ', ' CHF',   'minimum original price to ', ' CHF')"

	     defaultConstraintIndex="1">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="EQUAL" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="LESS_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="LESS" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="MORE_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="MORE" offsetFraction="0.4"/></cconfig>
    </constraint>
  </attribute>



  <!-- 1ST MATRICULATION =========================================================================================== -->
  <attribute id="iInverkehrsetzung" label="1st matriculation" type="number" defaultConstraintType="moreThanOrEqual" helpPrompt="When should be the car first matriculated"
	     valueStringFunction="utils.compactYearMonth(valueId)"

	     withConstraintStringFunction = "numberWithText(utils.compactYearMonth(valueId),
					     'matriculated in ', ' or before',   'matriculated in ', ' or afterwards',   'matriculated in ', '')"

	     relaxConstraintStringFunction = "numberRelaxText(utils.compactYearMonth(valueId),
					      'matriculated in ', ' or before',   'matriculated in ', ' or afterwards')"

	     defaultConstraintIndex="2">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="EQUAL" offsetFraction="0.0011"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="LESS_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="LESS" offsetFraction="0.0011"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="MORE_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="MORE" offsetFraction="0.0011"/></cconfig>
    </constraint>
  </attribute>


  <!-- MILEAGE =========================================================================================== -->
  <attribute id="iKilometer" label="Mileage" type="number" defaultConstraintType="lessThanOrEqual" helpPrompt="Mileage in km"
	     valueStringFunction="utils.toInt(valueId) + ' km'"

	     withConstraintStringFunction = "numberWithText(utils.toInt(valueId),
					     '', ' km or less',   '', ' km or more',   'with ', ' km')"

	     relaxConstraintStringFunction = "numberRelaxText(utils.toInt(valueId),
					      'to ', ' km or less',   'to ', ' km or more')"

	     defaultConstraintIndex="1">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="EQUAL" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="LESS_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="LESS" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="MORE_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="MORE" offsetFraction="0.4"/></cconfig>
    </constraint>
  </attribute>


  <!-- CATEGORY =========================================================================================== -->
  <attribute id="iAufbau" label="Category" helpPrompt="Car category: cabrio, coupe, limousine, sedan"
	     withConstraintStringFunction = "multipleValuesWithText('', 'selected Categories');"
	     defaultConstraintIndex="1">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="INCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="EXCLUDE"/></constraint>
  </attribute>


  <!-- FUEL TYPE =========================================================================================== -->
  <attribute id="iTreibstoffart" label="Fuel type" helpPrompt="Fuel type: diesel or gasoline"
	     withConstraintStringFunction = 'valueId'>
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
  </attribute>


  <!-- TRANSMISSION =========================================================================================== -->
  <attribute id="iGetriebeart" label="Transmission" helpPrompt="Type of transmission: manual or automatic"
	     withConstraintStringFunction = 'valueId + " transmission"'>
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
  </attribute>


  <!-- NBR OF SEATS =========================================================================================== -->
  <attribute id="iSitzplaetze" label="Nbr of seats" type="number" helpPrompt="Number of seats"
	     valueStringFunction="utils.toInt(valueId) + ' seats'"
	     withConstraintStringFunction = "firstNotNull([
                                               'basicNumberWithText(utils.toInt(valueId), \'seats\')',
					       'multipleValuesWithText(\' seats\', \'selected Nbr of Seats\')']);"

	     relaxConstraintStringFunction = "basicNumberRelaxText(utils.toInt(valueId), 'seats')"
	     defaultConstraintIndex="0">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="INCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="EXCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="LESS_THAN_OR_EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="MORE_THAN_OR_EQUAL"/></constraint>
  </attribute>


  <!-- NBR OF DOORS =========================================================================================== -->
  <attribute id="iTueren" label="Nbr of doors" type="number" helpPrompt="Number of doors"
	     valueStringFunction="utils.toInt(valueId) + ' doors'"
	     withConstraintStringFunction = "firstNotNull([
                                               'basicNumberWithText(utils.toInt(valueId), \'doors\')',
					       'multipleValuesWithText(\' doors\', \'selected Nbr of doors\')']);"

	     relaxConstraintStringFunction = "basicNumberRelaxText(utils.toInt(valueId), 'doors')"
	     defaultConstraintIndex="0">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="INCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="EXCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="LESS_THAN_OR_EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="MORE_THAN_OR_EQUAL"/></constraint>
  </attribute>


  <!-- PERFORMANCE =========================================================================================== -->
  <attribute id="iLeistungPS" label="Performance" type="number" defaultConstraintType="moreThanOrEqual" helpPrompt="Performance in hp"
	     valueStringFunction="utils.toInt(valueId) + ' hp'"
	     withConstraintStringFunction = "basicNumberWithText(utils.toInt(valueId), 'hp')"
	     relaxConstraintStringFunction = "basicNumberRelaxText(utils.toInt(valueId), 'hp')"
	     defaultConstraintIndex="2">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="EQUAL" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="LESS_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="LESS" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="MORE_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="MORE" offsetFraction="0.4"/></cconfig>
    </constraint>
  </attribute>



  <!-- CUBIC CAPACITY =========================================================================================== -->
  <attribute id="iHubraum" label="Cubic capacity" type="number" defaultConstraintType="moreThanOrEqual" helpPrompt="Cubic capacity in ccm"
	     valueStringFunction="utils.toInt(valueId) + ' ccm'"
	     withConstraintStringFunction = "basicNumberWithText(utils.toInt(valueId), 'ccm')"
	     relaxConstraintStringFunction = "basicNumberRelaxText(utils.toInt(valueId), 'ccm')"
	     defaultConstraintIndex="2">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="EQUAL" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="LESS_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="LESS" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="MORE_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="MORE" offsetFraction="0.4"/></cconfig>
    </constraint>
  </attribute>


  <!-- NBR OF CYLINDERS =========================================================================================== -->
  <attribute id="iZylinder" label="Nbr of cylinders" type="number" defaultConstraintType="moreThanOrEqual" helpPrompt="Number of cylinders"
	     valueStringFunction="utils.toInt(valueId) + ' cylinders'"
	     withConstraintStringFunction = "basicNumberWithText(utils.toInt(valueId), 'cylinders')"
	     relaxConstraintStringFunction = "basicNumberRelaxText(utils.toInt(valueId), 'cylinders')"
	     defaultConstraintIndex="2">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="EQUAL" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="LESS_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="LESS" offsetFraction="0.4"/></cconfig>
    </constraint>

    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui">
      <cconfig type="MORE_THAN_OR_EQUAL" penaltyClassName="ecatalog.db.SimpleShapePenaltyFunction"><pconfig type="MORE" offsetFraction="0.4"/></cconfig>
    </constraint>
  </attribute>


  <!-- NBR OF CYLINDERS =========================================================================================== -->
  <attribute id="iAussenfarbe" label="Colour" helpPrompt="Exterior Colour"
	     withConstraintStringFunction = "multipleValuesWithText('', 'selected colours');"
	     defaultConstraintIndex="1">
    <constraint className="ecatalog.gui.criteriaSelection.SimpleAttributeConstraintGui"><cconfig type="EQUAL"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="INCLUDE"/></constraint>
    <constraint className="ecatalog.gui.criteriaSelection.MultipleValuesConstraintGui"><cconfig type="EXCLUDE"/></constraint>
  </attribute>


  <!-- BOOLEAN ATTRIBUTES =========================================================================================== -->


  <attribute id="iAussenfarbeMetallic" label="Metallic Colour" type="boolean" helpPrompt="Metallic Exterior Colour"
	     withConstraintStringFunction ="booleanWithText('metallic colour');"/>


  <attribute id="iRawOptionHatABS" label="ABS" type="boolean" helpPrompt="ABS"
	     withConstraintStringFunction ="booleanWithText('ABS');"/>

  <attribute id="iRawOptionHatAirbag" label="Airbag" type="boolean" helpPrompt="Airbag"
	     withConstraintStringFunction ="booleanWithText('airbag');"/>

  <attribute id="iRawOptionHatKlimaanlage" label="Air conditioning" type="boolean" helpPrompt="Air conditioning"
	     withConstraintStringFunction ="booleanWithText('air conditioning');"/>

  <attribute id="iRawOptionHatAlarm" label="Alarm" type="boolean" helpPrompt="Alarm"
	     withConstraintStringFunction ="booleanWithText('alarm');"/>

  <attribute id="iRawOptionHatCD" label="CD" type="boolean" helpPrompt="CD"
	     withConstraintStringFunction ="booleanWithText('CD');"/>

  <attribute id="iRawOptionHatZentralverriegelung" label="Central locking" type="boolean" helpPrompt="Central locking"
	     withConstraintStringFunction ="booleanWithText('central locking');"/>

  <attribute id="iRawOptionHatElektrischeSitze" label="Electric seats" type="boolean" helpPrompt="Electric seats to adjust the position"
	     withConstraintStringFunction ="booleanWithText('electric seats');"/>

  <attribute id="iRawOptionHatElektrischeFenster" label="Electric windows" type="boolean" helpPrompt="Electric windows"
	     withConstraintStringFunction ="booleanWithText('electric windows');"/>

  <attribute id="iRawOptionHatNebellampen" label="Fog lamps" type="boolean" helpPrompt="Fog lamps"
	     withConstraintStringFunction ="booleanWithText('fog lamps');"/>

  <attribute id="iRawOptionHatSitzheizung" label="Heating seats" type="boolean" helpPrompt="Heating seats"
	     withConstraintStringFunction ="booleanWithText('seat heating');"/>

  <attribute id="iRawOptionHatLeder" label="Leather interior" type="boolean" helpPrompt="Leather interior"
	     withConstraintStringFunction ="booleanWithText('leather interior');"/>

  <attribute id="iRawOptionHatNavigationssystem" label="Navigation system" type="boolean" helpPrompt="Navigation system"
	     withConstraintStringFunction ="booleanWithText('navigation system');"/>

  <attribute id="iRawOptionHatServolenkung" label="Power steering" type="boolean" helpPrompt="Power steering"
	     withConstraintStringFunction ="booleanWithText('power steering');"/>

<!--
  <attribute id="iRawOptionHatRadioKassette" label="Radio cassette" type="boolean" helpPrompt="Radio cassette"
	     withConstraintStringFunction ="booleanWithText('radio cassette');"/>
-->

  <attribute id="iRawOptionHatTempomat" label="Speed control" type="boolean" helpPrompt="Speed control"
	     withConstraintStringFunction ="booleanWithText('speed control');"/>

  <attribute id="iRawOptionHatSportfahrwerk" label="Sport chasis" type="boolean" helpPrompt="Sport chasis"
	     withConstraintStringFunction ="booleanWithText('sport chasis');"/>

  <attribute id="iRawOptionHatSonnendach" label="Sun roof" type="boolean" helpPrompt="Sun roof"
	     withConstraintStringFunction ="booleanWithText('sun roof');"/>

  <attribute id="iRawOptionHatWegfahrsperre" label="Theft prevention" type="boolean" helpPrompt="Electronic theft prevention"
	     withConstraintStringFunction ="booleanWithText('theft prevention');"/>

  <attribute id="iRawOptionHatTraktionskontrolle" label="Traction control" type="boolean" helpPrompt="Traction control"
	     withConstraintStringFunction ="booleanWithText('traction control');"/>

  <attribute id="iRawOptionHatXenonlicher" label="Xenon lights" type="boolean" helpPrompt="Xenon lights"
	     withConstraintStringFunction ="booleanWithText('xenon lights');"/>


  <attribute id="id" label="id" defaultConstraintIndex="-1"/>>

  <!-- <attribute id="id" label="id" type="number" helpPrompt="ID"/> -->
  <!--  <attribute id="iRawOptionHatMetallicfarbe" label="Metallic colour" type="boolean" helpPrompt="Metallic colour"/> -->


  <!-- functions used in the "withConstraintStringFunction" functions -->
  <initFunction>
    function booleanText(trueText, falseText) {
      if (valueId == true)       return trueText; 
      else if (valueId == false) return falseText; 
      else                       return null; 
    }

    function booleanWithText(attributeLabel) { 
      if (valueId == true)       return 'with ' + attributeLabel; 
      else if (valueId == false) return 'without ' + attributeLabel;
      else                       return null; 
    }

    function multipleValuesWithText(pos, multipleText) {
      if (constraintType=='ecatalog.db.MultipleValuesConstraint') {
        if (valuesId.length > 1) {
	  return multipleText;
        } else {
	  return (type=='INCLUDE') ? (valuesId[0] + pos) : ('not ' + valuesId[0] + pos);
        } 
      } else {
        return valueId;
      }
    }


    function numberWithText(valueString, lessPre, lessPos, morePre, morePos, equalPre, equalPos) {
      if (constraintType=='ecatalog.db.LessThanOrEqualConstraint') 
        return lessPre + valueString + lessPos;
      else if (constraintType=='ecatalog.db.MoreThanOrEqualConstraint')
        return morePre + valueString + morePos;
      else if (constraintType=='ecatalog.db.EqualConstraint')
        return equalPre + valueString + equalPos;
      else null;
    }

    function numberRelaxText(valueString, lessPre, lessPos, morePre, morePos) {
      if (constraintType=='ecatalog.db.LessThanOrEqualConstraint') 
        return lessPre + valueString + lessPos;
      else if (constraintType=='ecatalog.db.MoreThanOrEqualConstraint')
        return morePre + valueString + morePos;
      else null;
    }

    function basicNumberWithText(valueString, attributeLabel) {
      return numberWithText(valueString,
                            '', ' ' + attributeLabel + ' or less',
                            '', ' ' + attributeLabel + ' or more',
                            '', ' ' + attributeLabel);
    }

    function basicNumberRelaxText(valueString, attributeLabel) {
      return numberRelaxText(valueString,
                             'to ', ' ' + attributeLabel + ' or less',
                             'to ', ' ' + attributeLabel + ' or more');
    }

    function firstNotNull(functions) {
      for (i = 0; i &lt; functions.length; i++) {
        try {
          var result = eval(functions[i]);
	  if (result != null)
            return result;
        } catch (e) {}
      }
      return null;
    }
  </initFunction>
</config>


