Author: jacopoc
Date: Sun Mar 21 08:34:32 2010 New Revision: 925741 URL: http://svn.apache.org/viewvc?rev=925741&view=rev Log: Refactored event search mechanism for the workeffort calendar: there is now a calendar type (personal/manufacturing/..) that can be explicitly used to perform searches (constrained by the traditional fields like facilityId, partyIds, fixedAssetId, workEffortTypeId); previoulsy the concept of "calendar type" was somewhat impled in the search constraints (for example, if facilityId was set then production runs were included in the search results). Modified: ofbiz/trunk/applications/workeffort/data/WorkEffortTypeData.xml ofbiz/trunk/applications/workeffort/servicedef/services.xml ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/WorkEffortServices.java ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/CreateUrlParam.groovy ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Days.groovy ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Month.groovy ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Upcoming.groovy ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Week.groovy ofbiz/trunk/applications/workeffort/widget/CalendarForms.xml Modified: ofbiz/trunk/applications/workeffort/data/WorkEffortTypeData.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/data/WorkEffortTypeData.xml?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/data/WorkEffortTypeData.xml (original) +++ ofbiz/trunk/applications/workeffort/data/WorkEffortTypeData.xml Sun Mar 21 08:34:32 2010 @@ -37,6 +37,10 @@ under the License. <Enumeration description="Restricted, private access" enumCode="PRIVATE" enumId="WES_PRIVATE" sequenceId="02" enumTypeId="WORK_EFF_SCOPE"/> <Enumeration description="Very restricted, confidential access" enumCode="CONFIDENTIAL" enumId="WES_CONFIDENTIAL" sequenceId="03" enumTypeId="WORK_EFF_SCOPE"/> + <EnumerationType description="Calendar Type" enumTypeId="CALENDAR_TYPE" hasTable="N" parentTypeId=""/> + <Enumeration description="Personal Calendar" enumCode="PERSONAL" enumId="CAL_PERSONAL" sequenceId="01" enumTypeId="CALENDAR_TYPE"/> + <Enumeration description="Manufacturing Calendar" enumCode="MANUFACTURING" enumId="CAL_MANUFACTURING" sequenceId="02" enumTypeId="CALENDAR_TYPE"/> + <!-- workeffort status --> <StatusType description="WorkEffort Asset" hasTable="N" parentTypeId="" statusTypeId="WORK_EFF_ASSET_STTS"/> <StatusType description="WorkEffort Assignment" hasTable="N" parentTypeId="" statusTypeId="WORK_EFFORT_ASSIGN"/> Modified: ofbiz/trunk/applications/workeffort/servicedef/services.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/servicedef/services.xml?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/servicedef/services.xml (original) +++ ofbiz/trunk/applications/workeffort/servicedef/services.xml Sun Mar 21 08:34:32 2010 @@ -226,6 +226,7 @@ under the License. If filterOutCanceledEvents is set to Boolean(true) then workEfforts with currentStatusId=EVENT_CANCELLED will not be returned. To limit the events to a particular partyId, specify the partyId. To limit the events to a set of partyIds, specify a Collection of partyIds. </description> + <attribute name="calendarType" type="String" mode="IN" optional="true"/> <attribute name="partyId" type="String" mode="IN" optional="true"/> <attribute name="partyIds" type="java.util.Collection" mode="IN" optional="true"/> <attribute name="facilityId" type="String" mode="IN" optional="true"/> Modified: ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/WorkEffortServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/WorkEffortServices.java?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/WorkEffortServices.java (original) +++ ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/WorkEffortServices.java Sun Mar 21 08:34:32 2010 @@ -349,42 +349,36 @@ public class WorkEffortServices { return resultMap; } - private static List<EntityCondition> getDefaultWorkEffortExprList(Collection<String> partyIds, String facilityId, String fixedAssetId, String workEffortTypeId, List<EntityCondition> cancelledCheckAndList) { - List<EntityCondition> entityExprList = UtilMisc.<EntityCondition>toList(EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "CAL_CANCELLED"), EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "PRUN_CANCELLED")); + private static List<EntityCondition> getDefaultWorkEffortExprList(String calendarType, Collection<String> partyIds, String workEffortTypeId, List<EntityCondition> cancelledCheckAndList) { + List<EntityCondition> entityExprList = FastList.newInstance(); + if (cancelledCheckAndList != null) { + entityExprList.addAll(cancelledCheckAndList); + } List<EntityExpr> typesList = FastList.newInstance(); if (UtilValidate.isNotEmpty(workEffortTypeId)) { typesList.add(EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, workEffortTypeId)); } - if (UtilValidate.isNotEmpty(partyIds)) { - // (non cancelled) public events, with a startdate + if ("CAL_PERSONAL".equals(calendarType)) { + // public events are always included to the "personal calendar" List<EntityCondition> publicEvents = UtilMisc.<EntityCondition>toList( EntityCondition.makeCondition("scopeEnumId", EntityOperator.EQUALS, "WES_PUBLIC"), EntityCondition.makeCondition("parentTypeId", EntityOperator.EQUALS, "EVENT") ); - - if (cancelledCheckAndList != null) { - publicEvents.addAll(cancelledCheckAndList); + if (UtilValidate.isNotEmpty(partyIds)) { + entityExprList.add( + EntityCondition.makeCondition(UtilMisc.toList( + EntityCondition.makeCondition("partyId", EntityOperator.IN, partyIds), + EntityCondition.makeCondition(publicEvents, EntityJoinOperator.AND) + ), EntityJoinOperator.OR)); } + } + if ("CAL_MANUFACTURING".equals(calendarType)) { entityExprList.add( EntityCondition.makeCondition(UtilMisc.toList( - EntityCondition.makeCondition("partyId", EntityOperator.IN, partyIds), - EntityCondition.makeCondition(publicEvents, EntityJoinOperator.AND) + EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, "PROD_ORDER_HEADER"), + EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, "PROD_ORDER_TASK") ), EntityJoinOperator.OR)); } - if (UtilValidate.isNotEmpty(facilityId)) { - entityExprList.add(EntityCondition.makeCondition("facilityId", EntityOperator.EQUALS, facilityId)); - typesList.add(EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, "PROD_ORDER_HEADER")); - entityExprList.add(EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "PRUN_CREATED")); - entityExprList.add(EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "PRUN_COMPLETED")); - entityExprList.add(EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "PRUN_CLOSED")); - } - if (UtilValidate.isNotEmpty(fixedAssetId)) { - entityExprList.add(EntityCondition.makeCondition("fixedAssetId", EntityOperator.EQUALS, fixedAssetId)); -// typesList.add(EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, "PROD_ORDER_TASK")); -// entityExprList.add(EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "PRUN_CREATED")); -// entityExprList.add(EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "PRUN_COMPLETED")); - entityExprList.add(EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "PRUN_CLOSED")); - } EntityCondition typesCondition = null; if (typesList.size() == 0) { return entityExprList; @@ -463,6 +457,10 @@ public class WorkEffortServices { Timestamp startDay = (Timestamp) context.get("start"); Integer numPeriodsInteger = (Integer) context.get("numPeriods"); + String calendarType = (String) context.get("calendarType"); + if (UtilValidate.isEmpty(calendarType)) { + calendarType = "CAL_PERSONAL"; + } String partyId = (String) context.get("partyId"); Collection<String> partyIds = UtilGenerics.checkCollection(context.get("partyIds")); String facilityId = (String) context.get("facilityId"); @@ -507,8 +505,7 @@ public class WorkEffortServices { return ServiceUtil.returnError("You do not have permission to view information for party with ID [" + partyId + "], you must be logged in as a user associated with this party, or have the WORKEFFORTMGR_VIEW or WORKEFFORTMGR_ADMIN permissions."); } } else { - // if a facilityId or a fixedAssetId are not specified, don't set a default partyId... - if (UtilValidate.isEmpty(facilityId) && UtilValidate.isEmpty(fixedAssetId) && UtilValidate.isNotEmpty(userLogin.getString("partyId"))) { + if ("CAL_PERSONAL".equals(calendarType) && UtilValidate.isNotEmpty(userLogin.getString("partyId"))) { partyIdsToUse.add(userLogin.getString("partyId")); } } @@ -516,12 +513,20 @@ public class WorkEffortServices { // cancelled status id's List<EntityCondition> cancelledCheckAndList = UtilMisc.<EntityCondition>toList( EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "EVENT_CANCELLED"), - EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "CAL_CANCELLED")); + EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "CAL_CANCELLED"), + EntityCondition.makeCondition("currentStatusId", EntityOperator.NOT_EQUAL, "PRUN_CANCELLED")); List<EntityCondition> entityExprList = UtilGenerics.checkList(context.get("entityExprList")); if (entityExprList == null) { - entityExprList = getDefaultWorkEffortExprList(partyIdsToUse, facilityId, fixedAssetId, workEffortTypeId, cancelledCheckAndList); + entityExprList = getDefaultWorkEffortExprList(calendarType, partyIdsToUse, workEffortTypeId, cancelledCheckAndList); + } + + if (UtilValidate.isNotEmpty(facilityId)) { + entityExprList.add(EntityCondition.makeCondition("facilityId", EntityOperator.EQUALS, facilityId)); + } + if (UtilValidate.isNotEmpty(fixedAssetId)) { + entityExprList.add(EntityCondition.makeCondition("fixedAssetId", EntityOperator.EQUALS, fixedAssetId)); } // should have at least a start date @@ -578,35 +583,21 @@ public class WorkEffortServices { ), EntityJoinOperator.OR); List<String> orderByList = UtilMisc.toList("estimatedStartDate"); - if (partyIdsToUse.size() > 0 || UtilValidate.isNotEmpty(facilityId) || UtilValidate.isNotEmpty(fixedAssetId)) { - try { - List<GenericValue> tempWorkEfforts = null; - if (UtilValidate.isNotEmpty(partyIdsToUse)) { - // Debug.log("=====conditions for party: " + eclTotal); - tempWorkEfforts = EntityUtil.filterByDate(delegator.findList("WorkEffortAndPartyAssignAndType", eclTotal, null, orderByList, null, false)); - } else if (UtilValidate.isNotEmpty(fixedAssetId)) { - EntityConditionList<EntityCondition> ecl = - EntityCondition.makeCondition(UtilMisc.toList( - eclTotal, - EntityCondition.makeCondition("fixedAssetId", EntityOperator.EQUALS, fixedAssetId) - ), EntityJoinOperator.AND); - // Get "old style" work efforts and "new style" work efforts - // Debug.log("=====conditions for fixed asset: " + ecl); - tempWorkEfforts = delegator.findList("WorkEffort", ecl, null, orderByList, null, false); - tempWorkEfforts.addAll(EntityUtil.filterByDate(delegator.findList("WorkEffortAndFixedAssetAssign", ecl, null, orderByList, null, false))); - } else { - EntityConditionList<EntityCondition> ecl = - EntityCondition.makeCondition(UtilMisc.toList( - eclTotal, - EntityCondition.makeCondition("facilityId", EntityOperator.EQUALS, facilityId) - ), EntityJoinOperator.AND); - // Debug.log("=====conditions for facility: " + ecl); - tempWorkEfforts = delegator.findList("WorkEffort", ecl, null, UtilMisc.toList("estimatedStartDate"), null, false); - } - validWorkEfforts = WorkEffortWorker.removeDuplicateWorkEfforts(tempWorkEfforts); - } catch (GenericEntityException e) { - Debug.logWarning(e, module); + try { + List<GenericValue> tempWorkEfforts = null; + if (UtilValidate.isNotEmpty(partyIdsToUse)) { + // Debug.log("=====conditions for party: " + eclTotal); + tempWorkEfforts = EntityUtil.filterByDate(delegator.findList("WorkEffortAndPartyAssignAndType", eclTotal, null, orderByList, null, false)); + } else { + tempWorkEfforts = delegator.findList("WorkEffort", eclTotal, null, orderByList, null, false); + } + if (!"CAL_PERSONAL".equals(calendarType) && UtilValidate.isNotEmpty(fixedAssetId)) { + // Get "new style" work efforts + tempWorkEfforts.addAll(EntityUtil.filterByDate(delegator.findList("WorkEffortAndFixedAssetAssign", eclTotal, null, orderByList, null, false))); } + validWorkEfforts = WorkEffortWorker.removeDuplicateWorkEfforts(tempWorkEfforts); + } catch (GenericEntityException e) { + Debug.logWarning(e, module); } // Split the WorkEffort list into a map with entries for each period, period start is the key Modified: ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/CreateUrlParam.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/CreateUrlParam.groovy?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/CreateUrlParam.groovy (original) +++ ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/CreateUrlParam.groovy Sun Mar 21 08:34:32 2010 @@ -21,7 +21,8 @@ facilityId = parameters.facilityId; fixedAssetId = parameters.fixedAssetId; partyId = parameters.partyId; workEffortTypeId = parameters.workEffortTypeId; - +calendarType = parameters.calendarType; + urlParam = ""; if (facilityId) { urlParam = "facilityId=" + facilityId; @@ -46,6 +47,13 @@ if (workEffortTypeId) { urlParam = urlParam + "workEffortTypeId=" + workEffortTypeId; } +if (calendarType) { + if (urlParam) { + urlParam = urlParam + "&"; + } + urlParam = urlParam + "calendarType=" + calendarType; +} + if (urlParam) { urlParam = "&" + urlParam; } Modified: ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Days.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Days.groovy?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Days.groovy (original) +++ ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Days.groovy Sun Mar 21 08:34:32 2010 @@ -31,6 +31,7 @@ facilityId = parameters.facilityId; fixedAssetId = parameters.fixedAssetId; partyId = parameters.partyId; workEffortTypeId = parameters.workEffortTypeId; +calendarType = parameters.calendarType; entityExprList = context.entityExprList; Timestamp start = null; @@ -49,7 +50,7 @@ Timestamp next = UtilDateTime.getDayStar context.nextMillis = new Long(next.getTime()).toString(); Map serviceCtx = UtilMisc.toMap("userLogin", userLogin,"start",start,"numPeriods",new Integer(24),"periodType",new Integer(Calendar.HOUR)); -serviceCtx.putAll(UtilMisc.toMap("partyId", partyId, "facilityId", facilityId, "fixedAssetId", fixedAssetId, "workEffortTypeId", workEffortTypeId, "locale", locale, "timeZone", timeZone)); +serviceCtx.putAll(UtilMisc.toMap("partyId", partyId, "facilityId", facilityId, "fixedAssetId", fixedAssetId, "workEffortTypeId", workEffortTypeId, "calendarType", calendarType, "locale", locale, "timeZone", timeZone)); if (entityExprList) { serviceCtx.putAll(["entityExprList" : entityExprList]); } Modified: ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Month.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Month.groovy?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Month.groovy (original) +++ ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Month.groovy Sun Mar 21 08:34:32 2010 @@ -32,6 +32,7 @@ facilityId = parameters.facilityId; fixedAssetId = parameters.fixedAssetId; partyId = parameters.partyId; workEffortTypeId = parameters.workEffortTypeId; +calendarType = parameters.calendarType; entityExprList = context.entityExprList; start = null; @@ -75,7 +76,7 @@ if (followingMonthDays < 0) { numDays += followingMonthDays; serviceCtx = UtilMisc.toMap("userLogin", userLogin, "start", getFrom, "numPeriods", new Integer(numDays), "periodType", new Integer(Calendar.DATE)); -serviceCtx.putAll(UtilMisc.toMap("partyId", partyId, "facilityId", facilityId, "fixedAssetId", fixedAssetId, "workEffortTypeId", workEffortTypeId, "locale", locale, "timeZone", timeZone)); +serviceCtx.putAll(UtilMisc.toMap("partyId", partyId, "facilityId", facilityId, "fixedAssetId", fixedAssetId, "workEffortTypeId", workEffortTypeId, "calendarType", calendarType, "locale", locale, "timeZone", timeZone)); if (entityExprList) { serviceCtx.putAll(["entityExprList" : entityExprList]); } Modified: ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Upcoming.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Upcoming.groovy?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Upcoming.groovy (original) +++ ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Upcoming.groovy Sun Mar 21 08:34:32 2010 @@ -28,6 +28,7 @@ facilityId = parameters.get("facilityId" fixedAssetId = parameters.get("fixedAssetId"); partyId = parameters.get("partyId"); workEffortTypeId = parameters.get("workEffortTypeId"); +calendarType = parameters.calendarType; start = nowTimestamp.clone(); eventsParam = ""; if (facilityId != null) { @@ -44,7 +45,7 @@ if (workEffortTypeId != null) { } Map serviceCtx = UtilMisc.toMap("userLogin", userLogin, "start", start, "numPeriods", new Integer(7), "periodType", new Integer(Calendar.DATE)); -serviceCtx.putAll(UtilMisc.toMap("partyId", partyId, "facilityId", facilityId, "fixedAssetId", fixedAssetId, "workEffortTypeId", workEffortTypeId, "locale", locale, "timeZone", timeZone)); +serviceCtx.putAll(UtilMisc.toMap("partyId", partyId, "facilityId", facilityId, "fixedAssetId", fixedAssetId, "workEffortTypeId", workEffortTypeId, "calendarType", calendarType, "locale", locale, "timeZone", timeZone)); Map result = dispatcher.runSync("getWorkEffortEventsByPeriod",serviceCtx); context.put("days", result.get("periods")); Modified: ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Week.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Week.groovy?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Week.groovy (original) +++ ofbiz/trunk/applications/workeffort/webapp/workeffort/WEB-INF/actions/calendar/Week.groovy Sun Mar 21 08:34:32 2010 @@ -32,6 +32,7 @@ facilityId = parameters.facilityId; fixedAssetId = parameters.fixedAssetId; partyId = parameters.partyId; workEffortTypeId = parameters.workEffortTypeId; +calendarType = parameters.calendarType; entityExprList = (List) context.get("entityExprList"); filterOutCanceledEvents = parameters.filterOutCanceledEvents; if (!filterOutCanceledEvents) { @@ -58,7 +59,7 @@ Timestamp end = UtilDateTime.getDayStart Map serviceCtx = UtilMisc.toMap("userLogin", userLogin,"start",start,"numPeriods",new Integer(7), "periodType",new Integer(Calendar.DATE)); serviceCtx.putAll(UtilMisc.toMap("partyId", partyId, "facilityId", facilityId, - "fixedAssetId", fixedAssetId, "workEffortTypeId", workEffortTypeId, + "fixedAssetId", fixedAssetId, "workEffortTypeId", workEffortTypeId, "calendarType", calendarType, "locale", locale, "timeZone", timeZone)); if (entityExprList) { serviceCtx.putAll(["entityExprList" : entityExprList]); Modified: ofbiz/trunk/applications/workeffort/widget/CalendarForms.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/widget/CalendarForms.xml?rev=925741&r1=925740&r2=925741&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/widget/CalendarForms.xml (original) +++ ofbiz/trunk/applications/workeffort/widget/CalendarForms.xml Sun Mar 21 08:34:32 2010 @@ -21,6 +21,14 @@ under the License. <forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-form.xsd"> <form name="FilterCalendarEvents" type="single" target="calendar"> + <field name="calendarType"> + <drop-down allow-empty="false"> + <entity-options entity-name="Enumeration" key-field-name="enumId" description="${description}"> + <entity-constraint name="enumTypeId" value="CALENDAR_TYPE"/> + <entity-order-by field-name="sequenceId"/> + </entity-options> + </drop-down> + </field> <field name="partyId"> <lookup target-form-name="LookupPartyName" size="16"/> </field> |
Free forum by Nabble | Edit this page |