seCret steVe Posted October 17, 2002 Share Posted October 17, 2002 http://www.echocart.com This is a duplicate off the Exchange project. Hell it is still using the same files as the exhchange project 2.1 or Oscommerce 2.1 Is this wrong that they are distrubuting it under a new name and basically taking all the credit for it??? here is the code for the defualt.php: <?php /* $Id: default.php,v 1.53 2001/11/09 19:16:44 dgw_ Exp $ The Exchange Project - Community Made Shopping! http://www.theexchangeproject.org Copyright (c) 2000,2001 The Exchange Project Released under the GNU General Public License */ require('includes/application_top.php'); // the following cPath references come from application_top.php $category_depth = 'top'; if ($cPath) { $categories_products_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id = '" . $current_category_id . "'"); $cateqories_products = tep_db_fetch_array($categories_products_query); if ($cateqories_products['total'] > 0) { $category_depth = 'products'; // display products } else { $category_parent_query = tep_db_query("select count(*) as total from " . TABLE_CATEGORIES . " where parent_id = '" . $current_category_id . "'"); $category_parent = tep_db_fetch_array($category_parent_query); if ($category_parent['total'] > 0) { $category_depth = 'nested'; // navigate through the categories } else { $category_depth = 'products'; // category has no products, but display the 'no products' message } } } require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_DEFAULT); $location = ''; ?> <html> <head> <title><?php echo TITLE; ?></title> <base href="<?php echo (getenv('HTTPS') == 'on' ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>"> <? $stylesheet_sql = tep_db_query("select stylesheet from text_conf where id='1'"); $stylesheet_sql = tep_db_fetch_array($stylesheet_sql); ?> <link rel="stylesheet" type="text/css" href="stylesheets/<? echo $stylesheet_sql['stylesheet']; ?>"> </head> <body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0"> <!-- header //--> <?php require(DIR_WS_INCLUDES . 'header.php'); ?> <!-- header_eof //--> <!-- body //--> <table border="0" width="100%" cellspacing="5" cellpadding="5"> <tr> <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="0"> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> <!-- left_navigation //--> <?php require(DIR_WS_INCLUDES . 'column_left.php'); ?> <!-- left_navigation_eof //--> </table></td> </tr> </table></td> <!-- body_text //--> <?php if ($category_depth == 'nested') { ?> <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="2" class="topBarTitle"> <tr> <td width="100%" class="topBarTitle"> <?php echo TOP_BAR_TITLE; ?> </td> </tr> </table></td> </tr> <?php $category_query = tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $current_category_id . "' and cd.categories_id = '" . $current_category_id . "' and cd.language_id = '" . $languages_id . "'"); $category = tep_db_fetch_array($category_query); ?> <tr> <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td class="pageHeading"> <?php echo HEADING_TITLE; ?> </td> <td align="right"> <?php echo tep_image($category['categories_image'], $category['categories_name'], HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?> </td> </tr> </table></td> </tr> <tr> <td><?php echo tep_black_line(); ?></td> </tr> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr class="subBar"> <td class="subBar"> <?php echo SUB_BAR_TITLE; ?> </td> </tr> <tr> <td><?php echo tep_black_line(); ?></td> </tr> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr> <?php if (($HTTP_GET_VARS['cPath']) && (ereg('_', $HTTP_GET_VARS['cPath']))) { // check to see if there are deeper categories within the current category $category_links = tep_array_reverse($cPath_array); for($i=0; $i<sizeof($category_links); $i++) { $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . $category_links[$i] . "' and c.categories_id = cd.categories_id and cd.language_id = '" . $languages_id . "' order by sort_order, cd.categories_name"); if (tep_db_num_rows($categories_query) < 1) { // do nothing, go through the loop } else { break; // we've found the deepest category the customer is in } } } else { $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . $current_category_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . $languages_id . "' order by sort_order, cd.categories_name"); } $rows = 0; while ($categories = tep_db_fetch_array($categories_query)) { $rows++; $cPath_new = tep_get_path($categories['categories_id']); echo ' <td align="center" class="main"><a href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new, 'NONSSL') . '">' . tep_image($categories['categories_image'], $categories['categories_name'], SUBCATEGORY_IMAGE_WIDTH, SUBCATEGORY_IMAGE_HEIGHT) . '<br>' . $categories['categories_name'] . '</a></td>' . "n"; if ((($rows / MAX_DISPLAY_CATEGORIES_PER_ROW) == floor($rows / MAX_DISPLAY_CATEGORIES_PER_ROW)) && ($rows != tep_db_num_rows($categories_query))) { echo ' </tr>' . "n"; echo ' <tr>' . "n"; } } ?> </tr> </table></td> </tr> <?php // display new products page module $new_products_category_id = $current_category_id; include(DIR_WS_MODULES . FILENAME_NEW_PRODUCTS); ?> </table></td> </tr> </table></td> <?php } elseif ($category_depth == 'products' || $HTTP_GET_VARS['manufacturers_id']) { ?> <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="2" class="topBarTitle"> <tr> <td width="100%" class="topBarTitle"> <?php echo TOP_BAR_TITLE; ?> </td> </tr> </table></td> </tr> <?php // create column list $define_list = array('PRODUCT_LIST_MODEL' => PRODUCT_LIST_MODEL, 'PRODUCT_LIST_NAME' => PRODUCT_LIST_NAME, 'PRODUCT_LIST_MANUFACTURER' => PRODUCT_LIST_MANUFACTURER, 'PRODUCT_LIST_PRICE' => PRODUCT_LIST_PRICE, 'PRODUCT_LIST_QUANTITY' => PRODUCT_LIST_QUANTITY, 'PRODUCT_LIST_WEIGHT' => PRODUCT_LIST_WEIGHT, 'PRODUCT_LIST_IMAGE' => PRODUCT_LIST_IMAGE, 'PRODUCT_LIST_BUY_NOW' => PRODUCT_LIST_BUY_NOW); asort($define_list); $column_list = array(); reset($define_list); while (list($column, $value) = each($define_list)) { if ($value) $column_list[] = $column; } $select_column_list = ''; for ($col=0; $col<sizeof($column_list); $col++) { if ( ($column_list[$col] == 'PRODUCT_LIST_BUY_NOW') || ($column_list[$col] == 'PRODUCT_LIST_PRICE') ) { continue; } if ($select_column_list != '') { $select_column_list .= ', '; } switch ($column_list[$col]) { case 'PRODUCT_LIST_MODEL': $select_column_list .= 'p.products_model'; break; case 'PRODUCT_LIST_NAME': $select_column_list .= 'pd.products_name'; break; case 'PRODUCT_LIST_MANUFACTURER': $select_column_list .= 'm.manufacturers_name'; break; case 'PRODUCT_LIST_QUANTITY': $select_column_list .= 'p.products_quantity'; break; case 'PRODUCT_LIST_IMAGE': $select_column_list .= 'p.products_image'; break; case 'PRODUCT_LIST_WEIGHT': $select_column_list .= 'p.products_weight'; break; } } if ($select_column_list != '') { $select_column_list .= ', '; } // show the products of a specified manufacturer if ($HTTP_GET_VARS['manufacturers_id']) { if ($HTTP_GET_VARS['filter_id']) { // We are asked to show only a specific category $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, s.specials_new_products_price, IFNULL(s.specials_new_products_price,p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . $HTTP_GET_VARS['manufacturers_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . $languages_id . "' and p2c.categories_id = '" . $HTTP_GET_VARS['filter_id'] . "'"; } else { // We show them all $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, s.specials_new_products_price, IFNULL(s.specials_new_products_price,p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and pd.products_id = p.products_id and pd.language_id = '" . $languages_id . "' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . $HTTP_GET_VARS['manufacturers_id'] . "'"; } // We build the categories-dropdown $filterlist_sql = "select distinct c.categories_id as id, cd.categories_name as name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where p.products_status = '1' and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id and p2c.categories_id = cd.categories_id and cd.language_id = '" . $languages_id . "' and p.manufacturers_id = '" . $HTTP_GET_VARS['manufacturers_id'] . "' order by cd.categories_name"; } else { // show the products in a given categorie if ($HTTP_GET_VARS['filter_id']) { // We are asked to show only specific catgeory $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, s.specials_new_products_price, IFNULL(s.specials_new_products_price,p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . $HTTP_GET_VARS['filter_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . $languages_id . "' and p2c.categories_id = '" . $current_category_id . "'"; } else { // We show them all $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, s.specials_new_products_price, IFNULL(s.specials_new_products_price,p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . $languages_id . "' and p2c.categories_id = '" . $current_category_id . "'"; } // We build the manufacturers Dropdown $filterlist_sql= "select distinct m.manufacturers_id as id, m.manufacturers_name as name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_MANUFACTURERS . " m where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and p.products_id = p2c.products_id and p2c.categories_id = '" . $current_category_id . "' order by m.manufacturers_name"; } if ( (!$HTTP_GET_VARS['sort']) || (!ereg('[1-8][ad]', $HTTP_GET_VARS['sort'])) ) { for ($col=0; $col<sizeof($column_list); $col++) { if ($column_list[$col] == 'PRODUCT_LIST_NAME') { $HTTP_GET_VARS['sort'] = $col+1 . 'a'; $listing_sql .= " order by pd.products_name"; break; } } } else { $sort_col = substr($HTTP_GET_VARS['sort'], 0 , 1); $sort_order = substr($HTTP_GET_VARS['sort'], 1); if ($sort_col <= sizeof($column_list)) { $listing_sql .= ' order by '; switch ($column_list[$sort_col-1]) { case 'PRODUCT_LIST_MODEL': $listing_sql .= "p.products_model " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; case 'PRODUCT_LIST_NAME': $listing_sql .= "pd.products_name " . ($sort_order == 'd' ? "desc" : ""); break; case 'PRODUCT_LIST_MANUFACTURER': $listing_sql .= "m.manufacturers_name " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; case 'PRODUCT_LIST_QUANTITY': $listing_sql .= "p.products_quantity " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; case 'PRODUCT_LIST_IMAGE': $listing_sql .= "pd.products_name"; break; case 'PRODUCT_LIST_WEIGHT': $listing_sql .= "p.products_weight " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; case 'PRODUCT_LIST_PRICE': $listing_sql .= "final_price " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; } } else { for ($col=0; $col<sizeof($column_list); $col++) { if ($column_list[$col] == 'PRODUCT_LIST_NAME') { $HTTP_GET_VARS['sort'] = $col . 'a'; $listing_sql .= " order by pd.products_name"; break; } } } } ?> <tr> <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0"> <form> <tr> <td class="pageHeading"> <?php echo HEADING_TITLE; ?> </td> <?php // optional Product List Filter if (PRODUCT_LIST_FILTER) { $filterlist = tep_db_query($filterlist_sql); if (tep_db_num_rows($filterlist) > 1) { echo ' <td align="center" class="main">' . TEXT_SHOW . '<select size="1" onChange="if(options[selectedIndex].value) window.location.href=(options[selectedIndex].value)">'; if ($HTTP_GET_VARS['manufacturers_id']) { $arguments = 'manufacturers_id=' . $HTTP_GET_VARS['manufacturers_id']; } else { $arguments = 'cPath=' . $cPath; } $arguments .= '&sort=' . $HTTP_GET_VARS['sort']; $option_url = tep_href_link(FILENAME_DEFAULT, $arguments, 'NONSSL'); if (!$HTTP_GET_VARS['filter_id']) { echo '<option value="' . $option_url . '" SELECTED>' . TEXT_ALL . '</option>'; } else { echo '<option value="' . $option_url . '">' . TEXT_ALL . '</option>'; } echo '<option value="">---------------</option>'; while ($filterlist_values = tep_db_fetch_array($filterlist)) { $option_url = tep_href_link(FILENAME_DEFAULT, $arguments . '&filter_id=' . $filterlist_values['id'], 'NONSSL'); if ( ($HTTP_GET_VARS['filter_id']) && ($HTTP_GET_VARS['filter_id'] == $filterlist_values['id']) ) { echo '<option value="' . $option_url . '" SELECTED>' . $filterlist_values['name'] . '</option>'; } else { echo '<option value="' . $option_url . '">' . $filterlist_values['name'] . '</option>'; } } echo '</select></td>' . "n"; } } // Get the right image for the top-right $image = DIR_WS_IMAGES . 'table_background_list.gif'; if ($HTTP_GET_VARS['manufacturers_id']) { $image = tep_db_query("select manufacturers_image from " . TABLE_MANUFACTURERS . " where manufacturers_id = '" . $HTTP_GET_VARS['manufacturers_id'] . "'"); $image = tep_db_fetch_array($image); $image = $image['manufacturers_image']; } elseif ($current_category_id) { $image = tep_db_query("select categories_image from " . TABLE_CATEGORIES . " where categories_id = '" . $current_category_id . "'"); $image = tep_db_fetch_array($image); $image = $image['categories_image']; } ?> <td align="right"> <?php echo tep_image($image, HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?> </td> </tr> </form> </table></td> </tr> <tr> <td><?php echo tep_black_line(); ?></td> </tr> <tr> <td><?php include(DIR_WS_MODULES . FILENAME_PRODUCT_LISTING); ?></td> </tr> </table></td> <?php } else { // default page ?> <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="2" class="topBarTitle"> <tr> <td width="100%" class="topBarTitle"> <?php echo TOP_BAR_TITLE; ?> </td> </tr> </table></td> </tr> <tr> <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td class="pageHeading"> <?php echo HEADING_TITLE; ?> </td> <td align="right"> <?php echo tep_image(DIR_WS_IMAGES . 'table_background_default.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?> </td> </tr> </table></td> </tr> <tr> <td><?php echo tep_black_line(); ?></td> </tr> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr class="subBar"> <td class="subBar"> <?php echo SUB_BAR_TITLE; ?> </td> </tr> <tr> <td><?php echo tep_black_line(); ?></td> </tr> <tr> <td class="main"><?php echo tep_customer_greeting(); ?></td> </tr> <tr> <td class="main"><br><?php if ($language == "english") { $sql = tep_db_query("SELECT front_page_en as text from text_conf where id='1'"); $sql = tep_db_fetch_array($sql); echo $sql['text']; } if ($language == "german") { $sql = tep_db_query("SELECT front_page_de as text from text_conf where id='1'"); $sql = tep_db_fetch_array($sql); echo $sql['text']; } if ($language == "spanish") { $sql = tep_db_query("SELECT front_page_es as text from text_conf where id='1'"); $sql = tep_db_fetch_array($sql); echo $sql['text']; } ?></td> </tr> <?php $new_products_category_id = '0'; include(DIR_WS_MODULES . FILENAME_NEW_PRODUCTS); include(DIR_WS_MODULES . FILENAME_UPCOMING_PRODUCTS); ?> </table></td> </tr> </table></td> <?php } ?> <!-- body_text_eof //--> <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="0"> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> <!-- right_navigation //--> <?php require(DIR_WS_INCLUDES . 'column_right.php'); ?> <!-- right_navigation_eof //--> </table></td> </tr> </table></td> </tr> </table> <!-- body_eof //--> <!-- footer //--> <?php require(DIR_WS_INCLUDES . 'footer.php'); ?> <!-- footer_eof //--> <br> </body> </html> <?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?> Tell me this is wrong and make me happy.......or is this even legal????? Link to comment Share on other sites More sharing options...
Mark Evans Posted October 17, 2002 Share Posted October 17, 2002 Tell me this is wrong and make me happy.......or is this even legal????? Yes this is legal. The copyright messages are still intact and it is released under the GPL. For more detailed discussion you should read the GPL forum. Mark Evans osCommerce Monkey & Lead Guitarist for "Sparky + the Monkeys" (Album on sale in all good record shops) --------------------------------------- Software is like sex: It's better when it's free. (Linus Torvalds) Link to comment Share on other sites More sharing options...
Guest Posted November 12, 2002 Share Posted November 12, 2002 What if they're selling the cart passing it on as theirs. Is this still legal? I would think it would be wrong. Link to comment Share on other sites More sharing options...
Mark Evans Posted November 12, 2002 Share Posted November 12, 2002 What if they're selling the cart passing it on as theirs. Is this still legal? I would think it would be wrong. They can do this as long as they comply with the GPL. You will find some good disucssions on what is allowed / dissallowed in the GPL forum. Mark Evans osCommerce Monkey & Lead Guitarist for "Sparky + the Monkeys" (Album on sale in all good record shops) --------------------------------------- Software is like sex: It's better when it's free. (Linus Torvalds) Link to comment Share on other sites More sharing options...
cyt0plas Posted November 13, 2002 Share Posted November 13, 2002 It is designed for Echo (a processing service), and it's actually free :) Anyhow, they must give back to the community, since I downloaded their service, and was all prepared to hack it to remove echo functionality, and _hey look_ it's oscommerce! So, I promptly went here (after my FREE download), and downloaded oscommerce. As soon as I get paid, I'm making a donation :P Don't be so quick to be angry. Their site may claim it's theirs, that's ok (it's not GPL :) ). The program is fully compliant, and doesn't steal credit at all. Link to comment Share on other sites More sharing options...
onix Posted December 4, 2002 Share Posted December 4, 2002 Yeah, the more versions out there (even if they are color blind) :wink: the better! Lots of killer programming projects have taken off from similar open source projects. maybe echocart will turn out to be even better.... At least it contributes something additional. Link to comment Share on other sites More sharing options...
Guest Posted January 6, 2003 Share Posted January 6, 2003 Are echocart or anyone else allowed to sell the script?? Link to comment Share on other sites More sharing options...
Guest Posted May 9, 2003 Share Posted May 9, 2003 Its been a while since I checked out echo. I was irritated at echo for making trivial changes to osc just because their programmer has different ideas about coding style. If he was inventing new features that would be different. The echo API is complicated, there are a lot of gateways and API's out there. Many charge. Echo is free, which is good. But Why oh Why doesnt echo just offer osc with an echo payment module? What they are doing doesnt make sense to me. Link to comment Share on other sites More sharing options...
seCret steVe Posted May 10, 2003 Author Share Posted May 10, 2003 and i dong like there product at all Link to comment Share on other sites More sharing options...
judgej Posted May 14, 2003 Share Posted May 14, 2003 I was irritated at echo for making trivial changes to osc just because their programmer has different ideas about coding style. Open Source: free, as in speech. I think that's the point of OS - someone using the product does not have to like the way it has been put together and does not have to stick with it as it comes. It is only OS that really does let people add their own mods for whatever reason they like. It's great that they have, and have given full credit where relevant. What they appear to be offering is simplicity. A cart that works with their services right from the word go. No hacking, no diving into the code - just install and go. Whether people like it or not, isn't OS meant to encourage that type of thing? -- JJ Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.