var slideSpeed = 1000;
var dropdownSettings = new Object({
  minRows: 1,
  maxRows: 100,
  targetColumnSize: 2,
  openFx: 'fadeIn',
  openSpeed: 300,
  closeFx: 'fadeOut',
  closeSpeed: 300,
  valueAttr: 'value'
});

var checkboxSettings = new Object({
  empty: '/images/contact/empty.png'
});

var productGroupList;
var dealerList;
var productList;
var productPreview;
var productDropdown;
var categoryDropdown;
var subcategoryDropdown;
var submitbutton_clicked = false;
var pID;

function isProductRequest() {
  if($('#check_subject_product').attr('checked') || $('#check_subject_product_group').attr('checked')) {
    return true;
  } else {
    return false;
  }
}

function checkIfProductRequest() {
  if(isProductRequest()) {
    $('#plzsearch').slideDown(slideSpeed);
    $('#check_subject_question').attr('disabled', true);
    $('.comment span.required').hide();
  } else if(!($('#check_subject_product').attr('checked')) && !($('#check_subject_product_group').attr('checked'))) {
    $('#plzsearch').slideUp(slideSpeed);
    $('#check_subject_question').attr('disabled', false);
    $('.comment span.required').show();
  } else {
    $('.comment span.required').show();
  }
}

function ProductGroupList() {
  var self = this;
  
  this.jQuery_element = $('#subject_product_group');
  
  this.getSelectedProductGroups = function() {
    var selectedElements = new Array();
    self.jQuery_element.find('input:checkbox:checked[name=product_groups]').each(function() {
      selectedElements.push($(this).attr('value'));
    });
    return selectedElements;
  };
  
  /* Returns if subject type 'product_group' is selected */
  this.subjectSelected = function() {
    return $('#check_subject_product_group:checked').length;
  };
  
  /* Returns if a product_group entry is selected */
  this.entrySelected = function() {
    return self.jQuery_element.find('input:checkbox:checked[name=product_groups]').length;
  };
  
  /* Returns if another request type (e.g. product) is selected */
  this.anotherSubjectSelected = function() {
    return $('#subject_list > li > :checkbox:checked:not(#check_subject_product_group)').length;
  };
}

function Product(id, name, image_url, description) {
  var self = this;
  this.id == id;
  this.name = name;
  this.image_url = image_url;
  this.description = description;
  
  this.equals = function(product_to_compare) {
    if(
      self.id == product_to_compare.id &&
      self.name == product_to_compare.name &&
      self.image_url == product_to_compare.image_url &&
      self.description == product_to_compare.description
    ) return true;
    return false;
  }
}

function ProductList(parent_element) {
  var self = this;
  
  this.jQuery_element = $('<table id="product_list"></table>').appendTo(parent_element);
  this.displayed_products = new Array();
  
  /* Checks the subject type 'product' - only for using in preset mode (parameter pID is set) */
  this.selectSubject = function() {
    $('#subject_product div.subject_content').show();
    $('#plzsearch').show();
    $('#check_subject_product').attr('checked', true);
  };
  
  /* Returns if subject type 'product' is selected */
  this.subjectSelected = function() {
    return $('#check_subject_product:checked').length;
  };
  
  /* Returns if a product is selected */
  this.entrySelected = function() {
    return self.displayed_products.length;
  };
  
  /* Returns if another request type (e.g. product_group) is selected */
  this.anotherSubjectSelected = function() {
    return $('#subject_list > li > :checkbox:checked:not(#check_subject_product)').length;
  };
  
  this.getSelectedProducts = function() {
    return self.displayed_products;
  }
  
  this.addProduct = function(product) {
    var product_in_array = false;
    
    for(var i = 0; i < self.displayed_products.length; i++) {
      if(product.equals(self.displayed_products[i])) {
        product_in_array = true;
      }
    }
    
    if(!product_in_array) {
      self.displayed_products.push(product);
      
      var added_tr = $('<tr></tr>').appendTo(self.jQuery_element);
      
      var append_code = '<td class="image"></td>' +
                        '<td class="name"><b>' + product.name + '</b><p>' + product.description + '</p></td>' +
                        '<td class="description"><a class="iconlink show_details" href="#" title="' + product.name + '">Produktdetails anzeigen</a></td>' +
                        '<td class="remove_link"><a class="iconlink remove" href="#">Löschen</a></td>';
      
      $(append_code).appendTo(added_tr);
      
      if(product.image_url) added_tr.find('td.image').append('<img class="product_image" src="' + product.image_url + '" title="' + product.description + '" alt="' + product.name + '" />');
      
      added_tr.find('td.description a.show_details').click(function() {
        var productDetails = new ProductDetails(product.details);
        
        return false;
      });
      
      added_tr.find('td.remove_link a.remove').bind('click', function() {
        self.removeProduct(added_tr, product);
        
        return false;
      });
      
      if(parent_element.css('display') == 'none') {
        parent_element.show();
      }
    }
  };
  
  this.addProductByID = function( id ) {
    if(!id) { return false; }
    
    $.getJSON(
      '/cgi/ajax/api_single_product.cgi', // URL
      { product: id }, // Params
      function(data) { // Callback
        if (data.result && !data.error) {
          var product = ajax_product_request_handler(data.result.products.product);
          self.addProduct(product);
          self.selectSubject();
        }
      }
    );
  };
  
  this.removeProduct = function(tr, product) {
    for(var i = 0; i < self.displayed_products.length; i++) {
      if(product.equals(self.displayed_products[i])) {
        self.displayed_products.splice(i,1);
      }
    }
    
    tr.remove();
    
    if(!self.jQuery_element.find('tr').length) {
      parent_element.hide();
    }
  };
}

function CategoryDropdown() {
  var self = this;
  
  this.dropdown;
  
  this.addCategories = function(categories) {
    $('#menu_category').children().remove();
    
    self.removeSelection();
    
    $.each(categories.categories.category, function(i, item) {
      $('<li class="mc_root" value="' + item.$id + '">' + item.$name + '</li>').appendTo('#menu_category').bind('click', item, function(e) {
        if(typeof item.category == 'undefined') {
          subcategoryDropdown.removeSelection();
          subcategoryDropdown.disable(true);
          productDropdown.loadProducts(e.data.$id);
        } else {
          subcategoryDropdown.addCategories(item.category);
          subcategoryDropdown.disable(false);
        }
      });
    });
    
    self.dropdown = $('#selectbox_category').mcDropdown('#menu_category', dropdownSettings);
    
    $('#menu_category').width('340px');
    $('#selectbox_category').siblings('a').width('289px');
  };
  
  this.removeSelection = function() {
    if(self.dropdown) self.dropdown.html('');
    subcategoryDropdown.disable(true);
  };
}

function SubcategoryDropdown() {
  var self = this;
  
  this.dropdown;
  
  this.addCategories = function(categories) {
    $('#menu_subcategory').children().remove();
    
    self.removeSelection();
    
    if(categories.length) {
      $.each(categories, function(i, item) {
        $('<li class="mc_root" value="' + item.$id + '">' + item.$name + '</li>').appendTo('#menu_subcategory').bind('click', item.$id, function(e) {
          productDropdown.loadProducts(e.data);
        });
      });
    } else {
      var item = categories;
      $('<li class="mc_root" value="' + item.$id + '">' + item.$name + '</li>').appendTo('#menu_subcategory').bind('click', item.$id, function(e) {
        productDropdown.loadProducts(e.data);
      });
    }
    
    self.dropdown = $('#selectbox_subcategory').mcDropdown('#menu_subcategory', dropdownSettings);
    $('#menu_subcategory').width('340px');
    $('#selectbox_subcategory').siblings('a').width('289px');
  };
  
  this.removeSelection = function() {
    if(self.dropdown) $('#selectbox_subcategory').siblings('div').html('Unterkategorie auswählen');
  };
  
  this.disable = function(bool) {
    if(self.dropdown) self.dropdown.disable(bool);
  };
}

function ProductDropdown(productPreview) {
  var self = this;
  
  this.dropdown;
  
  this.addProducts = function(products) {
    $('#menu_product').children().remove();
    
    self.removeSelection();
    
    for(var i = 0; i < products.length; i++) {
      var product = products[i];
      $('<li class="mc_root" value="' + i + 1 + '">' + product.name + '</li>').appendTo('#menu_product').bind('click', product, function(e) {
        productPreview.addProduct(e.data);
      });
    }
    
    $('#selectbox_product').mcDropdown('#menu_product', dropdownSettings);
    $('#menu_product').width('600px');
    
    $('#selectbox_product').mcDropdown().disable(false);
    $('#selectbox_product').siblings('a').width('289px');
    
    self.dropdown = $('#selectbox_product').siblings('div');
  };
  
  this.loadProducts = function(subcategory_id) {
    var product_list = new Array();
    
    $.getJSON(
      '/cgi/ajax/api_products.cgi', // URL
      { category: subcategory_id }, // Params
      function(data) { // Callback
        if (data.result && !data.error) {
          if(data.result.products.product.$id) {
            var product = ajax_product_request_handler(data.result.products.product);
            
            product.description = data.result.products.product.description.$t;
            product_list.push(product);
          } else {
            $.each(data.result.products.product, function(i,item) {
              var product = ajax_product_request_handler(item);
              
              product.description = item.description.$t;
              product_list.push(product);
            });
          }
          
          productDropdown.addProducts(product_list);
        }
      }
    );
  };
  
  this.removeSelection = function() {
    if(self.dropdown) self.dropdown.html('Modell auswählen');
  };
}

function ProductPreview() {
  var self = this;
  
  this.show = function() {
    $('#product_preview').css('visibility', 'visible');
  };
  
  this.hide = function() {
    $('#product_preview').css('visibility', 'hidden');
  };
  
  this.addProduct = function(product) {
    self.product = product;
    if(product.image_url) {
      $('#product_preview img').attr('src', product.image_url).css('display', 'block');
    } else {
      $('#product_preview img').css('display', 'none');
    }
    $('#product_preview div strong').text(product.name);
    $('#product_preview div p').text(product.description);
    self.show();
    
    $('#link_add_product a.add_product').unbind('click').bind('click', product, function(e) {
      productList.addProduct(e.data);
      self.hide();
      self.removeProduct();
      productDropdown.removeSelection();
      
      return false;
    });
  };
  
  this.removeProduct = function() {
    self.product = null;
    $('#link_add_product a.add_product').unbind('click');
  };
}

function ProductDetails(details) {
  var self = this;
  
  this.addDetail = function(description, value, important) {
    if(description.indexOf('Feature') > -1) {
      self.addFeature(value);
    } else {
      var appendCode = '<tr class="data"><td class="description">' + description + '</td><td class="value">' + value + '</td></tr>';
      if(important) {
        $(appendCode).appendTo(self.jQuery_element.find('table.technical_data'));
      } else {
        $(appendCode).appendTo(self.jQuery_element.find('table.all_technical_data'));
      }
    }
  };
  
  this.addFeature = function(text) {
    var appendCode = '<li><span>' + text + '</span></li>';
    $(appendCode).appendTo(self.jQuery_element.find('div.features ul'));
  };
  
  $('#product_details').remove();
  
  self.jQuery_element = $('<div id="product_details"></div>').appendTo('body');
  
  $('<div id="product_description">' +
      '<div class="text">' +
        '<h2>' + details.brand.$t + ' - ' + details.name.$t + '</h2>' +
        '<p class="description">' +
          details.long_description.$t +
        '</p>' +
      '</div>' +
      '<div class="image"></div>' +
      '<div class="clear"></div>' +
    '</div>' +
    '<div id="product_data_headlines">' +
      '<h3>Technische Daten</h3>' +
      '<h3>Features</h3>' +
    '</div>' +
    '<div id="product_data">'+ 
      '<div class="inner_content">' +
        '<div class="technical_data">' +
          '<table class="technical_data" cellspacing="0" cellpadding="0" border="0"></table>' +
          '<div class="switch">' +
            '<a class="iconlink show_details" href="#" title="» alle technischen Daten anzeigen">alle technischen Daten anzeigen</a>' +
          '</div>' +
          '<div class="all_technical_data">' +
            '<table class="all_technical_data" cellspacing="0" cellpadding="0"></table>' +
          '</div>' +
        '</div>' +
        '<div class="features">' +
          '<ul></ul>' +
        '</div>' +
        '<div class="clear"></div>' +
      '</div>' +
    '</div>' +
    '<p class="legend">' +
      '<span>j</span> = im Lieferumfang, <span>o</span> = optional, <span>n</span> = nicht verfügbar' +
    '</p>'
  ).appendTo(this.jQuery_element);
  
  if(details.images.image) {
    var image_url;
    
    if(details.images.image.length) {
      $.each(details.images.image, function(i, this_variant) {
        if(this_variant.$position == '0') {
          image_url = this_variant.variants.normal.$t;
        }
      });
    } else {
      image_url = details.images.image.variants.normal.$t;
    }
    
    self.jQuery_element.find('div.image').append('<img src="' + image_url + '"/><p>Abbildung ähnlich.</p>');
  }
  
  self.jQuery_element.find('.tabs > span a').click(function() {
    self.showTab(self.jQuery_element.find('.tabs > span a').index($(this)));
    
    return false;
  });
  
  self.jQuery_element.find('div.switch a.show_details').click(function() {
    if(self.jQuery_element.find('div.all_technical_data').is(':visible')) {
      self.jQuery_element.find('div.all_technical_data').hide();
      self.jQuery_element.find('table.all_technical_data').hide();
      $(this).text('alle technischen Daten anzeigen').attr('title', '» alle technischen Daten anzeigen').removeClass('hide_details').addClass('show_details');
    } else {
      self.jQuery_element.find('div.all_technical_data').show();
      self.jQuery_element.find('table.all_technical_data').show();
      $(this).text('alle technischen Daten ausblenden').attr('title', '» alle technischen Daten ausblenden').removeClass('show_details').addClass('hide_details');
    }
    
    return false;
  });
  
  $.each(details.additional, function(i,item) {
    self.addDetail(item.description.$t, item.value.$t, item.$important);
  });
  
  $('#colorbox').removeClass('premium');
  
  $.fn.colorbox({
    width: '830px',
    height: '85%',
    inline: true,
    opacity: 2/3,
    href: '#product_details',
    open: true
  });
}

function Dealer(id, name, street, city, range, distance, premium) {
  this.id = id;
  this.name = name;
  this.street = street;
  this.city = city;
  this.range = range;
  this.distance = distance;
  this.premium = premium;
  this.selected;
}

function DealerList(parent_element) {
  var self = this;
  
  this.parent_element = parent_element;
  this.displayed_dealer = new Array();
  
  this.getSelected = function() {
    var selected_dealer = new Array();
    
    $.each(self.displayed_dealer, function(i) {
      if(self.displayed_dealer[i].selected) {
        selected_dealer.push(this);
      }
    });
    
    return selected_dealer;
  };
  
  this.entrySelected = function() {
    var entrySelected = false;
    
    $.each(self.displayed_dealer, function(i) {
      if(self.displayed_dealer[i].selected) {
        entrySelected = true;
      }
    });
    
    return entrySelected;
  };
  
  this.setSelected = function(id, selected) {
    $.each(self.displayed_dealer, function(i) {
      if(this.id == id) {
        self.displayed_dealer[i].selected = selected;
      }
    });
  };
  
  this.addDealer = function(dealer) {
    self.displayed_dealer.push(dealer);
    
    var append_code;
    
    if(dealer.premium) {
      append_code = '<div class="dealer_entry premium"></div>';
    } else {
      append_code = '<div class="dealer_entry"></div>';
    }
    
    var newEntry = $(append_code).appendTo(parent_element);
    
    $('<input name="check_dealer" id="check_dealer_' + dealer.id + '" type="checkbox" value="' + dealer.id + '" />' +
      '<a class="iconlink show_details" href="#" title="» Händlerdetails anzeigen">Händlerdetails anzeigen</a>' +
      '<div class="dealer_details">' +
        '<address>' +
          '<strong>' + dealer.name + '</strong>' +
          dealer.street + '<br />' +
          dealer.city +
        '</address>' +
        '<span class="product_range_label">Sortiment:</span>' +
        '<span class="product_range">' + dealer.range + '</span>' +
        '<br />' +
        '<span class="product_distance_label">Entfernung:</span>' +
        '<span class="product_distance">' + dealer.distance + ' km</span>' +
      '</div>'
    ).appendTo(newEntry);
    
    newEntry.children('a.show_details').attr('href', '/cgi/dealer_search.cgi?action=dealer_details&id=' + dealer.id).attr('title', dealer.name).click(function() {
      if(dealer.premium) {
        $('#colorbox').addClass('premium');
      } else {
        $('#colorbox').removeClass('premium');
      }
      
      $.fn.colorbox({
        height: '490px',
        width: '850px',
        opacity: 2/3,
        title: dealer.name,
        href: '/cgi/dealer_search.cgi?action=dealer_details&id=' + dealer.id,
        iframe: true,
        open: true
      });
      
      return false;
    });
    
    if(dealer.premium) {
      newEntry.append('<img class="premium_logo" src="/images/contact/premium.gif" title="Premium Händler" alt="Premium Händler" />');
    }
    
    if(parent_element.css('display') == 'none') {
      parent_element.slideDown(slideSpeed);
    }
    
    // stylish checkboxes and check / uncheck event binding
    newEntry.find('input[type=checkbox]').checkbox(checkboxSettings).bind('check', dealer.id, function(e) {
      $(this).parent().addClass('active');
      self.setSelected(e.data, true);
    }).bind('uncheck', dealer.id, function(e) {
      $(this).parent().removeClass('active');
      self.setSelected(e.data, false);
    });
  };
  
  this.removeAllDealers = function() {
    while (self.displayed_dealer.length) {
      self.displayed_dealer.pop();
    }
    
    parent_element.children('div.dealer_entry').remove();
  };
  
  this.setError = function(error) {
    self.html('Fehler: ' + error);
  }
}

function getURLParam(strParamName) {
  var strReturn = '';
  var strHref = window.location.href;
  
  if (strHref.indexOf('?') > -1) {
    var strQueryString = strHref.substr(strHref.indexOf('?'));
    var aQueryString = strQueryString.split('&');
    
    for ( var iParam = 0; iParam < aQueryString.length; iParam++ ) {
      if (aQueryString[iParam].indexOf(strParamName + '=') > -1 ) {
        var aParam = aQueryString[iParam].split('=');
        strReturn = aParam[1];
        break;
      }
    }
  }
  
  return strReturn;
}

function ajax_product_request_handler(item) {
  var product = new Product();
  product.id = item.$id;
  product.name = item.name.$t;
  product.details = item;
  product.description = item.description.$t;
  
  if(item.images.image) {
    if(item.images.image.length) {
      $.each(item.images.image, function(i,this_variant) {
        if(this_variant.$position == '0') {
          product.image_url = this_variant.variants.small.$t;
        }
      });
    } else {
      product.image_url = item.images.image.variants.small.$t;
    }
  }
  
  return product;
}

$(document).ready(function() {
  productList = new ProductList($('#request_products'));
  productPreview = new ProductPreview();
  productDropdown = new ProductDropdown(productPreview);
  categoryDropdown = new CategoryDropdown();
  subcategoryDropdown = new SubcategoryDropdown();
  productGroupList = new ProductGroupList();
  
  $('body').append('<ul id="menu_category" class="mcdropdown_menu"></ul><ul id="menu_subcategory" class="mcdropdown_menu"></ul><ul id="menu_product" class="mcdropdown_menu"></ul>');
  
  dealerList = new DealerList($('#dealer_area'));
  
  pID = getURLParam('pID');
  
  if(pID) {
    $.getJSON(
      '/cgi/ajax/api_single_product.cgi', // URL
      { product: pID }, // Params
      function(data) { // Callback
        if (data.result && !data.error) {
          var product = ajax_product_request_handler(data.result.products.product);
          
          productPreview.addProduct(product);
          productList.addProduct(product);
          productList.selectSubject();
          
          $.scrollTo($('#plzsearch'), 2000, { offset: -10 });
          
          $('#search_plz').focus();
        }
      }
    );
  }
  
  $('input[type=checkbox]').checkbox(checkboxSettings).bind('disable', function() {
    this.checked = false;
  });
  
  $('#check_subject_product_group').bind('check', function() {
    checkIfProductRequest();
    $('#check_subject_question').attr('disabled', true);
    $(this).siblings('div.subject_content').slideDown(slideSpeed);
  }).bind('uncheck', function() {
    checkIfProductRequest();
    $(this).siblings('div.subject_content').slideUp(slideSpeed);
  }).bind('disable', function() {
    $('#subject_product_group').addClass('disabled');
  }).bind('enable', function() {
    $('#subject_product_group').removeClass('disabled');
  });
  
  $('#check_subject_product').bind('check', function() {
    checkIfProductRequest();
    $('#check_subject_question').attr('disabled', true);
    $(this).siblings('div.subject_content').slideDown(slideSpeed);
  }).bind('uncheck', function() {
    checkIfProductRequest();
    $(this).siblings('div.subject_content').slideUp(slideSpeed);
  }).bind('disable', function() {
    $('#subject_product').addClass('disabled');
  }).bind('enable', function() {
    $('#subject_product').removeClass('disabled');
  });
  
  $('#check_subject_question').bind('check', function() {
    $('#check_subject_product').attr('disabled', true);
    $('#check_subject_product_group').attr('disabled', true);
    $(this).siblings('div.subject_content').slideDown(slideSpeed);
  }).bind('uncheck', function() {
    $('#check_subject_product').attr('disabled', false);
    $('#check_subject_product_group').attr('disabled', false);
    $(this).siblings('div.subject_content').slideUp(slideSpeed);
  }).bind('disable', function() {
    $('#subject_question').addClass('disabled');
  }).bind('enable', function() {
    $('#subject_question').removeClass('disabled');
  });
  
  $('#testrun').bind('check', function() {
    $('div.telephone span.required').show();
  }).bind('uncheck', function() {
    $('div.telephone span.required').hide();
  });
  
  categoryDropdown.addCategories(categories);
  
  $('#selectbox_subcategory').mcDropdown('#menu_subcategory', dropdownSettings);
  $('#selectbox_product').mcDropdown('#menu_product', dropdownSettings);
  
  $('#selectbox_subcategory').mcDropdown().disable(true);
  $('#selectbox_product').mcDropdown().disable(true);
  
  $('#plzsearch_button').click(function() {
    $('#search_plz').focus();
    
    if($('#plzsearch #search_plz').valid()) {
      dealerList.removeAllDealers(); // Clear list of available dealers
      var zip = $('input#search_plz').val();
      $.getJSON(
        '/cgi/ajax/search_retailer.cgi', // URL
        { plz: zip, product_groups: [ productGroupList.getSelectedProductGroups() ] }, // Params
        function(data) { // Callback
          if (data.result && !data.error) {
            $.each(data.result, function(i, item) {
              var dealer = new Dealer(item.ID, item.name, item.address, item.zip + ' ' + item.place, item.all_product_groups, item.dist, item.premium); // Create new dealer object and append it to the list
              dealerList.addDealer(dealer);
              if (i == 3) return false;
            });
          }
        }
      );
    }
    
    return false;
  });
  
  $('#search_plz').keydown(function(e) {
    if(e.keyCode == 13) {
      $('a#plzsearch_button').trigger('click');
    }
  }).mask('99999', { placeholder: '' }); // Mask input field
  
  $('#postal-or-zip-code').mask('99999', { placeholder: '' }); // Mask input field
  
  /***** Custom validation conditions *****/
  
  /* Checks if a dealer to request is selected */
  jQuery.validator.addMethod('dealerSelected', function(value, element) {
    return dealerList.entrySelected();
  });
  
  /* Checks if a product to request is selected */
  jQuery.validator.addMethod('productSelected', function(value, element) {
    return productList.displayed_products.length;
  });
  
  /* Checks if a product group to request is selected */
  jQuery.validator.addMethod('productGroupSelected', function(value, element) {
    return productGroupList.entrySelected();
  });
  
  $('#contact_form').validate({
    errorClass: 'errorfield',
    submitHandler: function(form) {
      $('#contact_form').append('<div id="product_request_loading_overlay"></div><div id="product_request_loading_animation"></div><div id="product_request_loading_messages"></div>');
      $('#contact_form div#product_request_loading_overlay').css({ opacity: 0.6 });
      
      if(!productGroupList.subjectSelected() && !productList.subjectSelected()) {
        $('#your_subject input#check_subject_question').attr('checked', true);
      }
      
      var selected_products = '';
      
      if(productList.subjectSelected() && productList.entrySelected()) {
        $.each(productList.getSelectedProducts(), function(i) {
          selected_products += '&product=' + this.id;
        });
      }
      
      $.ajax({
        type: 'post',
        url: '/cgi/contact.cgi',
        data: 'action=exec&' + $('#contact_form').serialize() + selected_products,
        success: function(json) {
          data = eval('(' + json + ')');
          $('#product_request_loading_animation').remove();
          if (data.Error) {
            $('#product_request_loading_messages').html(data.Error.join('<br />'));
          } else {
            $.scrollTo($('body'), 1000 );
            $('#contact_form').before(
              '<div id="success_message">' +
                '<p>' + data.Success + '</p>' +
                '<p>' +
                  '<a class="more" href="/" title="zurück zur Startseite">zurück zur Startseite</a><br />' +
                  '<a class="more" href="/produktsortiment" title="zu unserem Online-Shop">zu unserem Online-Shop</a>' +
                '</p>' +
              '</div>'
            ).remove();
          }
          
          // Animate is a fake timeout possibility
          $('#product_request_loading_messages').animate({ opacity: 1.0 }, 3000, function() {
            $('#product_request_loading_messages').fadeOut(function() {
              $(this).remove();
            });
            
            $('#product_request_loading_overlay').fadeOut(function() {
              $(this).remove();
            });
          });
        }
      });
    },
    errorElement: 'span',
    errorPlacement: function(error, element) {
      if(element.parent().parent()[0] == $('ul#subject_list')[0]) {
        error.prependTo(element.siblings('div.subject_content').children('div.inner_content')).hide().css('height', 'auto').slideDown();
      } else {
        error.appendTo(element.parent()).hide().css('height', 'auto').slideDown();
      }
    },
    invalidHandler: function() {
      $('#contact_form').trigger('label_errorfield_created').unbind('label_errorfield_created');
    },
    showErrors: function(errorMap, errorList) {
      if(submitbutton_clicked) {
        submitbutton_clicked = false;
        $('#contact_form').unbind('label_errorfield_created').bind('label_errorfield_created', function() {
          $.scrollTo($('div.errorfield:eq(0)').parent(), 1000 );
        });
        this.defaultShowErrors();
      }
    },
    rules: {
      check_subject_product: {
        productSelected: {
          depends: function(element) {
            return $('#check_subject_product').attr('checked') && (!productGroupList.subjectSelected() || (productGroupList.subjectSelected() && !productGroupList.entrySelected()));
          }
        }
      },
      check_subject_product_group: {
        productGroupSelected: {
          depends: function(element) {
            return $('#check_subject_product_group').attr('checked') && (!productList.subjectSelected() || (productList.subjectSelected() && !productList.entrySelected()));
          }
        }
      },
      comment: {
        required: function() {
          return !(isProductRequest());
        }
      },
      phone: {
        required: "#testrun:checked"
      }
    },
    messages: {
      person: 'Bitte geben Sie einen Ansprechpartner ein.',
      email: {
        required: 'Bitte geben Sie Ihre E-Mail-Adresse ein.',
        email: 'Bitte geben Sie eine gültige E-Mail-Adresse ein.'
      },
      phone: 'Bitte geben Sie Ihre Telefonnummer an.',
      comment: 'Bitte geben Sie eine kurze Nachricht ein, damit wir Ihr Anliegen besser verstehen.',
      check_subject_product: {
        productSelected: 'Bitte wählen Sie mindestens ein Produkt aus. Bestätigen Sie Ihre Auswahl bitte über den Link "Produkt auswählen".'
      },
      check_subject_product_group: {
        productGroupSelected: 'Bitte wählen Sie mindestens eine Produktgruppe aus.'
      }
    }
  });
  
  $('a.form_submit').click(function() {
    submitbutton_clicked = true;
    
    $('#contact_form').submit();
    
    return false;
  });
});