Yes, there is.
Since I can't attach it, below you can find the code that's in it.
<?php
defined('_JEXEC') or die('Restricted access');
?>
<?php
function hikashop_characteristics_html(&$element,&$params,&$obj){
switch($params->get('characteristic_display')){
case 'table':
if(count($obj->characteristics)==2){
$html = '';
$firstCharacteristic = reset($obj->characteristics);
$secondCharacteristic = end($obj->characteristics);
$html.= '<table class="hikashop_product_characteristic_chooser"><tr><td></td>';
if(!empty($secondCharacteristic->values)){
foreach($secondCharacteristic->values as $value){
$html.='<td>'.$value->characteristic_value.'</td>';
}
}
$html.='</tr>';
$obj->options=' onclick="return hikashopUpdateVariantData(this.value);"';
$size=0;
if(!empty($firstCharacteristic->values)){
foreach($firstCharacteristic->values as $value){
$html.='<tr><td style="text-align:right">'.$value->characteristic_value.'</td>';
if(strlen($value->characteristic_value)>$size)$size=strlen($value->characteristic_value);
if(!empty($secondCharacteristic->values)){
foreach($secondCharacteristic->values as $value2){
$class = '';
$classspan = '';
foreach($element->variants as $k => $variant){
$char1 = false;
$char2 = false;
foreach($variant->characteristics as $variantCharacteristic){
if($variantCharacteristic->characteristic_id==$value->characteristic_id){
$char1 = true;
}elseif($variantCharacteristic->characteristic_id==$value2->characteristic_id){
$char2 = true;
}
if($char1&&$char2){
if(!$variant->product_published || $variant->product_quantity==0){
$class = ' hikashop_product_variant_out_of_stock';
$classspan=' hikashop_product_variant_out_of_stock_span';
}
break 2;
}
}
}
$name = '_'.$value->characteristic_id.'_'.$value2->characteristic_id;
$radio="\n\t<span class=\"hikashop_product_characteristic_span".$classspan."\"><input type=\"radio\" class=\"hikashop_product_characteristic".$class."\" name=\"hikashop_product_characteristic\" id=\"hikashop_product_characteristic".$name."\" value=\"".$name."\" ".$obj->options;
if($obj->characteristics[$value->characteristic_parent_id]->default->characteristic_id==$value->characteristic_id && !empty($obj->characteristics[$value2->characteristic_parent_id]->default->characteristic_id) && $obj->characteristics[$value2->characteristic_parent_id]->default->characteristic_id==$value2->characteristic_id){
$radio.=' checked';
}
$radio.=" /></span>";
$html.='<td>'.$radio.'</td>';
}
}
$html.='</tr>';
}
}
$html.='</table>';
if($params->get('characteristic_display_text')){
$space = '';
for($i=0;$i<=$size;$i++){
$space.=' ';
}
$html='<table class="hikashop_product_characteristic_chooser"><tr><td></td><td class="hikashop_charactersitic_name">'.$space.@$secondCharacteristic->characteristic_value.'</td></tr><tr><td class="hikashop_charactersitic_name">'.$firstCharacteristic->characteristic_value.'</td><td>'.$html.'</td></table>';
}
break;
}
default:
case 'radio':
case 'dropdown':
$main_html = '<table class="hikashop_product_characteristics_table">';
$config =& hikashop_config();
foreach($obj->characteristics as $characteristic){
$main_html.='<tr style="vertical-align: top;">';
$values = array();
$switch_done = false;
if(!empty($characteristic->values)){
foreach($characteristic->values as $k => $value){
if(!$config->get('show_out_of_stock',1)){
$hasQuantity = false;
foreach($element->variants as $variant){
foreach($variant->characteristics as $variantCharacteristic){
if($variantCharacteristic->characteristic_id==$value->characteristic_id){
if($variant->product_quantity != 0){
$hasQuantity = true;
}elseif( $element->product_id==$variant->product_id && !$switch_done){
$id = 'hikashop_product_characteristic_'.$characteristic->characteristic_id;
$js = "
window.hikashop.ready( function() {hikashopUpdateVariant(document.getElementById('".$id."'));});";
if (!HIKASHOP_PHP5) {
$doc =& JFactory::getDocument();
}else{
$doc = JFactory::getDocument();
}
$doc->addScriptDeclaration("\n<!--\n".$js."\n//-->\n");
$switch_done = true;
}
}
}
}
if(!$hasQuantity) continue;
}
$values[$k]=$value->characteristic_value;
}
}
$html=$obj->display(@$characteristic->characteristic_id,@$characteristic->default->characteristic_id,$values,$characteristic->characteristic_display_method);
if($params->get('characteristic_display_text') && isset($characteristic->characteristic_value)){
$html=$characteristic->characteristic_value.'</td><td>'.$html;
}
$main_html.='<td>'.$html.'</td></tr>';
}
$main_html.='</table>';
$html = $main_html;
break;
}
return $html;
}
?>