Jump to content
bumbarash

[Contribution] iOSC - mobile version of OSC on your iPhone

Recommended Posts

Jus to add

general.php line is

header('Location: ' . $url);

 

header.php is

<meta charset="<?php echo ((CHARSET == 'utf-8')? CHARSET : MOBILE_CHARSET); ?>" />

Share this post


Link to post
Share on other sites

The line in general.php is trying to do a redirect. This is failing because the line in header.php that you posted has already started outputting the page. The solution is to move the include for general.php above any line that outputs part of the page.

 

Regards

Jim


See my profile for a list of my addons and ways to get support.

Share this post


Link to post
Share on other sites

Hi Rainer,

I've just installed the add-on and am now testing it out for my store… One thing I have found that is bothering me is the behavior of the title tag on the product info page. I do not have an SEO add on installed and am running the latest version of OsC 2.3.3.4…

 

Now on the product_info pages the title is set as the value "products_model" from the database. However I would like the title to behave the same way as on the desktop version -> showing the product's name...

 

Did I miss something in the settings or what do I need to change in the original files?

 

Thanks very much for your support and the contrib!

Share this post


Link to post
Share on other sites

Hi Rainer,

I've just installed the add-on and am now testing it out for my store… One thing I have found that is bothering me is the behavior of the title tag on the product info page. I do not have an SEO add on installed and am running the latest version of OsC 2.3.3.4…

 

Now on the product_info pages the title is set as the value "products_model" from the database. However I would like the title to behave the same way as on the desktop version -> showing the product's name...

 

Did I miss something in the settings or what do I need to change in the original files?

 

Thanks very much for your support and the contrib!

 

Hello Raphael @@rafhun,

 

It seems there is something wrong in your store, the header title is coded to show the product name.

Check in mobile/product_info.php line 45 should be:

$headerTitle->write($product_info['products_name']);

 

regards

Rainer

Edited by raiwa

Share this post


Link to post
Share on other sites

Hello Rainer,

this line is correct in my store. However in the header file the title tag is defined as follows:

 

<title><?php echo $headerTitleText = $breadcrumb->_trail[sizeof($breadcrumb->_trail) - 1]['title']; ?></title>

 

This is line 4 of the mobile/includes/header.php file... Do I have to edit something there?

 

If you'd like to take a look at the test store you can find it here:

http://breakthrough.ch/catalog/product_info.php?products_id=49418

 

Or the direct link to the mobile version:

http://mobile.breakthrough.ch/mobile/product_info.php?products_id=49418

 

As you can see by following the second link, the title is equal to the products_model instead of the name.

 

Thanks for your help!

Share this post


Link to post
Share on other sites

Hello Rainer,

this line is correct in my store. However in the header file the title tag is defined as follows:

 

<title><?php echo $headerTitleText = $breadcrumb->_trail[sizeof($breadcrumb->_trail) - 1]['title']; ?></title>

 

This is line 4 of the mobile/includes/header.php file... Do I have to edit something there?

 

If you'd like to take a look at the test store you can find it here:

http://breakthrough.ch/catalog/product_info.php?products_id=49418

 

Or the direct link to the mobile version:

http://mobile.breakthrough.ch/mobile/product_info.php?products_id=49418

 

As you can see by following the second link, the title is equal to the products_model instead of the name.

 

Thanks for your help!

 

Hello Raphael @@rafhun,

 

Ok I found it. The problem is that the breadcrumb trail which is used for the title, includes only the model and not the product name.

So if you wish to show the product name (without adding the header tags add on), you need to add the following to:

catalog/includes/application_top.php:

find about line 477-487:

// add the products model to the breadcrumb trail
if (isset($HTTP_GET_VARS['products_id'])) {
$model_query = tep_db_query("select products_model from " . TABLE_PRODUCTS . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "'");
if (tep_db_num_rows($model_query)) {
 $model = tep_db_fetch_array($model_query);
 $breadcrumb->add($model['products_model'], tep_href_link(FILENAME_PRODUCT_INFO, 'cPath=' . $cPath . '&products_id=' . $HTTP_GET_VARS['products_id']));
}
}

 

add below:

 

// add the products name to the breadcrumb trail
if (isset($HTTP_GET_VARS['products_id'])) {
$name_query = tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "'");
if (tep_db_num_rows($name_query)) {
 $name = tep_db_fetch_array($name_query);
 $breadcrumb->add($name['products_name'], tep_href_link(FILENAME_PRODUCT_INFO, 'cPath=' . $cPath . '&products_id=' . $HTTP_GET_VARS['products_id']));
}
}

 

I didn't check if this messes up something in other places in the classic site, please check.

 

hope this helps

Rainer

Edited by raiwa

Share this post


Link to post
Share on other sites

$name_query = tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and languages_id = '" . (int)$languages_id . "'");

 

 


This is a signature that appears on all my posts.  
IF YOU MAKE A POST REQUESTING HELP...please state the exact version
of osCommerce that you are using. THANKS

 
Get the latest Responsive osCommerce CE (community edition) here

Share this post


Link to post
Share on other sites

$name_query = tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and languages_id = '" . (int)$languages_id . "'");

 

Thanks @@burt,

Hello Raphael @@rafhun,

 

Small error in the query: should be "and language_id =" instead of "and languages_id =".

 

I also added the mobile session statement to ensure no mess in the classic page.

So the whole code snippet should be:

// add the products name to the breadcrumb trail for mobile
 if (MOBILE_SITE=='True' && isset($HTTP_GET_VARS['products_id'])) {
   $name_query = tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and language_id = '" . (int)$languages_id . "'");
   if (tep_db_num_rows($name_query)) {
  $name = tep_db_fetch_array($name_query);
  $breadcrumb->add($name['products_name'], tep_href_link(FILENAME_PRODUCT_INFO, 'cPath=' . $cPath . '&products_id=' . $HTTP_GET_VARS['products_id']));
   }
 }

 

Please confirm and I will add this in the next update.

 

regards

Rainer

Share this post


Link to post
Share on other sites

Thanks a lot, Rainer, this works perfectly. There are no problems in either the classic or mobile version so far.

In order for the title to be the same as in the classic version I have appended the STORE_NAME constant after the product name:

// add the products name to the breadcrumb trail for mobile if (MOBILE_SITE=='True' && isset($HTTP_GET_VARS['products_id'])) { $name_query = tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and language_id = '" . (int)$languages_id . "'"); if (tep_db_num_rows($name_query)) { $name = tep_db_fetch_array($name_query); $breadcrumb->add($name['products_name'] . ', ' . STORE_NAME, tep_href_link(FILENAME_PRODUCT_INFO, 'cPath=' . $cPath . '&products_id=' . $HTTP_GET_VARS['products_id'])); } }

 

Thanks for your help!

 

Regards,

Raphael

Edited by rafhun

Share this post


Link to post
Share on other sites

Another problem I was able to solve myself was with product images on the product_info page. For me they were not correctly sized therefore overlapping the box. As I do not have any products with multiple images, I do not know how far this is also a problem there, I just changed the "else" part of the statement. The whole image section (around lines 51-93 of mobile/product_info.php) now looks like this for me:

 

<?php
if (tep_not_null($product_info['products_image'])) {
$pi_query = tep_db_query("select image, htmlcontent from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$product_info['products_id'] . "' order by sort_order");
if (tep_db_num_rows($pi_query) > 0) {
?>
<div id="prodImage">
 <?php
 $pi_counter = 0;
 while ($pi = tep_db_fetch_array($pi_query)) {
 $pi_counter++;
 $pi_entry = '	 <a class="fancyLink" data-fancybox-group="group" href="';
 if (tep_not_null($pi['htmlcontent'])) {
 $pi_entry .= '#piGalimg_' . $pi_counter;
 } else {
 $pi_entry .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'images/' . $pi['image'];
 }
 $pi_entry .= '" target="_blank">' . tep_image(DIR_WS_IMAGES . $pi['image'], $product_info['products_name'], MOBILE_IMAGE_WIDTH, MOBILE_IMAGE_HEIGHT) . '</a>';
 if (tep_not_null($pi['htmlcontent'])) {
 $pi_entry .= '<div style="display: none;"><div id="piGalimg_' . $pi_counter . '">' . $pi['htmlcontent'] . '</div>';
 }
 if ($pi_counter == 1) {
 echo $pi_entry;
 }
 }
 ?>
</div>
<?php
} else {
?>
<div id="prodImage">
 <?php echo '<a class="fancyLink" data-fancybox-group="group" href="' . HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'images/' . $product_info['products_image'] . '" target="_blank">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), '100%', '100%') . '</a>'; ?>
</div>
<?php
}
}
?>

 

Thanks to the percentages images are always scaled to fit their box which I think looks nice :)

Share this post


Link to post
Share on other sites

Hi Rainer @@raiwa

 

I've just installed the discount code contribution support. No problems there, but could you add in the instructions that the file discount_code.php needs to be copied into the mobile directory. Maybe I just missed that, but the discount code only works after the file has been copied over… At least if the store is installed on a subdomain… But since it is is only linked relatively I think the file is needed in the directory.

 

Well, that's the quick solution I came up with, if there is something better please let me know…

Share this post


Link to post
Share on other sites

Hello Raphael @@rafhun,

 

For the image in product info:

Yes this is a nice solution for smaller mobile screens, but on bigger tablet screens the image may be resized bigger than the original size and look unsharp.

 

For the discount code add-on:

Yes, a copy of the file discount_code.php should be placed in the mobile directory. I'll fix this in the install file for the next update, thanks.

 

regards

Rainer

Share this post


Link to post
Share on other sites

For the image in product info:

Yes this is a nice solution for smaller mobile screens, but on bigger tablet screens the image may be resized bigger than the original size and look unsharp.

 

OK, I have tweaked my code a little bit, now I get the results I wanted: Images are resized to fill out the space completely but not further than their own dimensions:

 

<?php echo '<a class="fancyLink" data-fancybox-group="group" href="' . HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'images/' . $product_info['products_image'] . '" target="_blank">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), 'auto', 'auto', 'style="max-width:100%; max-height:100%"') . '</a>'; ?>

 

I guess this would also work on line 71 for the case of multiple product images… Have not tested this out though…

Share this post


Link to post
Share on other sites

OK, I have tweaked my code a little bit, now I get the results I wanted: Images are resized to fill out the space completely but not further than their own dimensions:

 

<?php echo '<a class="fancyLink" data-fancybox-group="group" href="' . HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'images/' . $product_info['products_image'] . '" target="_blank">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), 'auto', 'auto', 'style="max-width:100%; max-height:100%"') . '</a>'; ?>

 

I guess this would also work on line 71 for the case of multiple product images… Have not tested this out though…

 

Hello Raphael @@rafhun,

 

Just checked on your store with a normal laptop screen (firefox), and with iphone simulator and found that the image doesn't resize. It looks like the same effect you could get with the original code defining a bigger mobile image size.

 

regards

Rainer

Share this post


Link to post
Share on other sites

Hello Raphael @@rafhun,

 

Just checked on your store with a normal laptop screen (firefox), and with iphone simulator and found that the image doesn't resize. It looks like the same effect you could get with the original code defining a bigger mobile image size.

 

regards

Rainer

 

Strange, for me it works perfectly. I have tested it on my iPhone and in my browser, and the too large images resize perfectly while the ones that are too small are just enlarged to their actual size.

 

If you want to check again, this product has an image that is 1500x1500px originally:

http://mobile.breakthrough.ch/mobile/product_info.php?products_id=49442

 

While the image for this product is only 241x208px:

http://mobile.breakthrough.ch/mobile/product_info.php?products_id=49442

 

I think that it does work :)

Share this post


Link to post
Share on other sites

Strange, for me it works perfectly. I have tested it on my iPhone and in my browser, and the too large images resize perfectly while the ones that are too small are just enlarged to their actual size.

 

If you want to check again, this product has an image that is 1500x1500px originally:

http://mobile.breakthrough.ch/mobile/product_info.php?products_id=49442

 

While the image for this product is only 241x208px:

http://mobile.breakthrough.ch/mobile/product_info.php?products_id=49442

 

I think that it does work :)

 

Hello Raphael @@rafhun,

 

ooops, yes you are right. It seems I was watching only a too small image to see the effect.

 

Nice solution thanks.

 

regards

Rainer

Share this post


Link to post
Share on other sites

Thanks a lot, Rainer, this works perfectly. There are no problems in either the classic or mobile version so far.

In order for the title to be the same as in the classic version I have appended the STORE_NAME constant after the product name:

// add the products name to the breadcrumb trail for mobile if (MOBILE_SITE=='True' && isset($HTTP_GET_VARS['products_id'])) { $name_query = tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and language_id = '" . (int)$languages_id . "'"); if (tep_db_num_rows($name_query)) { $name = tep_db_fetch_array($name_query); $breadcrumb->add($name['products_name'] . ', ' . STORE_NAME, tep_href_link(FILENAME_PRODUCT_INFO, 'cPath=' . $cPath . '&products_id=' . $HTTP_GET_VARS['products_id'])); } }

 

Thanks for your help!

 

Regards,

Raphael

 

Hello again Raphael @@rafhun,

 

Adding the Storename to mobile/includes/header.php line 4 will add the storename to all page titles:

<title><?php echo $headerTitleText = $breadcrumb->_trail[sizeof($breadcrumb->_trail) - 1]['title'] . ', ' . STORE_NAME; ?></title>

 

regards

Rainer

Share this post


Link to post
Share on other sites

Hey i just installed the OSC 2.3.3.4.

Now i have installed the IOSC addon. If i load my Website at my Mobile Phone i get one connection Error:

The side contains too many server redirection

But if i load my Website on The Laptop, then it works fine.

How can i Fix this Problem ?

Edited by Garip47

I'm new Here. Hope to improve my Skills.

Regards Garip

Share this post


Link to post
Share on other sites

Hey i just installed the OSC 2.3.3.4.

Now i have installed the IOSC addon. If i load my Website at my Mobile Phone i get one connection Error:

The side contains too many server redirection

But if i load my Website on The Laptop, then it works fine.

How can i Fix this Problem ?

 

 

Hello Garip @@Garip47,

 

Please check the following:

 

- modifications in the redirect function in catalog/includes/functions/general.php

- if you have SEO URLs installed, did you add the support included in the contribution support package?

- modifications in: catalog/includes/configure.php

- modifications in the tep_href_link function in catalog/includes/functions/html_output.php

 

If you still can't get the error disappear you can post the mentioned files (modified parts) and your store URL here or in a private message.

You can delete the database details at the bottom of includes/configure.php

 

regards

Rainer

Share this post


Link to post
Share on other sites

Hello Garip @@Garip47,

 

Please check the following:

 

- modifications in the redirect function in catalog/includes/functions/general.php

- if you have SEO URLs installed, did you add the support included in the contribution support package?

- modifications in: catalog/includes/configure.php

- modifications in the tep_href_link function in catalog/includes/functions/html_output.php

 

If you still can't get the error disappear you can post the mentioned files (modified parts) and your store URL here or in a private message.

You can delete the database details at the bottom of includes/configure.php

 

regards

Rainer

 

Hey thank u for ur answer. I havn't install the SEO addon.

Here my code's:

 

configure:

<?php
 define('HTTP_SERVER', 'http://www.*******');
 define('HTTPS_SERVER', 'http://www.*******');
 define('ENABLE_SSL', false);
 define('HTTP_COOKIE_DOMAIN', '');
 define('HTTPS_COOKIE_DOMAIN', '');
 define('HTTP_COOKIE_PATH', '/');
 define('HTTPS_COOKIE_PATH', '/');
 define('DIR_WS_HTTP_CATALOG', '/');
 define('DIR_WS_HTTPS_CATALOG', '/');
//BOF Mobile
 define('HTTP_MOBILE_SERVER', 'http://www.*******');
 define('HTTPS_MOBILE_SERVER', 'http://www.*******');
 define('DIR_WS_HTTP_MOBILE', '/');
 define('DIR_WS_HTTPS_MOBILE', '/');
 (defined('MOBILE_SESSION') ? define('DIR_WS_IMAGES', HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'images/') : define('DIR_WS_IMAGES', 'images/'));
 define('DIR_WS_ICONS', DIR_WS_IMAGES . 'icons/');
 (defined('MOBILE_SESSION') ? define('DIR_WS_INCLUDES', '../includes/') : define('DIR_WS_INCLUDES', 'includes/'));
//EOF Mobile
 define('DIR_WS_FUNCTIONS', DIR_WS_INCLUDES . 'functions/');
 define('DIR_WS_CLASSES', DIR_WS_INCLUDES . 'classes/');
 define('DIR_WS_MODULES', DIR_WS_INCLUDES . 'modules/');
//BOF Mobile
 define('DIR_MOBILE_IMAGES', 'images/');
 define('DIR_MOBILE_INCLUDES','includes/');
 define('DIR_MOBILE_MODULES', DIR_MOBILE_INCLUDES . 'modules/');
 define('DIR_MOBILE_CLASSES', DIR_MOBILE_INCLUDES . 'classes/');
 define('DIR_MOBILE_HEADERS', DIR_MOBILE_INCLUDES . 'headers/');
 define('DIR_MOBILE_LANGUAGES', DIR_MOBILE_INCLUDES . 'languages/');
//EOF Mobile
 define('DIR_WS_LANGUAGES', DIR_WS_INCLUDES . 'languages/');
 define('DIR_WS_DOWNLOAD_PUBLIC', 'pub/');
 define('DIR_FS_CATALOG', '/*****/****/*****/htdocs/');
//BOF Mobile
 define('DIR_FS_MOBILE', '/****/****/*******/htdocs/mobile/');
//EOF Mobile
 define('DIR_FS_DOWNLOAD', DIR_FS_CATALOG . 'download/');
//BOF Mobile
 (defined('MOBILE_SESSION') ? define('DIR_WS_DOWNLOAD_PUBLIC', HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'pub/') : define('DIR_WS_DOWNLOAD_PUBLIC', 'pub/')); 
//EOF Mobile
 define('DB_SERVER', '*******');
 define('DB_SERVER_USERNAME', '*******');
 define('DB_SERVER_PASSWORD', '*******');
 define('DB_DATABASE', '*******');
 define('USE_PCONNECT', 'false');
 define('STORE_SESSIONS', 'mysql');
 define('CFG_TIME_ZONE', 'Europe/Berlin');
?>

 

general.php

<?php
/*
 $Id$
 osCommerce, Open Source E-Commerce Solutions
 http://www.oscommerce.com
 Copyright (c) 2012 osCommerce
 Released under the GNU General Public License
*/
////
// Get the installed version number
 function tep_get_version() {
   static $v;
   if (!isset($v)) {
  $v = trim(implode('', file(DIR_FS_CATALOG . 'includes/version.php')));
   }
   return $v;
 }
////
// Stop from parsing any further PHP code
// v2.3.3.1 now closes the session through a registered shutdown function
 function tep_exit() {
  exit();
 }
////
// Redirect to another page or site
 function tep_redirect($url) {
   if ( (strstr($url, "\n") != false) || (strstr($url, "\r") != false) ) {
  tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false));
   }
   if ( (ENABLE_SSL == true) && (getenv('HTTPS') == 'on') ) { // We are loading an SSL page
  if (defined('MOBILE_SESSION')) { // Mobile Side
		 if (substr($url, 0, strlen(HTTP_MOBILE_SERVER . DIR_WS_HTTP_MOBILE)) == HTTP_MOBILE_SERVER . DIR_WS_HTTP_MOBILE) { // NONSSL url
			    $url = HTTPS_MOBILE_SERVER . DIR_WS_HTTPS_MOBILE . substr($url, strlen(HTTP_MOBILE_SERVER . DIR_WS_HTTP_MOBILE)); // Change it to SSL
		 }
  } else { // Desktop Side
		 if (substr($url, 0, strlen(HTTP_SERVER . DIR_WS_HTTP_CATALOG)) == HTTP_SERVER . DIR_WS_HTTP_CATALOG) { // NONSSL url
			    $url = HTTPS_SERVER . DIR_WS_HTTPS_CATALOG . substr($url, strlen(HTTP_SERVER . DIR_WS_HTTP_CATALOG)); // Change it to SSL
		 }
  }
   }
   if ( strpos($url, '&') !== false ) {
  $url = str_replace('&', '&', $url);
   }
   header('Location: ' . $url);
   tep_exit();
 }
////
// Parse the data used in the html tags to ensure the tags will not break
 function tep_parse_input_field_data($data, $parse) {
   return strtr(trim($data), $parse);
 }
 function tep_output_string($string, $translate = false, $protected = false) {
   if ($protected == true) {
  return htmlspecialchars($string);
   } else {
  if ($translate == false) {
    return tep_parse_input_field_data($string, array('"' => '"'));
  } else {
    return tep_parse_input_field_data($string, $translate);
  }
   }
 }
 function tep_output_string_protected($string) {
   return tep_output_string($string, false, true);
 }
 function tep_sanitize_string($string) {
   $patterns = array ('/ +/','/[<>]/');
   $replace = array (' ', '_');
   return preg_replace($patterns, $replace, trim($string));
 }
////
// Return a random row from a database query
 function tep_random_select($query) {
   $random_product = '';
   $random_query = tep_db_query($query);
   $num_rows = tep_db_num_rows($random_query);
   if ($num_rows > 0) {
  $random_row = tep_rand(0, ($num_rows - 1));
  tep_db_data_seek($random_query, $random_row);
  $random_product = tep_db_fetch_array($random_query);
   }
   return $random_product;
 }
////
// Return a product's name
// TABLES: products
 function tep_get_products_name($product_id, $language = '') {
   global $languages_id;
   if (empty($language)) $language = $languages_id;
   $product_query = tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$product_id . "' and language_id = '" . (int)$language . "'");
   $product = tep_db_fetch_array($product_query);
   return $product['products_name'];
 }
////
// Return a product's special price (returns nothing if there is no offer)
// TABLES: products
 function tep_get_products_special_price($product_id) {
   $product_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$product_id . "' and status = 1");
   $product = tep_db_fetch_array($product_query);
   return $product['specials_new_products_price'];
 }
////
// Return a product's stock
// TABLES: products
 function tep_get_products_stock($products_id) {
   $products_id = tep_get_prid($products_id);
   $stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . (int)$products_id . "'");
   $stock_values = tep_db_fetch_array($stock_query);
   return $stock_values['products_quantity'];
 }
////
// Check if the required stock is available
// If insufficent stock is available return an out of stock message
 function tep_check_stock($products_id, $products_quantity) {
   $stock_left = tep_get_products_stock($products_id) - $products_quantity;
   $out_of_stock = '';
   if ($stock_left < 0) {
  $out_of_stock = '<span class="markProductOutOfStock">' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . '</span>';
   }
   return $out_of_stock;
 }
////
// Break a word in a string if it is longer than a specified length ($len)
 function tep_break_string($string, $len, $break_char = '-') {
   $l = 0;
   $output = '';
   for ($i=0, $n=strlen($string); $i<$n; $i++) {
  $char = substr($string, $i, 1);
  if ($char != ' ') {
    $l++;
  } else {
    $l = 0;
  }
  if ($l > $len) {
    $l = 1;
    $output .= $break_char;
  }
  $output .= $char;
   }
   return $output;
 }
////
// Return all HTTP GET variables, except those passed as a parameter
 function tep_get_all_get_params($exclude_array = '') {
   global $HTTP_GET_VARS;
   if (!is_array($exclude_array)) $exclude_array = array();
   $get_url = '';
   if (is_array($HTTP_GET_VARS) && (sizeof($HTTP_GET_VARS) > 0)) {
  reset($HTTP_GET_VARS);
  while (list($key, $value) = each($HTTP_GET_VARS)) {
    if ( is_string($value) && (strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y') ) {
	  $get_url .= $key . '=' . rawurlencode(stripslashes($value)) . '&';
    }
  }
   }
   return $get_url;
 }
////
// Returns an array with countries
// TABLES: countries
 function tep_get_countries($countries_id = '', $with_iso_codes = false) {
   $countries_array = array();
   if (tep_not_null($countries_id)) {
  if ($with_iso_codes == true) {
    $countries = tep_db_query("select countries_name, countries_iso_code_2, countries_iso_code_3 from " . TABLE_COUNTRIES . " where countries_id = '" . (int)$countries_id . "' order by countries_name");
    $countries_values = tep_db_fetch_array($countries);
    $countries_array = array('countries_name' => $countries_values['countries_name'],
							 'countries_iso_code_2' => $countries_values['countries_iso_code_2'],
							 'countries_iso_code_3' => $countries_values['countries_iso_code_3']);
  } else {
    $countries = tep_db_query("select countries_name from " . TABLE_COUNTRIES . " where countries_id = '" . (int)$countries_id . "'");
    $countries_values = tep_db_fetch_array($countries);
    $countries_array = array('countries_name' => $countries_values['countries_name']);
  }
   } else {
  $countries = tep_db_query("select countries_id, countries_name from " . TABLE_COUNTRIES . " order by countries_name");
  while ($countries_values = tep_db_fetch_array($countries)) {
    $countries_array[] = array('countries_id' => $countries_values['countries_id'],
							   'countries_name' => $countries_values['countries_name']);
  }
   }
   return $countries_array;
 }
////
// Alias function to tep_get_countries, which also returns the countries iso codes
 function tep_get_countries_with_iso_codes($countries_id) {
   return tep_get_countries($countries_id, true);
 }
////
// Generate a path to categories
 function tep_get_path($current_category_id = '') {
   global $cPath_array;
   if (tep_not_null($current_category_id)) {
  $cp_size = sizeof($cPath_array);
  if ($cp_size == 0) {
    $cPath_new = $current_category_id;
  } else {
    $cPath_new = '';
    $last_category_query = tep_db_query("select parent_id from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$cPath_array[($cp_size-1)] . "'");
    $last_category = tep_db_fetch_array($last_category_query);
    $current_category_query = tep_db_query("select parent_id from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$current_category_id . "'");
    $current_category = tep_db_fetch_array($current_category_query);
    if ($last_category['parent_id'] == $current_category['parent_id']) {
	  for ($i=0; $i<($cp_size-1); $i++) {
	    $cPath_new .= '_' . $cPath_array[$i];
	  }
    } else {
	  for ($i=0; $i<$cp_size; $i++) {
	    $cPath_new .= '_' . $cPath_array[$i];
	  }
    }
    $cPath_new .= '_' . $current_category_id;
    if (substr($cPath_new, 0, 1) == '_') {
	  $cPath_new = substr($cPath_new, 1);
    }
  }
   } else {
  $cPath_new = implode('_', $cPath_array);
   }
   return 'cPath=' . $cPath_new;
 }
////
// Returns the clients browser
 function tep_browser_detect($component) {
   global $HTTP_USER_AGENT;
   return stristr($HTTP_USER_AGENT, $component);
 }
////
// Alias function to tep_get_countries()
 function tep_get_country_name($country_id) {
   $country_array = tep_get_countries($country_id);
   return $country_array['countries_name'];
 }
////
// Returns the zone (State/Province) name
// TABLES: zones
 function tep_get_zone_name($country_id, $zone_id, $default_zone) {
   $zone_query = tep_db_query("select zone_name from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country_id . "' and zone_id = '" . (int)$zone_id . "'");
   if (tep_db_num_rows($zone_query)) {
  $zone = tep_db_fetch_array($zone_query);
  return $zone['zone_name'];
   } else {
  return $default_zone;
   }
 }
////
// Returns the zone (State/Province) code
// TABLES: zones
 function tep_get_zone_code($country_id, $zone_id, $default_zone) {
   $zone_query = tep_db_query("select zone_code from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country_id . "' and zone_id = '" . (int)$zone_id . "'");
   if (tep_db_num_rows($zone_query)) {
  $zone = tep_db_fetch_array($zone_query);
  return $zone['zone_code'];
   } else {
  return $default_zone;
   }
 }
////
// Wrapper function for round()
 function tep_round($number, $precision) {
   if (strpos($number, '.') && (strlen(substr($number, strpos($number, '.')+1)) > $precision)) {
  $number = substr($number, 0, strpos($number, '.') + 1 + $precision + 1);
  if (substr($number, -1) >= 5) {
    if ($precision > 1) {
	  $number = substr($number, 0, -1) + ('0.' . str_repeat(0, $precision-1) . '1');
    } elseif ($precision == 1) {
	  $number = substr($number, 0, -1) + 0.1;
    } else {
	  $number = substr($number, 0, -1) + 1;
    }
  } else {
    $number = substr($number, 0, -1);
  }
   }
   return $number;
 }
////
// Returns the tax rate for a zone / class
// TABLES: tax_rates, zones_to_geo_zones
 function tep_get_tax_rate($class_id, $country_id = -1, $zone_id = -1) {
   global $customer_zone_id, $customer_country_id;
   static $tax_rates = array();
   if ( ($country_id == -1) && ($zone_id == -1) ) {
  if (!tep_session_is_registered('customer_id')) {
    $country_id = STORE_COUNTRY;
    $zone_id = STORE_ZONE;
  } else {
    $country_id = $customer_country_id;
    $zone_id = $customer_zone_id;
  }
   }
   if (!isset($tax_rates[$class_id][$country_id][$zone_id]['rate'])) {
  $tax_query = tep_db_query("select sum(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' group by tr.tax_priority");
  if (tep_db_num_rows($tax_query)) {
    $tax_multiplier = 1.0;
    while ($tax = tep_db_fetch_array($tax_query)) {
	  $tax_multiplier *= 1.0 + ($tax['tax_rate'] / 100);
    }
    $tax_rates[$class_id][$country_id][$zone_id]['rate'] = ($tax_multiplier - 1.0) * 100;
  } else {
    $tax_rates[$class_id][$country_id][$zone_id]['rate'] = 0;
  }
   }
   return $tax_rates[$class_id][$country_id][$zone_id]['rate'];
 }
////
// Return the tax description for a zone / class
// TABLES: tax_rates;
 function tep_get_tax_description($class_id, $country_id, $zone_id) {
   static $tax_rates = array();
   if (!isset($tax_rates[$class_id][$country_id][$zone_id]['description'])) {
  $tax_query = tep_db_query("select tax_description from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' order by tr.tax_priority");
  if (tep_db_num_rows($tax_query)) {
    $tax_description = '';
    while ($tax = tep_db_fetch_array($tax_query)) {
	  $tax_description .= $tax['tax_description'] . ' + ';
    }
    $tax_description = substr($tax_description, 0, -3);
    $tax_rates[$class_id][$country_id][$zone_id]['description'] = $tax_description;
  } else {
    $tax_rates[$class_id][$country_id][$zone_id]['description'] = TEXT_UNKNOWN_TAX_RATE;
  }
   }
   return $tax_rates[$class_id][$country_id][$zone_id]['description'];
 }
////
// Add tax to a products price
 function tep_add_tax($price, $tax) {
   if ( (DISPLAY_PRICE_WITH_TAX == 'true') && ($tax > 0) ) {
  return $price + tep_calculate_tax($price, $tax);
   } else {
  return $price;
   }
 }
// Calculates Tax rounding the result
 function tep_calculate_tax($price, $tax) {
   return $price * $tax / 100;
 }
////
// Return the number of products in a category
// TABLES: products, products_to_categories, categories
 function tep_count_products_in_category($category_id, $include_inactive = false) {
   $products_count = 0;
   if ($include_inactive == true) {
  $products_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_id = p2c.products_id and p2c.categories_id = '" . (int)$category_id . "'");
   } else {
  $products_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_id = p2c.products_id and p.products_status = '1' and p2c.categories_id = '" . (int)$category_id . "'");
   }
   $products = tep_db_fetch_array($products_query);
   $products_count += $products['total'];
   $child_categories_query = tep_db_query("select categories_id from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$category_id . "'");
   if (tep_db_num_rows($child_categories_query)) {
  while ($child_categories = tep_db_fetch_array($child_categories_query)) {
    $products_count += tep_count_products_in_category($child_categories['categories_id'], $include_inactive);
  }
   }
   return $products_count;
 }
////
// Return true if the category has subcategories
// TABLES: categories
 function tep_has_category_subcategories($category_id) {
   $child_category_query = tep_db_query("select count(*) as count from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$category_id . "'");
   $child_category = tep_db_fetch_array($child_category_query);
   if ($child_category['count'] > 0) {
  return true;
   } else {
  return false;
   }
 }
////
// Returns the address_format_id for the given country
// TABLES: countries;
 function tep_get_address_format_id($country_id) {
   $address_format_query = tep_db_query("select address_format_id as format_id from " . TABLE_COUNTRIES . " where countries_id = '" . (int)$country_id . "'");
   if (tep_db_num_rows($address_format_query)) {
  $address_format = tep_db_fetch_array($address_format_query);
  return $address_format['format_id'];
   } else {
  return '1';
   }
 }
////
// Return a formatted address
// TABLES: address_format
 function tep_address_format($address_format_id, $address, $html, $boln, $eoln) {
   $address_format_query = tep_db_query("select address_format as format from " . TABLE_ADDRESS_FORMAT . " where address_format_id = '" . (int)$address_format_id . "'");
   $address_format = tep_db_fetch_array($address_format_query);
   $company = tep_output_string_protected($address['company']);
   if (isset($address['firstname']) && tep_not_null($address['firstname'])) {
  $firstname = tep_output_string_protected($address['firstname']);
  $lastname = tep_output_string_protected($address['lastname']);
   } elseif (isset($address['name']) && tep_not_null($address['name'])) {
  $firstname = tep_output_string_protected($address['name']);
  $lastname = '';
   } else {
  $firstname = '';
  $lastname = '';
   }
   $street = tep_output_string_protected($address['street_address']);
   $suburb = tep_output_string_protected($address['suburb']);
   $city = tep_output_string_protected($address['city']);
   $state = tep_output_string_protected($address['state']);
   if (isset($address['country_id']) && tep_not_null($address['country_id'])) {
  $country = tep_get_country_name($address['country_id']);
  if (isset($address['zone_id']) && tep_not_null($address['zone_id'])) {
    $state = tep_get_zone_code($address['country_id'], $address['zone_id'], $state);
  }
   } elseif (isset($address['country']) && tep_not_null($address['country'])) {
  $country = tep_output_string_protected($address['country']['title']);
   } else {
  $country = '';
   }
   $postcode = tep_output_string_protected($address['postcode']);
   $zip = $postcode;
   if ($html) {
// HTML Mode
  $HR = '<hr />';
  $hr = '<hr />';
  if ( ($boln == '') && ($eoln == "\n") ) { // Values not specified, use rational defaults
    $CR = '<br />';
    $cr = '<br />';
    $eoln = $cr;
  } else { // Use values supplied
    $CR = $eoln . $boln;
    $cr = $CR;
  }
   } else {
// Text Mode
  $CR = $eoln;
  $cr = $CR;
  $HR = '----------------------------------------';
  $hr = '----------------------------------------';
   }
   $statecomma = '';
   $streets = $street;
   if ($suburb != '') $streets = $street . $cr . $suburb;
   if ($state != '') $statecomma = $state . ', ';
   $fmt = $address_format['format'];
   eval("\$address = \"$fmt\";");
   if ( (ACCOUNT_COMPANY == 'true') && (tep_not_null($company)) ) {
  $address = $company . $cr . $address;
   }
   return $address;
 }
////
// Return a formatted address
// TABLES: customers, address_book
 function tep_address_label($customers_id, $address_id = 1, $html = false, $boln = '', $eoln = "\n") {
   if (is_array($address_id) && !empty($address_id)) {
  return tep_address_format($address_id['address_format_id'], $address_id, $html, $boln, $eoln);
   }
   $address_query = tep_db_query("select entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customers_id . "' and address_book_id = '" . (int)$address_id . "'");
   $address = tep_db_fetch_array($address_query);
   $format_id = tep_get_address_format_id($address['country_id']);
   return tep_address_format($format_id, $address, $html, $boln, $eoln);
 }
 function tep_row_number_format($number) {
   if ( ($number < 10) && (substr($number, 0, 1) != '0') ) $number = '0' . $number;
   return $number;
 }
 function tep_get_categories($categories_array = '', $parent_id = '0', $indent = '') {
   global $languages_id;
   if (!is_array($categories_array)) $categories_array = array();
   $categories_query = tep_db_query("select c.categories_id, cd.categories_name from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where parent_id = '" . (int)$parent_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "' order by sort_order, cd.categories_name");
   while ($categories = tep_db_fetch_array($categories_query)) {
  $categories_array[] = array('id' => $categories['categories_id'],
							  'text' => $indent . $categories['categories_name']);
  if ($categories['categories_id'] != $parent_id) {
    $categories_array = tep_get_categories($categories_array, $categories['categories_id'], $indent . '  ');
  }
   }
   return $categories_array;
 }
 function tep_get_manufacturers($manufacturers_array = '') {
   if (!is_array($manufacturers_array)) $manufacturers_array = array();
   $manufacturers_query = tep_db_query("select manufacturers_id, manufacturers_name from " . TABLE_MANUFACTURERS . " order by manufacturers_name");
   while ($manufacturers = tep_db_fetch_array($manufacturers_query)) {
  $manufacturers_array[] = array('id' => $manufacturers['manufacturers_id'], 'text' => $manufacturers['manufacturers_name']);
   }
   return $manufacturers_array;
 }
////
// Return all subcategory IDs
// TABLES: categories
 function tep_get_subcategories(&$subcategories_array, $parent_id = 0) {
   $subcategories_query = tep_db_query("select categories_id from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$parent_id . "'");
   while ($subcategories = tep_db_fetch_array($subcategories_query)) {
  $subcategories_array[sizeof($subcategories_array)] = $subcategories['categories_id'];
  if ($subcategories['categories_id'] != $parent_id) {
    tep_get_subcategories($subcategories_array, $subcategories['categories_id']);
  }
   }
 }
// Output a raw date string in the selected locale date format
// $raw_date needs to be in this format: YYYY-MM-DD HH:MM:SS
 function tep_date_long($raw_date) {
   if ( ($raw_date == '0000-00-00 00:00:00') || ($raw_date == '') ) return false;
   $year = (int)substr($raw_date, 0, 4);
   $month = (int)substr($raw_date, 5, 2);
   $day = (int)substr($raw_date, 8, 2);
   $hour = (int)substr($raw_date, 11, 2);
   $minute = (int)substr($raw_date, 14, 2);
   $second = (int)substr($raw_date, 17, 2);
   return strftime(DATE_FORMAT_LONG, mktime($hour,$minute,$second,$month,$day,$year));
 }
////
// Output a raw date string in the selected locale date format
// $raw_date needs to be in this format: YYYY-MM-DD HH:MM:SS
// NOTE: Includes a workaround for dates before 01/01/1970 that fail on windows servers
 function tep_date_short($raw_date) {
   if ( ($raw_date == '0000-00-00 00:00:00') || empty($raw_date) ) return false;
   $year = substr($raw_date, 0, 4);
   $month = (int)substr($raw_date, 5, 2);
   $day = (int)substr($raw_date, 8, 2);
   $hour = (int)substr($raw_date, 11, 2);
   $minute = (int)substr($raw_date, 14, 2);
   $second = (int)substr($raw_date, 17, 2);
   if (@[member='date']('Y', mktime($hour, $minute, $second, $month, $day, $year)) == $year) {
  return date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, $year));
   } else {
  return preg_replace('/2037$/', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
   }
 }
////
// Parse search string into indivual objects
 function tep_parse_search_string($search_str = '', &$objects) {
   $search_str = trim(strtolower($search_str));
// Break up $search_str on whitespace; quoted string will be reconstructed later
   $pieces = preg_split('/[[:space:]]+/', $search_str);
   $objects = array();
   $tmpstring = '';
   $flag = '';
   for ($k=0; $k<count($pieces); $k++) {
  while (substr($pieces[$k], 0, 1) == '(') {
    $objects[] = '(';
    if (strlen($pieces[$k]) > 1) {
	  $pieces[$k] = substr($pieces[$k], 1);
    } else {
	  $pieces[$k] = '';
    }
  }
  $post_objects = array();
  while (substr($pieces[$k], -1) == ')')  {
    $post_objects[] = ')';
    if (strlen($pieces[$k]) > 1) {
	  $pieces[$k] = substr($pieces[$k], 0, -1);
    } else {
	  $pieces[$k] = '';
    }
  }
// Check individual words
  if ( (substr($pieces[$k], -1) != '"') && (substr($pieces[$k], 0, 1) != '"') ) {
    $objects[] = trim($pieces[$k]);
    for ($j=0; $j<count($post_objects); $j++) {
	  $objects[] = $post_objects[$j];
    }
  } else {
/* This means that the $piece is either the beginning or the end of a string.
  So, we'll slurp up the $pieces and stick them together until we get to the
  end of the string or run out of pieces.
*/
// Add this word to the $tmpstring, starting the $tmpstring
    $tmpstring = trim(preg_replace('/"/', ' ', $pieces[$k]));
// Check for one possible exception to the rule. That there is a single quoted word.
    if (substr($pieces[$k], -1 ) == '"') {
// Turn the flag off for future iterations
	  $flag = 'off';
	  $objects[] = trim(preg_replace('/"/', ' ', $pieces[$k]));
	  for ($j=0; $j<count($post_objects); $j++) {
	    $objects[] = $post_objects[$j];
	  }
	  unset($tmpstring);
// Stop looking for the end of the string and move onto the next word.
	  continue;
    }
// Otherwise, turn on the flag to indicate no quotes have been found attached to this word in the string.
    $flag = 'on';
// Move on to the next word
    $k++;
// Keep reading until the end of the string as long as the $flag is on
    while ( ($flag == 'on') && ($k < count($pieces)) ) {
	  while (substr($pieces[$k], -1) == ')') {
	    $post_objects[] = ')';
	    if (strlen($pieces[$k]) > 1) {
		  $pieces[$k] = substr($pieces[$k], 0, -1);
	    } else {
		  $pieces[$k] = '';
	    }
	  }
// If the word doesn't end in double quotes, append it to the $tmpstring.
	  if (substr($pieces[$k], -1) != '"') {
// Tack this word onto the current string entity
	    $tmpstring .= ' ' . $pieces[$k];
// Move on to the next word
	    $k++;
	    continue;
	  } else {
/* If the $piece ends in double quotes, strip the double quotes, tack the
  $piece onto the tail of the string, push the $tmpstring onto the $haves,
  kill the $tmpstring, turn the $flag "off", and return.
*/
	    $tmpstring .= ' ' . trim(preg_replace('/"/', ' ', $pieces[$k]));
// Push the $tmpstring onto the array of stuff to search for
	    $objects[] = trim($tmpstring);
	    for ($j=0; $j<count($post_objects); $j++) {
		  $objects[] = $post_objects[$j];
	    }
	    unset($tmpstring);
// Turn off the flag to exit the loop
	    $flag = 'off';
	  }
    }
  }
   }
// add default logical operators if needed
   $temp = array();
   for($i=0; $i<(count($objects)-1); $i++) {
  $temp[] = $objects[$i];
  if ( ($objects[$i] != 'and') &&
	   ($objects[$i] != 'or') &&
	   ($objects[$i] != '(') &&
	   ($objects[$i+1] != 'and') &&
	   ($objects[$i+1] != 'or') &&
	   ($objects[$i+1] != ')') ) {
    $temp[] = ADVANCED_SEARCH_DEFAULT_OPERATOR;
  }
   }
   $temp[] = $objects[$i];
   $objects = $temp;
   $keyword_count = 0;
   $operator_count = 0;
   $balance = 0;
   for($i=0; $i<count($objects); $i++) {
  if ($objects[$i] == '(') $balance --;
  if ($objects[$i] == ')') $balance ++;
  if ( ($objects[$i] == 'and') || ($objects[$i] == 'or') ) {
    $operator_count ++;
  } elseif ( ($objects[$i]) && ($objects[$i] != '(') && ($objects[$i] != ')') ) {
    $keyword_count ++;
  }
   }
   if ( ($operator_count < $keyword_count) && ($balance == 0) ) {
  return true;
   } else {
  return false;
   }
 }
////
// Check date
 function tep_checkdate($date_to_check, $format_string, &$date_array) {
   $separator_idx = -1;
   $separators = array('-', ' ', '/', '.');
   $month_abbr = array('jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec');
   $no_of_days = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
   $format_string = strtolower($format_string);
   if (strlen($date_to_check) != strlen($format_string)) {
  return false;
   }
   $size = sizeof($separators);
   for ($i=0; $i<$size; $i++) {
  $pos_separator = strpos($date_to_check, $separators[$i]);
  if ($pos_separator != false) {
    $date_separator_idx = $i;
    break;
  }
   }
   for ($i=0; $i<$size; $i++) {
  $pos_separator = strpos($format_string, $separators[$i]);
  if ($pos_separator != false) {
    $format_separator_idx = $i;
    break;
  }
   }
   if ($date_separator_idx != $format_separator_idx) {
  return false;
   }
   if ($date_separator_idx != -1) {
  $format_string_array = explode( $separators[$date_separator_idx], $format_string );
  if (sizeof($format_string_array) != 3) {
    return false;
  }
  $date_to_check_array = explode( $separators[$date_separator_idx], $date_to_check );
  if (sizeof($date_to_check_array) != 3) {
    return false;
  }
  $size = sizeof($format_string_array);
  for ($i=0; $i<$size; $i++) {
    if ($format_string_array[$i] == 'mm' || $format_string_array[$i] == 'mmm') $month = $date_to_check_array[$i];
    if ($format_string_array[$i] == 'dd') $day = $date_to_check_array[$i];
    if ( ($format_string_array[$i] == 'yyyy') || ($format_string_array[$i] == 'aaaa') ) $year = $date_to_check_array[$i];
  }
   } else {
  if (strlen($format_string) == 8 || strlen($format_string) == 9) {
    $pos_month = strpos($format_string, 'mmm');
    if ($pos_month != false) {
	  $month = substr( $date_to_check, $pos_month, 3 );
	  $size = sizeof($month_abbr);
	  for ($i=0; $i<$size; $i++) {
	    if ($month == $month_abbr[$i]) {
		  $month = $i;
		  break;
	    }
	  }
    } else {
	  $month = substr($date_to_check, strpos($format_string, 'mm'), 2);
    }
  } else {
    return false;
  }
  $day = substr($date_to_check, strpos($format_string, 'dd'), 2);
  $year = substr($date_to_check, strpos($format_string, 'yyyy'), 4);
   }
   if (strlen($year) != 4) {
  return false;
   }
   if (!settype($year, 'integer') || !settype($month, 'integer') || !settype($day, 'integer')) {
  return false;
   }
   if ($month > 12 || $month < 1) {
  return false;
   }
   if ($day < 1) {
  return false;
   }
   if (tep_is_leap_year($year)) {
  $no_of_days[1] = 29;
   }
   if ($day > $no_of_days[$month - 1]) {
  return false;
   }
   $date_array = array($year, $month, $day);
   return true;
 }
////
// Check if year is a leap year
 function tep_is_leap_year($year) {
   if ($year % 100 == 0) {
  if ($year % 400 == 0) return true;
   } else {
  if (($year % 4) == 0) return true;
   }
   return false;
 }
////
// Return table heading with sorting capabilities
 function tep_create_sort_heading($sortby, $colnum, $heading) {
   global $PHP_SELF;
   $sort_prefix = '';
   $sort_suffix = '';
   if ($sortby) {
  $sort_prefix = '<a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('page', 'info', 'sort')) . 'page=1&sort=' . $colnum . ($sortby == $colnum . 'a' ? 'd' : 'a')) . '" title="' . tep_output_string(TEXT_SORT_PRODUCTS . ($sortby == $colnum . 'd' || substr($sortby, 0, 1) != $colnum ? TEXT_ASCENDINGLY : TEXT_DESCENDINGLY) . TEXT_BY . $heading) . '" class="productListing-heading">' ;
  $sort_suffix = (substr($sortby, 0, 1) == $colnum ? (substr($sortby, 1, 1) == 'a' ? '+' : '-') : '') . '</a>';
   }
   return $sort_prefix . $heading . $sort_suffix;
 }
////
// Recursively go through the categories and retreive all parent categories IDs
// TABLES: categories
 function tep_get_parent_categories(&$categories, $categories_id) {
   $parent_categories_query = tep_db_query("select parent_id from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$categories_id . "'");
   while ($parent_categories = tep_db_fetch_array($parent_categories_query)) {
  if ($parent_categories['parent_id'] == 0) return true;
  $categories[sizeof($categories)] = $parent_categories['parent_id'];
  if ($parent_categories['parent_id'] != $categories_id) {
    tep_get_parent_categories($categories, $parent_categories['parent_id']);
  }
   }
 }
////
// Construct a category path to the product
// TABLES: products_to_categories
 function tep_get_product_path($products_id) {
   $cPath = '';
   $category_query = tep_db_query("select p2c.categories_id from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_id = '" . (int)$products_id . "' and p.products_status = '1' and p.products_id = p2c.products_id limit 1");
   if (tep_db_num_rows($category_query)) {
  $category = tep_db_fetch_array($category_query);
  $categories = array();
  tep_get_parent_categories($categories, $category['categories_id']);
  $categories = array_reverse($categories);
  $cPath = implode('_', $categories);
  if (tep_not_null($cPath)) $cPath .= '_';
  $cPath .= $category['categories_id'];
   }
   return $cPath;
 }
////
// Return a product ID with attributes
 function tep_get_uprid($prid, $params) {
   if (is_numeric($prid)) {
  $uprid = (int)$prid;
  if (is_array($params) && (sizeof($params) > 0)) {
    $attributes_check = true;
    $attributes_ids = '';
    reset($params);
    while (list($option, $value) = each($params)) {
	  if (is_numeric($option) && is_numeric($value)) {
	    $attributes_ids .= '{' . (int)$option . '}' . (int)$value;
	  } else {
	    $attributes_check = false;
	    break;
	  }
    }
    if ($attributes_check == true) {
	  $uprid .= $attributes_ids;
    }
  }
   } else {
  $uprid = tep_get_prid($prid);
  if (is_numeric($uprid)) {
    if (strpos($prid, '{') !== false) {
	  $attributes_check = true;
	  $attributes_ids = '';
// strpos()+1 to remove up to and including the first { which would create an empty array element in explode()
	  $attributes = explode('{', substr($prid, strpos($prid, '{')+1));
	  for ($i=0, $n=sizeof($attributes); $i<$n; $i++) {
	    $pair = explode('}', $attributes[$i]);
	    if (is_numeric($pair[0]) && is_numeric($pair[1])) {
		  $attributes_ids .= '{' . (int)$pair[0] . '}' . (int)$pair[1];
	    } else {
		  $attributes_check = false;
		  break;
	    }
	  }
	  if ($attributes_check == true) {
	    $uprid .= $attributes_ids;
	  }
    }
  } else {
    return false;
  }
   }
   return $uprid;
 }
////
// Return a product ID from a product ID with attributes
 function tep_get_prid($uprid) {
   $pieces = explode('{', $uprid);
   if (is_numeric($pieces[0])) {
  return (int)$pieces[0];
   } else {
  return false;
   }
 }
////
// Return a customer greeting
 function tep_customer_greeting() {
   global $customer_id, $customer_first_name;
   if (tep_session_is_registered('customer_first_name') && tep_session_is_registered('customer_id')) {
  $greeting_string = sprintf(TEXT_GREETING_PERSONAL, tep_output_string_protected($customer_first_name), tep_href_link(FILENAME_PRODUCTS_NEW));
   } else {
  $greeting_string = sprintf(TEXT_GREETING_GUEST, tep_href_link(FILENAME_LOGIN, '', 'SSL'), tep_href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL'));
   }
   return $greeting_string;
 }
////
//! Send email (text/html) using MIME
// This is the central mail function. The SMTP Server should be configured
// correct in php.ini
// Parameters:
// $to_name		   The name of the recipient, e.g. "Jan Wildeboer"
// $to_email_address  The eMail address of the recipient,
//				    e.g. jan.wildeboer@[member='gmx526'].de
// $email_subject	 The subject of the eMail
// $email_text	    The text of the eMail, may contain HTML entities
// $from_email_name   The name of the sender, e.g. Shop Administration
// $from_email_adress The eMail address of the sender,
//				    e.g. info@mytepshop.com
 function tep_mail($to_name, $to_email_address, $email_subject, $email_text, $from_email_name, $from_email_address) {
   if (SEND_EMAILS != 'true') return false;
   // Instantiate a new mail object
   $message = new email(array('X-Mailer: osCommerce'));
   // Build the text version
   $text = strip_tags($email_text);
   if (EMAIL_USE_HTML == 'true') {
  $message->add_html($email_text, $text);
   } else {
  $message->add_text($text);
   }
   // Send message
   $message->build_message();
   $message->send($to_name, $to_email_address, $from_email_name, $from_email_address, $email_subject);
 }
////
// Check if product has attributes
 function tep_has_product_attributes($products_id) {
   $attributes_query = tep_db_query("select count(*) as count from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$products_id . "'");
   $attributes = tep_db_fetch_array($attributes_query);
   if ($attributes['count'] > 0) {
  return true;
   } else {
  return false;
   }
 }
////
// Get the number of times a word/character is present in a string
 function tep_word_count($string, $needle) {
   $temp_array = preg_split('/' . $needle . '/', $string);
   return sizeof($temp_array);
 }
 function tep_count_modules($modules = '') {
   $count = 0;
   if (empty($modules)) return $count;
   $modules_array = explode(';', $modules);
   for ($i=0, $n=sizeof($modules_array); $i<$n; $i++) {
  $class = substr($modules_array[$i], 0, strrpos($modules_array[$i], '.'));
  if (isset($GLOBALS[$class]) && is_object($GLOBALS[$class])) {
    if ($GLOBALS[$class]->enabled) {
	  $count++;
    }
  }
   }
   return $count;
 }
 function tep_count_payment_modules() {
   return tep_count_modules(MODULE_PAYMENT_INSTALLED);
 }
 function tep_count_shipping_modules() {
   return tep_count_modules(MODULE_SHIPPING_INSTALLED);
 }
 function tep_create_random_value($length, $type = 'mixed') {
   if ( ($type != 'mixed') && ($type != 'chars') && ($type != 'digits')) $type = 'mixed';
   $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
   $digits = '0123456789';
   $base = '';
   if ( ($type == 'mixed') || ($type == 'chars') ) {
  $base .= $chars;
   }
   if ( ($type == 'mixed') || ($type == 'digits') ) {
  $base .= $digits;
   }
   $value = '';
   if (!class_exists('PasswordHash')) {
  include(DIR_WS_CLASSES . 'passwordhash.php');
   }
   $hasher = new PasswordHash(10, true);
   do {
  $random = base64_encode($hasher->get_random_bytes($length));
  for ($i = 0, $n = strlen($random); $i < $n; $i++) {
    $char = substr($random, $i, 1);
    if ( strpos($base, $char) !== false ) {
	  $value .= $char;
    }
  }
   } while ( strlen($value) < $length );
   if ( strlen($value) > $length ) {
  $value = substr($value, 0, $length);
   }
   return $value;
 }
 function tep_array_to_string($array, $exclude = '', $equals = '=', $separator = '&') {
   if (!is_array($exclude)) $exclude = array();
   $get_string = '';
   if (sizeof($array) > 0) {
  while (list($key, $value) = each($array)) {
    if ( (!in_array($key, $exclude)) && ($key != 'x') && ($key != 'y') ) {
	  $get_string .= $key . $equals . $value . $separator;
    }
  }
  $remove_chars = strlen($separator);
  $get_string = substr($get_string, 0, -$remove_chars);
   }
   return $get_string;
 }
 function tep_not_null($value) {
   if (is_array($value)) {
  if (sizeof($value) > 0) {
    return true;
  } else {
    return false;
  }
   } else {
  if (($value != '') && (strtolower($value) != 'null') && (strlen(trim($value)) > 0)) {
    return true;
  } else {
    return false;
  }
   }
 }
////
// Output the tax percentage with optional padded decimals
 function tep_display_tax_value($value, $padding = TAX_DECIMAL_PLACES) {
   if (strpos($value, '.')) {
  $loop = true;
  while ($loop) {
    if (substr($value, -1) == '0') {
	  $value = substr($value, 0, -1);
    } else {
	  $loop = false;
	  if (substr($value, -1) == '.') {
	    $value = substr($value, 0, -1);
	  }
    }
  }
   }
   if ($padding > 0) {
  if ($decimal_pos = strpos($value, '.')) {
    $decimals = strlen(substr($value, ($decimal_pos+1)));
    for ($i=$decimals; $i<$padding; $i++) {
	  $value .= '0';
    }
  } else {
    $value .= '.';
    for ($i=0; $i<$padding; $i++) {
	  $value .= '0';
    }
  }
   }
   return $value;
 }
////
// Checks to see if the currency code exists as a currency
// TABLES: currencies
 function tep_currency_exists($code) {
   $code = tep_db_prepare_input($code);
   $currency_query = tep_db_query("select code from " . TABLE_CURRENCIES . " where code = '" . tep_db_input($code) . "' limit 1");
   if (tep_db_num_rows($currency_query)) {
  $currency = tep_db_fetch_array($currency_query);
  return $currency['code'];
   } else {
  return false;
   }
 }
 function tep_string_to_int($string) {
   return (int)$string;
 }
////
// Parse and secure the cPath parameter values
 function tep_parse_category_path($cPath) {
// make sure the category IDs are integers
   $cPath_array = array_map('tep_string_to_int', explode('_', $cPath));
// make sure no duplicate category IDs exist which could lock the server in a loop
   $tmp_array = array();
   $n = sizeof($cPath_array);
   for ($i=0; $i<$n; $i++) {
  if (!in_array($cPath_array[$i], $tmp_array)) {
    $tmp_array[] = $cPath_array[$i];
  }
   }
   return $tmp_array;
 }
////
// Return a random value
 function tep_rand($min = null, $max = null) {
   static $seeded;
   if (!isset($seeded)) {
  $seeded = true;
  if ( (PHP_VERSION < '4.2.0') ) {
    mt_srand((double)microtime()*1000000);
  }
   }
   if (isset($min) && isset($max)) {
  if ($min >= $max) {
    return $min;
  } else {
    return mt_rand($min, $max);
  }
   } else {
  return mt_rand();
   }
 }
 function tep_setcookie($name, $value = '', $expire = 0, $path = '/', $domain = '', $secure = 0) {
   setcookie($name, $value, $expire, $path, (tep_not_null($domain) ? $domain : ''), $secure);
 }
 function tep_validate_ip_address($ip_address) {
   if (function_exists('filter_var') && defined('FILTER_VALIDATE_IP')) {
  return filter_var($ip_address, FILTER_VALIDATE_IP, array('flags' => FILTER_FLAG_IPV4));
   }
   if (preg_match('/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $ip_address)) {
  $parts = explode('.', $ip_address);
  foreach ($parts as $ip_parts) {
    if ( (intval($ip_parts) > 255) || (intval($ip_parts) < 0) ) {
	  return false; // number is not within 0-255
    }
  }
  return true;
   }
   return false;
 }
 function tep_get_ip_address() {
   global $HTTP_SERVER_VARS;
   $ip_address = null;
   $ip_addresses = array();
   if (isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']) && !empty($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])) {
  foreach ( array_reverse(explode(',', $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])) as $x_ip ) {
    $x_ip = trim($x_ip);
    if (tep_validate_ip_address($x_ip)) {
	  $ip_addresses[] = $x_ip;
    }
  }
   }
   if (isset($HTTP_SERVER_VARS['HTTP_CLIENT_IP']) && !empty($HTTP_SERVER_VARS['HTTP_CLIENT_IP'])) {
  $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_CLIENT_IP'];
   }
   if (isset($HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP']) && !empty($HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP'])) {
  $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP'];
   }
   if (isset($HTTP_SERVER_VARS['HTTP_PROXY_USER']) && !empty($HTTP_SERVER_VARS['HTTP_PROXY_USER'])) {
  $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_PROXY_USER'];
   }
   $ip_addresses[] = $HTTP_SERVER_VARS['REMOTE_ADDR'];
   foreach ( $ip_addresses as $ip ) {
  if (!empty($ip) && tep_validate_ip_address($ip)) {
    $ip_address = $ip;
    break;
  }
   }
   return $ip_address;
 }
 function tep_count_customer_orders($id = '', $check_session = true) {
   global $customer_id, $languages_id;
   if (is_numeric($id) == false) {
  if (tep_session_is_registered('customer_id')) {
    $id = $customer_id;
  } else {
    return 0;
  }
   }
   if ($check_session == true) {
  if ( (tep_session_is_registered('customer_id') == false) || ($id != $customer_id) ) {
    return 0;
  }
   }
   $orders_check_query = tep_db_query("select count(*) as total from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_STATUS . " s where o.customers_id = '" . (int)$id . "' and o.orders_status = s.orders_status_id and s.language_id = '" . (int)$languages_id . "' and s.public_flag = '1'");
   $orders_check = tep_db_fetch_array($orders_check_query);
   return $orders_check['total'];
 }
 function tep_count_customer_address_book_entries($id = '', $check_session = true) {
   global $customer_id;
   if (is_numeric($id) == false) {
  if (tep_session_is_registered('customer_id')) {
    $id = $customer_id;
  } else {
    return 0;
  }
   }
   if ($check_session == true) {
  if ( (tep_session_is_registered('customer_id') == false) || ($id != $customer_id) ) {
    return 0;
  }
   }
   $addresses_query = tep_db_query("select count(*) as total from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$id . "'");
   $addresses = tep_db_fetch_array($addresses_query);
   return $addresses['total'];
 }
// nl2br() prior PHP 4.2.0 did not convert linefeeds on all OSs (it only converted \n)
 function tep_convert_linefeeds($from, $to, $string) {
   if ((PHP_VERSION < "4.0.5") && is_array($from)) {
  return preg_replace('/(' . implode('|', $from) . ')/', $to, $string);
   } else {
  return str_replace($from, $to, $string);
   }
 }
?>

 

html_ouput.php

<?php
/*
 $Id$
 osCommerce, Open Source E-Commerce Solutions
 http://www.oscommerce.com
 Copyright (c) 2010 osCommerce
 Released under the GNU General Public License
*/
////
// The HTML href link wrapper function
 function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
   global $request_type, $session_started, $SID;
   $page = tep_output_string($page);
   if (!tep_not_null($page)) {
  die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine the page link!<br /><br />');
   }
   defined('MOBILE_SESSION') ? $mobile_directory = HTTP_MOBILE_SERVER . DIR_WS_HTTP_MOBILE : $mobile_directory = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
   defined('MOBILE_SESSION') ? $mobile_secure_directory = HTTPS_MOBILE_SERVER . DIR_WS_HTTPS_MOBILE : $mobile_secure_directory = HTTPS_SERVER . DIR_WS_HTTPS_CATALOG;
   if ($connection == 'NONSSL') {
  $link = $mobile_directory;
   } elseif ($connection == 'SSL') {
  if (ENABLE_SSL == true) {
    $link = $mobile_secure_directory;
  } else {
    $link = $mobile_directory;
  }
   } else {
  die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine connection method on a link!<br /><br />Known methods: NONSSL SSL</strong><br /><br />');
   }
   if (tep_not_null($parameters)) {
  $link .= $page . '?' . tep_output_string($parameters);
  $separator = '&';
   } else {
  $link .= $page;
  $separator = '?';
   }
   while ( (substr($link, -1) == '&') || (substr($link, -1) == '?') ) $link = substr($link, 0, -1);
// Add the session ID when moving from different HTTP and HTTPS servers, or when SID is defined
   if ( ($add_session_id == true) && ($session_started == true) && (SESSION_FORCE_COOKIE_USE == 'False') ) {
  if (tep_not_null($SID)) {
    $_sid = $SID;
  } elseif ( ( ($request_type == 'NONSSL') && ($connection == 'SSL') && (ENABLE_SSL == true) ) || ( ($request_type == 'SSL') && ($connection == 'NONSSL') ) ) {
    if (HTTP_COOKIE_DOMAIN != HTTPS_COOKIE_DOMAIN) {
	  $_sid = tep_session_name() . '=' . tep_session_id();
    }
  }
   }
   if (isset($_sid)) {
  $link .= $separator . tep_output_string($_sid);
   }
   while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);
   if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
  $link = str_replace('?', '/', $link);
  $link = str_replace('&', '/', $link);
  $link = str_replace('=', '/', $link);
   } else {
  $link = str_replace('&', '&', $link);
   }
   return $link;
 }
////
// The HTML image wrapper function
 function tep_image($src, $alt = '', $width = '', $height = '', $parameters = '') {
   if ( (empty($src) || ($src == DIR_WS_IMAGES)) && (IMAGE_REQUIRED == 'false') ) {
  return false;
   }
// alt is added to the img tag even if it is null to prevent browsers from outputting
// the image filename as default
   $image = '<img src="' . tep_output_string($src) . '" alt="' . tep_output_string($alt) . '"';
   if (tep_not_null($alt)) {
  $image .= ' title="' . tep_output_string($alt) . '"';
   }
   if ( (CONFIG_CALCULATE_IMAGE_SIZE == 'true') && (empty($width) || empty($height)) ) {
  if ($image_size = @getimagesize($src)) {
    if (empty($width) && tep_not_null($height)) {
	  $ratio = $height / $image_size[1];
	  $width = intval($image_size[0] * $ratio);
    } elseif (tep_not_null($width) && empty($height)) {
	  $ratio = $width / $image_size[0];
	  $height = intval($image_size[1] * $ratio);
    } elseif (empty($width) && empty($height)) {
	  $width = $image_size[0];
	  $height = $image_size[1];
    }
  } elseif (IMAGE_REQUIRED == 'false') {
    return false;
  }
   }
   if (tep_not_null($width) && tep_not_null($height)) {
  $image .= ' width="' . tep_output_string($width) . '" height="' . tep_output_string($height) . '"';
   }
   if (tep_not_null($parameters)) $image .= ' ' . $parameters;
   $image .= ' />';
   return $image;
 }
////
// The HTML form submit button wrapper function
// Outputs a button in the selected language
 function tep_image_submit($image, $alt = '', $parameters = '') {
   global $language;
   $image_submit = '<input type="image" src="' . tep_output_string(DIR_WS_LANGUAGES . $language . '/images/buttons/' . $image) . '" alt="' . tep_output_string($alt) . '"';
   if (tep_not_null($alt)) $image_submit .= ' title=" ' . tep_output_string($alt) . ' "';
   if (tep_not_null($parameters)) $image_submit .= ' ' . $parameters;
   $image_submit .= ' />';
   return $image_submit;
 }
////
// Output a function button in the selected language
 function tep_image_button($image, $alt = '', $parameters = '') {
   global $language;
   return tep_image(DIR_WS_LANGUAGES . $language . '/images/buttons/' . $image, $alt, '', '', $parameters);
 }
////
// Output a separator either through whitespace, or with an image
 function tep_draw_separator($image = 'pixel_black.gif', $width = '100%', $height = '1') {
   return tep_image(DIR_WS_IMAGES . $image, '', $width, $height);
 }
////
// Output a form
 function tep_draw_form($name, $action, $method = 'post', $parameters = '', $tokenize = false) {
   global $sessiontoken;
   $form = '<form name="' . tep_output_string($name) . '" action="' . tep_output_string($action) . '" method="' . tep_output_string($method) . '"';
   if (tep_not_null($parameters)) $form .= ' ' . $parameters;
   $form .= '>';
   if ( ($tokenize == true) && isset($sessiontoken) ) {
  $form .= '<input type="hidden" name="formid" value="' . tep_output_string($sessiontoken) . '" />';
   }
   return $form;
 }
////
// Output a form input field
 function tep_draw_input_field($name, $value = '', $parameters = '', $type = 'text', $reinsert_value = true) {
   global $HTTP_GET_VARS, $HTTP_POST_VARS;
   $field = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"';
   if ( ($reinsert_value == true) && ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) ) {
  if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
    $value = stripslashes($HTTP_GET_VARS[$name]);
  } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
    $value = stripslashes($HTTP_POST_VARS[$name]);
  }
   }
   if (tep_not_null($value)) {
  $field .= ' value="' . tep_output_string($value) . '"';
   }
   if (tep_not_null($parameters)) $field .= ' ' . $parameters;
   $field .= ' />';
   return $field;
 }
////
// Output a form password field
 function tep_draw_password_field($name, $value = '', $parameters = 'maxlength="40"') {
   return tep_draw_input_field($name, $value, $parameters, 'password', false);
 }
////
// Output a selection field - alias function for tep_draw_checkbox_field() and tep_draw_radio_field()
 function tep_draw_selection_field($name, $type, $value = '', $checked = false, $parameters = '') {
   global $HTTP_GET_VARS, $HTTP_POST_VARS;
   $selection = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"';
   if (tep_not_null($value)) $selection .= ' value="' . tep_output_string($value) . '"';
   if ( ($checked == true) || (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name]) && (($HTTP_GET_VARS[$name] == 'on') || (stripslashes($HTTP_GET_VARS[$name]) == $value))) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name]) && (($HTTP_POST_VARS[$name] == 'on') || (stripslashes($HTTP_POST_VARS[$name]) == $value))) ) {
  $selection .= ' checked="checked"';
   }
   if (tep_not_null($parameters)) $selection .= ' ' . $parameters;
   $selection .= ' />';
   return $selection;
 }
////
// Output a form checkbox field
 function tep_draw_checkbox_field($name, $value = '', $checked = false, $parameters = '') {
   return tep_draw_selection_field($name, 'checkbox', $value, $checked, $parameters);
 }
////
// Output a form radio field
 function tep_draw_radio_field($name, $value = '', $checked = false, $parameters = '') {
   return tep_draw_selection_field($name, 'radio', $value, $checked, $parameters);
 }
////
// Output a form textarea field
// The $wrap parameter is no longer used in the core xhtml template
 function tep_draw_textarea_field($name, $wrap, $width, $height, $text = '', $parameters = '', $reinsert_value = true) {
   global $HTTP_GET_VARS, $HTTP_POST_VARS;
   $field = '<textarea name="' . tep_output_string($name) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"';
   if (tep_not_null($parameters)) $field .= ' ' . $parameters;
   $field .= '>';
   if ( ($reinsert_value == true) && ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) ) {
  if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
    $field .= tep_output_string_protected(stripslashes($HTTP_GET_VARS[$name]));
  } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
    $field .= tep_output_string_protected(stripslashes($HTTP_POST_VARS[$name]));
  }
   } elseif (tep_not_null($text)) {
  $field .= tep_output_string_protected($text);
   }
   $field .= '</textarea>';
   return $field;
 }
////
// Output a form hidden field
 function tep_draw_hidden_field($name, $value = '', $parameters = '') {
   global $HTTP_GET_VARS, $HTTP_POST_VARS;
   $field = '<input type="hidden" name="' . tep_output_string($name) . '"';
   if (tep_not_null($value)) {
  $field .= ' value="' . tep_output_string($value) . '"';
   } elseif ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) {
  if ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) ) {
    $field .= ' value="' . tep_output_string(stripslashes($HTTP_GET_VARS[$name])) . '"';
  } elseif ( (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) {
    $field .= ' value="' . tep_output_string(stripslashes($HTTP_POST_VARS[$name])) . '"';
  }
   }
   if (tep_not_null($parameters)) $field .= ' ' . $parameters;
   $field .= ' />';
   return $field;
 }
////
// Hide form elements
 function tep_hide_session_id() {
   global $session_started, $SID;
   if (($session_started == true) && tep_not_null($SID)) {
  return tep_draw_hidden_field(tep_session_name(), tep_session_id());
   }
 }
////
// Output a form pull down menu
 function tep_draw_pull_down_menu($name, $values, $default = '', $parameters = '', $required = false) {
   global $HTTP_GET_VARS, $HTTP_POST_VARS;
   $field = '<select name="' . tep_output_string($name) . '"';
   if (tep_not_null($parameters)) $field .= ' ' . $parameters;
   $field .= '>';
   if (empty($default) && ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) ) {
  if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
    $default = stripslashes($HTTP_GET_VARS[$name]);
  } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
    $default = stripslashes($HTTP_POST_VARS[$name]);
  }
   }
   for ($i=0, $n=sizeof($values); $i<$n; $i++) {
  $field .= '<option value="' . tep_output_string($values[$i]['id']) . '"';
  if ($default == $values[$i]['id']) {
    $field .= ' selected="selected"';
  }
  $field .= '>' . tep_output_string($values[$i]['text'], array('"' => '"', '\'' => ''', '<' => '<', '>' => '>')) . '</option>';
   }
   $field .= '</select>';
   if ($required == true) $field .= TEXT_FIELD_REQUIRED;
   return $field;
 }
////
// Creates a pull-down list of countries
 function tep_get_country_list($name, $selected = '', $parameters = '') {
   $countries_array = array(array('id' => '', 'text' => PULL_DOWN_DEFAULT));
   $countries = tep_get_countries();
   for ($i=0, $n=sizeof($countries); $i<$n; $i++) {
  $countries_array[] = array('id' => $countries[$i]['countries_id'], 'text' => $countries[$i]['countries_name']);
   }
   return tep_draw_pull_down_menu($name, $countries_array, $selected, $parameters);
 }
////
// Output a jQuery UI Button
 function tep_draw_button($title = null, $icon = null, $link = null, $priority = null, $params = null) {
   static $button_counter = 1;
   $types = array('submit', 'button', 'reset');
   if ( !isset($params['type']) ) {
  $params['type'] = 'submit';
   }
   if ( !in_array($params['type'], $types) ) {
  $params['type'] = 'submit';
   }
   if ( ($params['type'] == 'submit') && isset($link) ) {
  $params['type'] = 'button';
   }
   if (!isset($priority)) {
  $priority = 'secondary';
   }
   $button = '<span class="tdbLink">';
   if ( ($params['type'] == 'button') && isset($link) ) {
  $button .= '<a id="tdb' . $button_counter . '" href="' . $link . '"';
  if ( isset($params['newwindow']) ) {
    $button .= ' target="_blank"';
  }
   } else {
  $button .= '<button id="tdb' . $button_counter . '" type="' . tep_output_string($params['type']) . '"';
   }
   if ( isset($params['params']) ) {
  $button .= ' ' . $params['params'];
   }
   $button .= '>' . $title;
   if ( ($params['type'] == 'button') && isset($link) ) {
  $button .= '</a>';
   } else {
  $button .= '</button>';
   }
   $button .= '</span><script type="text/javascript">$("#tdb' . $button_counter . '").button(';
   $args = array();
   if ( isset($icon) ) {
  if ( !isset($params['iconpos']) ) {
    $params['iconpos'] = 'left';
  }
  if ( $params['iconpos'] == 'left' ) {
    $args[] = 'icons:{primary:"ui-icon-' . $icon . '"}';
  } else {
    $args[] = 'icons:{secondary:"ui-icon-' . $icon . '"}';
  }
   }
   if (empty($title)) {
  $args[] = 'text:false';
   }
   if (!empty($args)) {
  $button .= '{' . implode(',', $args) . '}';
   }
   $button .= ').addClass("ui-priority-' . $priority . '").parent().removeClass("tdbLink");</script>';
   $button_counter++;
   return $button;
 }
?>

 

Thank you


I'm new Here. Hope to improve my Skills.

Regards Garip

Share this post


Link to post
Share on other sites

Hey thank u for ur answer. I havn't install the SEO addon.

 

 

Thank you

 

Hello Garip @@Garip47,

 

On the first look and supposing you have the mobile site installed in the subdirectory"mobile", in configure.php it should be:

define('DIR_WS_HTTP_MOBILE', '/mobile/');
define('DIR_WS_HTTPS_MOBILE', '/mobile/');

 

regards

Rainer

Edited by raiwa

Share this post


Link to post
Share on other sites

Hello Garip @@Garip47,

 

On the first look and supposing you have the mobile site installed in the subdirectory"mobile", in configure.php it should be:

define('DIR_WS_HTTP_MOBILE', '/mobile/');
define('DIR_WS_HTTPS_MOBILE', '/mobile/');

 

regards

Rainer

 

Thank you. Now i didnt get a Error but i get a invalid page.

I send u a Private message with the Link


I'm new Here. Hope to improve my Skills.

Regards Garip

Share this post


Link to post
Share on other sites

@@raiwa Is there a way to stop the caching ?

The reason is I have modified the search.php to auto focus on the search box (which then pops up the keypad automatically on a mobile) but the focus does not work unless you refresh the page.

 

The code I am using is

   <script>
$(document).ready(function(){
   $('#keywords').focus();
})
   </script>

 

I have tried various variations to get the focus to work but in all cases it will only focus after a refresh.

 

Any suggestions on how to get this to work with the need to refresh?

Share this post


Link to post
Share on other sites

@@raiwa Is there a way to stop the caching ?

The reason is I have modified the search.php to auto focus on the search box (which then pops up the keypad automatically on a mobile) but the focus does not work unless you refresh the page.

 

The code I am using is

<script>
$(document).ready(function(){
$('#keywords').focus();
})
</script>

 

I have tried various variations to get the focus to work but in all cases it will only focus after a refresh.

 

Any suggestions on how to get this to work with the need to refresh?

 

Hello @@ShaGGy,

 

Try to deactivate the ajax page load for the search page.

See the instructions in the Add-On support doc, point 11B.

 

regards

Rainer

Share this post


Link to post
Share on other sites

Hello @@ShaGGy,

 

Try to deactivate the ajax page load for the search page.

See the instructions in the Add-On support doc, point 11B.

 

regards

Rainer

 

thanks @@raiwa tried || substr(basename($PHP_SELF), 0, 6) == 'search' but seems to ignore it ?

but if i disable ajax (for all mobile site) in the admin it then works?

 

is the line above correct.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×