<%@ LANGUAGE="VBSCRIPT" %> <% PageStrings = "18, 55, 57, 107, 108, 149, 150, 151, 152, 153, 154, 158, 160, 161, 265, 266, 648, 897, 898, 1231, 1236, 1237" %> <% '=============================================== ' CactuShop ASP Shopping Cart ' ©1999-2004 Cactusoft Ltd. www.cactusoft.com '=============================================== ' All rights reserved. ' Use of this code is covered by the terms and ' conditions in the license agreement. No ' unauthorized duplication or distribution is ' permitted. Cactusoft's copyright notices must ' remain in the ASP sections of the code. '=============================================== 'Need extra recordset object Set objRecordSet3 = Server.CreateObject("ADODB.Recordset") '----------------------------------------------- 'COLLECT VALUES '----------------------------------------------- PT_ID = request.querystring("PT_ID") numRecordPosition = request.querystring("numRecordPosition") strSearchCriteria = sqlsafe(request.querystring("strSearchCriteria")) strKeywords = sqlsafe(request.querystring("strKeywords")) strPageHistory = sqlsafe(request.querystring("strPageHistory")) '----------------------------------------------- 'CHECK VALUES FOR SECURITY '----------------------------------------------- If numRecordPosition = "" then numRecordPosition = 1 numPageStartPosition = numRecordPosition If PT_ID = "" then PT_ID = 0 If Not IsNumeric(numRecordPosition) then response.redirect("error.asp") If Not IsNumeric(PT_ID) and PT_ID <> "all" then response.redirect("error.asp") numRecordPosition = Cint(numRecordPosition) '----------------------------------------------- 'PULL OUT PRODTYPE FROM DATABASE '----------------------------------------------- blnNoShow = false strQuery = "SELECT PT_Name" & CStr(numLanguageID) & ", PT_ProductDisplayType, PT_ProdTypeDisplayType, PT_Desc" & CStr(numLanguageID) & ", PT_MotherProdType, PT_OrderProductsBy FROM tblCactuShopProdtype WHERE PT_Live='y' AND PT_ID=" & PT_ID Call ExecuteSQL(strQuery, numCursorType, objRecordSet) If not (objRecordSet.BOF and objRecordSet.EOF) then PT_Name = objRecordSet("PT_Name" & CStr(numLanguageID) & "") PT_ProductDisplayType = objRecordSet("PT_ProductDisplayType") PT_ProdTypeDisplayType = objRecordSet("PT_ProdTypeDisplayType") PT_Desc = objRecordSet("PT_Desc" & CStr(numLanguageID)) PT_MotherProdType = objRecordSet("PT_MotherProdType") PT_OrderProductsBy = objRecordSet("PT_OrderProductsBy") blnNoShow = objRecordSet("PT_Name" & CStr(numLanguageID)) & "" = "" 'Set the string to use as the title of this page - good for search engines! strPageTitleHTML = PT_Name & " | " & GetString("Config_Webshopname") strMetaDescHTML = left(PT_Desc, 300) Else PT_ProductDisplayType = "d" PT_ProdTypeDisplayType = "d" PT_ID = "0" 'Set the string to use as the title of this page - good for search engines! strPageTitleHTML = GetString("ContentText_Categories") & " | " & GetString("Config_Webshopname") strMetaDescHTML = left(PT_Desc, 300) 'Replace the description with break tags If Application(LICENSENUMBER & "convertdescbreaks") = "y" then PT_Desc = replace(PT_Desc, vbcrlf, "
") end if End if objRecordSet.close '----------------------------------------------- 'BUILDPAGE DOWN HERE BECAUSE THANKS TO THE NEW 'CODE TO ADD METATAGS AND PAGETITLE, THIS NEEDS 'TO COME AFTER PRODUCT INFO PULLED OUT. '----------------------------------------------- %> <% 'If default product and prodtype display types are selected, 'use the default settings from the application variables If PT_ProductDisplayType = "d" then PT_ProductDisplayType = Application(LICENSENUMBER & "defaultproddisplay") If PT_ProdTypeDisplayType = "d" then PT_ProdTypeDisplayType = Application(LICENSENUMBER & "defaultprodtypedisplay") '----------------------------------------------- 'SET VALUES FOR PRODUCTS, ROWS, COLS PER PAGE '----------------------------------------------- 'These need to be set here so the top paging works If PT_ProductDisplayType = "s" then numProdShortenValueCols = Application(LICENSENUMBER & "shortenedformatcols") numProdsPerPage = numProdShortenValueCols * Application(LICENSENUMBER & "shortenedformatrows") else numProdsPerPage = Application(LICENSENUMBER & "prodtypepagesize") end if '----------------------------------------------- 'READ PAGE TEMPLATE FROM FILE '----------------------------------------------- Call ReadFromTemplate(strTemplateLocation, aryPageTemplate, strBasketHTML, strCategoryListHTML) '----------------------------------------------- 'WRITE FIRST HALF OF PAGE HTML '----------------------------------------------- response.write(aryPageTemplate(0)) If blnNoShow then %>
<% WriteString("ContentText_ProdTypeUnavailable") %>
<% else '------------------------------------------ 'ORDER CLAUSE 'If the method of ordering products in this 'category is 'default' then set ordering to 'the config value, otherwise using this 'category's setting '------------------------------------------ strProductsOrderBy = Application(LICENSENUMBER & "orderby_products") If PT_OrderProductsBy <> "" then strProductsOrderBy = PT_OrderProductsBy if strProductsOrderBy = "" then strProductsOrderBy = "P_Name" 'If the orderby is a 'languaged'-field, then stick on the numerical language ID If strProductsOrderBy = "P_Name" or strProductsOrderBy = "P_Desc" or strProductsOrderBy = "P_StrapLine" or strProductsOrderBy = "P_SpecTable" or strProductsOrderBy = "P_Hyperlink" then strProductsOrderBy = strProductsOrderBy & CStr(numLanguageID) end if '----------------------------------------------- 'PULL OUT PRODUCTS FROM DATABASE 'First list the selects. If the orderby isn't 'in the selects, then add it on to the end. The 'add on the rest of the query (otherwise you 'get 'conflicts with DISTINCT error') '----------------------------------------------- If strDatabaseType = "access" Then strQuery = "SELECT DISTINCTROW PT_ID, P_ID, P_VersionDisplayType, P_OrderVersionsBy, P_StrapLine" & CStr(numLanguageID) & ", P_Desc" & CStr(numLanguageID) & ", P_Name" & CStr(numLanguageID) else strQuery = "SELECT DISTINCT PT_ID, P_ID, P_VersionDisplayType, P_OrderVersionsBy, P_StrapLine" & CStr(numLanguageID) & ", P_Desc" & CStr(numLanguageID) & ", P_Name" & CStr(numLanguageID) end if if instr(strQuery, strProductsOrderBy) = "0" then strQuery = strQuery & ", " & strProductsOrderBy strQuery = strQuery & " FROM ((tblCactuShopProdtype INNER JOIN tblCactuShopProductProdTypeLink ON tblCactuShopProdtype.PT_ID = tblCactuShopProductProdTypeLink.PPT_ProdTypeID) INNER JOIN tblCactuShopProducts ON tblCactuShopProducts.P_ID = tblCactuShopProductProdTypeLink.PPT_ProductID) INNER JOIN tblCactuShopVersions ON tblCactuShopVersions.V_Product = tblCactuShopProducts.P_ID WHERE P_Name" & CStr(numLanguageID) & " <> '' AND P_Live = 'y' AND PT_Live = 'y' AND PT_ID=" & PT_ID & " ORDER BY " & strProductsOrderBy Call ExecuteSQL(strQuery, numCursorType, objRecordSet) numRecordCount = objRecordSet.recordcount '----------------------------------------------- 'MOVE TO CORRECT RECORD '----------------------------------------------- If numRecordCount > 0 then objRecordSet.AbsolutePosition = numRecordPosition end if %> <% '----------------------------------------------- 'FORMAT LOCATION BAR LINKS 'As long as we're not on the category page '----------------------------------------------- %> <% '----------------------------------------------- 'NEXT/PREV LINKS TOPS '----------------------------------------------- %> <% if strPageLinks <> "" then %> <% end if '----------------------------------------------- 'CURRENT CATEGORY INFORMATION '----------------------------------------------- '----------------------------------------- 'SHOW CATEGORY IMAGE(S) 'Create objects and set various 'image-related variables '----------------------------------------- Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject") aryFileTypes = Split(Application(LICENSENUMBER & "allowedimages"), ",") strCategoryPath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_categories/") strCategoryLargePath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_categories_large/") 'Find and show normal image (if it exists) strFileName = GetFileLocation(strCategoryPath, PT_ID, aryFileTypes, objFileSystem) strFileStatus = "" If Not strFileName = "" Then strFileStatus = "
" 'Find and show link to popup of large image (if it exists) strFileName = GetFileLocation(strCategoryLargePath, PT_ID, aryFileTypes, objFileSystem) strFileStatus2 = "" If Not strFileName = "" Then If gfxSpex(strCategoryLargePath & "\" & strFileName, imgW, imgH, c, strType) = True Then strImageTag = server.URLencode("") strFileStatus2 = "

" & GetString("ContentText_View2") & "" End if End if 'Show image strText = strFileStatus & Highlight(PT_Desc, strKeywords, "searchtexthighlight") & strFileStatus2 %>
<% If PT_ID <> 0 then select case strPageHistory case "cat": strLocationBar = strLocationBar & "" & GetString("ContentText_Categories") & " > " case "search" strLocationBar = strLocationBar & "" & GetString("ContentText_Search") & " > " strLocationBar = strLocationBar & "" & GetString("ContentText_SearchResults") & " > " case else: strLocationBar = strLocationBar & "" & GetString("ContentText_Home") & " > " end select numMotherID = PT_MotherProdType Do While numMotherID > 0 strQuery = "SELECT PT_ID, PT_Name" & CStr(numLanguageID) & ", PT_MotherProdType FROM tblCactuShopProdtype WHERE PT_ID = " & numMotherID Call ExecuteSQL(strQuery, numCursorType, objRecordSet3) if not (objRecordSet3.bof and objRecordSet3.eof) then numMotherID = objRecordSet3("PT_MotherProdType") strMothers = "" & objRecordSet3("PT_Name" & CStr(numLanguageID)) & " > " & strMothers else numMotherID = 0 end if objRecordSet3.close loop strLocationBar = StrLocationBar & strMothers & PT_Name response.write("" & PT_Name & "
" & strLocationBar & "") else response.write("" & GetString("ContentText_Categories") & "
") end if %>
<% =strPageLinks %>
<% '----------------------------------------------- 'LIST CATEGORIES '----------------------------------------------- '----------------------------------------------- 'PRODTYPE (CATEGORY) QUERY 'Pull out all the sub-categories in this 'category. Order prodtypes by strCategoryOrderBy 'which was set on the buildpage.asp '----------------------------------------------- strQuery = "SELECT * FROM tblCactuShopProdtype WHERE PT_Name" & numLanguageID & " <> '' AND PT_MotherProdtype = " & PT_ID & " AND PT_Live = 'y' ORDER BY " & strCategoryOrderBy Call ExecuteSQL(strQuery, numCursorType, objRecordSet3) numCatRecordCount = objRecordSet3.recordcount '----------------------------------------------------- 'SHOW SUB CATEGORIES 'For multi-column categories, we need to get the 'number of columns and calculate the column width '----------------------------------------------------- If PT_ProdTypeDisplayType = "s" then numCatShortenValueCols = Application(LICENSENUMBER & "shortenedformatcols") 'number of columns to display numCatColumnWidthPercent = 100 / numCatShortenValueCols 'width of each column else numCatShortenValueCols = 1 end if 'Loop through all sub-categories If numCatRecordCount > 0 then %> <% end if If numCatRecordCount > 0 AND PT_ID <> 0 then %> <% end if do while not objRecordSet3.EOF 'Increment the recordcount numCatRecordPosition = numCatRecordPosition + 1 '----------------------------------------------- 'MULTICOLUMN FORMAT OR NOT? '----------------------------------------------- If PT_ProdTypeDisplayType = "s" then '----------------------------------------------- 'MULTICOLUMN FORMAT '----------------------------------------------- %> <% 'If we have reached the end of categories, or if we have finished a table row... if (numCatRecordPosition = numCatRecordCount) OR (numCatRecordPosition mod numCatShortenValueCols = 0) then 'Get the total cells away from completing a table row numExtraCells = numCatShortenValueCols- (numCatRecordPosition mod numCatShortenValueCols) If numExtraCells = numCatShortenValueCols then numExtraCells=0 'For all the blank spaces we have left, write in blank table cells For numCellCounter = 1 to numExtraCells numCatRecordPosition = numCatRecordPosition + 1 response.Write "" & vbCrlf next 'finish the table row %> <% If numCatRecordPosition >= objRecordSet3.recordcount then %>

<% WriteString("ContentText_SubCategories") %>

"><% =objRecordSet3("PT_Name" & CStr(numLanguageID))%>
<% '----------------------------------------- 'FIND AND SHOW IMAGE (IF ANY) '----------------------------------------- strFileName = GetFileLocation(strCategoryPath, objRecordSet3("PT_ID"), aryFileTypes, objFileSystem) If strFileName = "" Then strFileStatus = "" Else strFileStatus = "" End if Response.Write(strFileStatus) %>
 
<% end if If numCatRecordPosition < numCatRecordCount then %> <% end if end if elseif PT_ProdTypeDisplayType = "l" then '----------------------------------------------- 'SINGLE COLUMN FORMAT '----------------------------------------------- %> <% else '----------------------------------------------- 'SINGLE COLUMN FORMAT '----------------------------------------------- %> <% end if objRecordSet3.moveNext loop objRecordSet3.Close If numCatRecordCount > 0 then %>
"><% =objRecordSet3("PT_Name" & CStr(numLanguageID))%>
"><% =objRecordSet3("PT_Name" & CStr(numLanguageID))%>
<% Response.Write(objRecordSet3("PT_Desc" & CStr(numLanguageID))) %>
<% end if '----------------------------------------------- 'LIST PRODUCTS 'If we're doing the shortened view... '----------------------------------------------- If PT_ProductDisplayType="s" then '... then we need to get the total columns, the total products 'to display on this page, numProdShortenValueCols = Application(LICENSENUMBER & "shortenedformatcols") numProdsPerPage = numProdShortenValueCols * Application(LICENSENUMBER & "shortenedformatrows") numProdColumnWidthPercent = 100 / numProdShortenValueCols else numProdShortenValueCols = 1 End if 'Open up a file-system-object and set image directories 'for image display later during the product loop Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject") strProductPath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_products/") strVersionPath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_versions/") strVersionLargePath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_versions_large/") aryFileTypes = Split(Application(LICENSENUMBER & "allowedimages"), ",") If objRecordSet.recordcount > 0 then %> <% end if '------------------------------------------------ 'PRODUCT LOOP 'This loops round for every product to be 'displayed on this page '------------------------------------------------ numSpacerCounter = 0 do while numRecordPosition < CInt(numPageStartPosition + numProdsPerPage) AND not objRecordSet.EOF 'Get version ordering P_OrderVersionsBy = objrecordSet("P_OrderVersionsBy") if PT_ProductDisplayType <> "s" or numProdShortenValueCols = 0 then %> <% '------------------------------------------------ 'NORMAL / EXTENDED DISPLAY END '------------------------------------------------ else '----------------------------------------------- 'SHORTENED DISPLAY 'displays the products in small boxes in multi- 'ple columns '----------------------------------------------- 'If it's the start of a new line, close and re-open 'the table if numRecordPosition mod numProdsPerPage = 1 then %>

<% WriteString("ContentText_Products") %>

<% '------------------------------------------------ 'NORMAL / EXTENDED DISPLAY 'This is also displayed if display tye is set to 'shortened, but total columns for shortened 'display is set to 0 '------------------------------------------------ %> <% '----------------------------------------------- 'EXTENDED DISPLAY 'Pull out versions and display them '----------------------------------------------- if PT_ProductDisplayType = "e" then %> <% end if '----------------------------------------------- 'EXTENDED DISPLAY END '----------------------------------------------- objRecordSet.moveNext %>
<% Response.write("" & objRecordSet("P_Name" & CStr(numLanguageID)) & "") %>
<% '----------------------------------------- 'FIND AND SHOW IMAGE (IF ANY) '----------------------------------------- strFileName = GetFileLocation(strProductPath, objRecordSet("P_ID"), aryFileTypes, objFileSystem) If strFileName = "" Then strFileStatus = "" Else strFileStatus = "" End if Response.Write(strFileStatus) If objRecordSet("P_StrapLine" & CStr(numLanguageID))<>"" then Response.Write("" & objRecordSet("P_StrapLine" & CStr(numLanguageID)) & "
") end if 'Get truncated description and display P_Desc = objRecordSet("P_Desc" & CStr(numLanguageID)) intTruncatePoint = CInt(Application(LICENSENUMBER & "truncateproductoncategory")) If intTruncatePoint > 0 and len(P_Desc) > intTruncatePoint then P_Desc = left(P_Desc, intTruncatePoint - 3) & "..." end if 'Replace the description with break tags If Application(LICENSENUMBER & "convertdescbreaks") = "y" then P_Desc = replace(P_Desc, vbcrlf, "
") end if response.Write P_Desc %>
<% If Application(LICENSENUMBER & "showmoredetaillink") = "l" then %>
<% WriteString("ContentText_ViewProductMoreDetail") %> >> <% else %>
"> ">
<% end if %>
<% strVersionsOrderBy = Application(LICENSENUMBER & "orderby_versions") If P_OrderVersionsBy <> "" then strVersionsOrderBy = P_OrderVersionsBy If strVersionsOrderBy = "" then strVersionsOrderBy = "V_Name" if strVersionsOrderBy = "V_Name" or strVersionsOrderBy = "V_Desc" then strVersionsOrderBy = strVersionsOrderBy & CStr(numLanguageID) P_VersionDisplayType = objRecordSet("P_VersionDisplayType") 'Pull out all live versions for this product, and related tax info strQuery3 = "SELECT DISTINCT T_Taxrate, V_ID, V_Price, V_Weight, V_RRP, V_Tax, V_Product, V_CodeNumber, V_Quantity, V_Quantity, V_QuantityWarnLevel, " & strVersionsOrderBy & " As OrderByBit, V_Name" & CStr(numLanguageID) & ", V_Desc" & CStr(numLanguageID) & " FROM tblCactuShopVersions INNER JOIN tblCactuShopTaxRates ON tblCactuShopVersions.V_Tax = tblCactuShopTaxRates.T_ID WHERE V_Live = 'y' AND V_Product=" & objRecordSet("P_ID") & " AND V_Name" & CStr(numLanguageID) & " <> '' ORDER BY " & strVersionsOrderBy Call ExecuteSQL(strQuery3, numCursorType, objRecordSet3) 'Create return URL (so if add-to-basket is clicked, 'is can return back to the correct page) Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject") strReturnURL = "prodtype.asp:::PT_ID=" & PT_ID & "|||numRecordPosition=" & numPageStartPosition & "|||strPageHistory=" & strPageHistoryClause strVersionPath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_versions/") strVersionLargePath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_versions_large/") 'Show the versions %><% objRecordSet3.close %>
<% end if 'Now display the table cell, with link and image %> <% 'If we've come to the end of the row, display come empty cells if (numRecordPosition = numRecordCount) OR (numRecordPosition mod numProdShortenValueCols = 0) then numModValue = (numRecordPosition mod numProdsPerPage) mod numProdShortenValueCols numExtraCells = numProdShortenValueCols-numModValue If numExtraCells = numProdShortenValueCols then numExtraCells=0 For numCellCounter = 1 to numExtraCells numRecordPosition = numRecordPosition + 1 %> <% next %> <% If numRecordPosition mod numProdsPerPage <> 0 AND numRecordPosition <> numRecordCount then %> <% end if end if objRecordSet.moveNext end if '----------------------------------------------- 'SHORTENED DISPLAY END '----------------------------------------------- 'Move on to the next record numRecordPosition = numRecordPosition + 1 loop '----------------------------------------------- 'PRODUCT LOOP END '----------------------------------------------- If objRecordSet.recordcount > 0 then %>
<% If objRecordSet("P_StrapLine" & CStr(numLanguageID))<>"" then %> <% end if %> <% '----------------------------------------- 'SHOW DESCRIPTION? 'If config says so, then show the 'description. This should only be used for 'sites that are tailored for it (i.e. short 'descriptions for everything) '----------------------------------------- If Application(LICENSENUMBER & "shortenedformatshowdesc") = "y" then %> <% end if If Application(LICENSENUMBER & "shortenedformatshowversions") = "y" then '----------------------------------------- 'SHOW EXTENDED?! 'If config says so, then show the 'extended information. Only does it if 'the product display is 'option' mode '(o or p - or check config if d) '----------------------------------------- %> <% end if %>
<% response.write("" & objRecordSet("P_Name" & CStr(numLanguageID)) & "") %>
<% =objRecordSet("P_StrapLine" & CStr(numLanguageID)) %>
<% '----------------------------------------- 'FIND AND SHOW IMAGE (IF ANY) '----------------------------------------- strFileName = GetFileLocation(strProductPath, objRecordSet("P_ID"), aryFileTypes, objFileSystem) If strFileName = "" Then strFileStatus = "" Else strFileStatus = "" End if Response.Write(strFileStatus) %>
<% P_Desc = objRecordSet("P_Desc" & CStr(numLanguageID)) 'Replace the description with break tags If Application(LICENSENUMBER & "convertdescbreaks") = "y" then P_Desc = replace(P_Desc, vbcrlf, "
") end if response.write(P_Desc) %>
<% strVersionsOrderBy = Application(LICENSENUMBER & "orderby_versions") If P_OrderVersionsBy <> "" then strVersionsOrderBy = P_OrderVersionsBy If strVersionsOrderBy = "" then strVersionsOrderBy = "V_Name" if strVersionsOrderBy = "V_Name" or strVersionsOrderBy = "V_Desc" then strVersionsOrderBy = strVersionsOrderBy & CStr(numLanguageID) P_VersionDisplayType = objRecordSet("P_VersionDisplayType") If P_VersionDisplayType = "d" then P_VersionDisplayType = Application(LICENSENUMBER & "defaultversiondisplay") If P_VersionDisplayType <> "r" then 'Pull out all live versions for this product, and related tax info strQuery3 = "SELECT DISTINCT T_Taxrate, V_ID, V_Price, V_Weight, V_RRP, V_Tax, V_Product, V_CodeNumber, V_Quantity, V_Quantity, V_QuantityWarnLevel, " & strVersionsOrderBy & " As OrderByBit, V_Name" & CStr(numLanguageID) & ", V_Desc" & CStr(numLanguageID) & " FROM tblCactuShopVersions INNER JOIN tblCactuShopTaxRates ON tblCactuShopVersions.V_Tax = tblCactuShopTaxRates.T_ID WHERE V_Live = 'y' AND V_Product=" & objRecordSet("P_ID") & " ORDER BY " & strVersionsOrderBy Call ExecuteSQL(strQuery3, numCursorType, objRecordSet3) 'Create return URL (so if add-to-basket is clicked, 'is can return back to the correct page) Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject") strReturnURL = "prodtype.asp:::PT_ID=" & PT_ID & "|||numRecordPosition=" & numPageStartPosition & "|||strPageHistory=" & strPageHistoryClause strVersionPath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_versions/") strVersionLargePath = Server.MapPath(Application(LICENSENUMBER & "uploadsfolder") & "images_versions_large/") 'Show the versions %><% objRecordSet3.close else response.Write " " end if %>
 
<% end if objRecordSet.Close Set objFileSystem = Nothing if strPageLinks <>"" then %>


<% =strPageLinks %>
<% end if end if '// blnNoShow '----------------------------------------------- 'WRITE LAST HALF OF PAGE HTML '----------------------------------------------- response.write(aryPageTemplate(1)) '----------------------------------------------- 'CLOSE DATA CONNECTIONS '----------------------------------------------- objDataConn.Close set objDataConn = nothing %>