//const artworkBlackWhite = 1;
//const artworkColour = 2;
var artworkBlackWhite = 1;
var artworkColour = 2;

function sanitisePrice( p ) {
	return ( _p = parseFloat( ( ''+p ).replace(/[-]?[^0-9.+\\-]+/g, '') ) ) != _p ? 0 : _p;
}
function priceFormat( p ) {
	return '&pound;'+( ( _p = parseFloat( p ) ) != _p ? 0 : _p ).toFixed( 2 );
}


$(function() {
  var productImageHeight = 0;
  var productEnquiryHeight = 0;
  var productInfoHeight = 0;
  var productImage = $('#product-add-item .product-details-wrapper .product-image:first');
  if (productImage.length) {
    var productImageHeight = productImage.outerHeight(true);
  }
  
  var productEnquiry = $('#product-add-item .product-details-wrapper .product-enquiry-wrapper:first');
  if (productEnquiry.length) {
    var productEnquiryHeight = productEnquiry.outerHeight(true);
  }

  var productInfo = $('#product-add-item .product-details-wrapper .product-info-wrapper:first');
  if (productInfo.length) {
    var productInfoHeight = productInfo.outerHeight(true);
  }
  
  var totalLeftHeight = productImageHeight + productEnquiryHeight; 
  var shrink = productInfoHeight - totalLeftHeight;
  
  if (shrink > 0) {
    var productDescr = $('.product-description:first', productInfo);
    var productDescrHeight = productDescr.height();

    $('.product-info:first', productInfo).append('<a class="description-more" href="#">+ More</a>');
    
    var more = $('a.description-more', productInfo);
    more.data('infoMaxHeight', productDescrHeight)
    more.data('infoMinHeight', productDescrHeight - shrink)
    more.click(function(){
      var t = $(this);
      if (productDescr.hasClass('shrunk')) {
        productDescr.removeClass('shrunk');
        productDescr.animate({height: t.data('infoMaxHeight')});
        t.text('- Hide');
      } else {
        productDescr.addClass('shrunk');
        productDescr.animate({height: t.data('infoMinHeight')});
        t.text('+ More');
      }
      return false;
    }).click();
  }
});


$( document ).ready( function() {
	var upQty = minQtyVal;
	var updateProduct = function() {
		if( _q = parseInt( inputQty.val() ) ) {
			upQty = Math.max(_q, minQtyVal);
		}

		var price = $( 'input[name="base_price"]', base ).val();
		var fixedPrice = 0;

		if (fieldsetSize.length) {
		  price = sanitisePrice( $( '.option-price', $( 'input:checked', fieldsetSize ).parent() ).text() );
		}

		for( var i = 0; i < fieldsetsOther.length; i++ ) {
			visibleOption = $( 'label.option span[class="option-size-'+$( 'input:checked', fieldsetSize ).val()+'"]', fieldsetsOther[i] );
			visibleOption.parent().parent().show();
			$( 'label.option span[class^="option-size-"]', fieldsetsOther[i] ).not( visibleOption ).each( function() { if( $( 'input[type="radio"]', $(this).parent() ).attr( 'checked' ) ) { $( 'input[type="radio"]', visibleOption.parent() ).attr( 'checked', 'checked' ); } $(this).parent().parent().hide(); } );
			price = parseFloat( price ) + sanitisePrice( $( '.option-price', $( 'input:checked', fieldsetsOther[i] ).parent() ).text() );
		}

		for( var loop = 0; loop < fieldsetsEngravingOptions.length; loop++ ) {
		  var i = trim(fieldsetsEngravingOptions[loop].className.replace(/fs-engraving-options/g,''));
		  var fieldset = getEngravingFieldset(fieldsetsEngraving, i);
		  
			var input1 = $( 'input.form-radio[value="1"]', fieldsetsEngravingOptions[loop] );
			var input2 = $( 'input.form-radio[value="2"]', fieldsetsEngravingOptions[loop] );
			var input1_text = $( 'span.option-text', input1.parent() );
			if (upQty <= 1) {
				input2.attr( 'disabled', true );
				input2.parent().hide();
				if (!input1_text.data('text')) {
					input1_text.data( 'text', input1_text.text() )
				}
				input1_text.text('I require engraving on these items');

				if( input2.attr( 'checked' ) ) {
					input1.attr( 'checked', true );
				}
			} else {
				input2.attr( 'disabled', false );
				input2.parent().show();
				input1_text.text( input1_text.data( 'text' ) );
				input1_text.removeData( 'text' );
				/*$( 'input.form-radio[value="1"]', fieldsetsEngravingOptions[i] ).parent().text( $( 'input.form-radio[value="1"]', fieldsetsEngravingOptions[i] ).parent().data( 'text' ) );*/
				
				//$(fieldsetsEngravingOptions[loop]).show();//animate( { height:'show', opacity:'show' }, 'slow' );//show();
			}
			
			var inputs = $('input.form-radio', fieldsetsEngravingOptions[loop]);
			var active = $('input.form-radio:enabled', fieldsetsEngravingOptions[loop]);
			if (active.length <= 1) {
        $(fieldsetsEngravingOptions[loop]).hide();//stop(true,true).animate( { height:'hide', opacity:'hide' }, 'slow' );
        inputs.removeAttr('checked');
        active.attr('checked', true);
        active.removeAttr('disabled', true);
      } else {
        $(fieldsetsEngravingOptions[loop]).show();
      }
			
			/*
			if ($('input.form-radio:checked', fieldsetsEngravingOptions[loop]).val()) {
			  price = parseFloat(price) + sanitisePrice($('.form-item label .option-price:first', fieldsetsEngraving[i]).text());
			}
			*/

			var textareas = $( '.form-item label[for^="edit-engraving'+i+'-"]', fieldset ).parent();
			var removeTextarea = function() { textareas.remove(); }
			var selectedEngravingOption = $( 'input:checked', fieldsetsEngravingOptions[loop] ).val();
			//alert(selectedEngravingOption);
			switch( selectedEngravingOption ) {
			  default:
				case '1': // same engraving on all
					var fs = $( 'fieldset.fs-engraving'+i+':hidden', optionBase );
					if( fs.length ) { // fieldset is hidden
						removeTextarea();
						$( '.form-item:hidden label[for="edit-engraving'+i+'"]', fieldset ).parent().show();
						fs.animate( { height:'show', opacity:'show' }, 'slow' );
					} else {
						textareas.hide();
						$( '.form-item:hidden label[for="edit-engraving'+i+'"]', fieldset ).parent().show();
					}
					break;
				case '2': // separate engraving
					$( textareas ).slice( upQty ).hide();
				  var labelText = $('label[for="edit-engraving'+i+'"]', fieldset ).html();
				  if (!labelText) {
				    labelText = '';
				  }
				  var descrText = $('.form-item:first div[class="description"]:first', fieldset ).html();
				  if (!descrText) {
				    descrText = '';
				  }
					for( var j = textareas.length; j < upQty; j++ ) {
						$( fieldset ).append( '<div class="form-item" style="display:none;"><label for="edit-engraving'+i+'-'+j+'">'+labelText+'</label><textarea cols="60" rows="5" name="engraving'+i+'-'+j+'" id="edit-engraving'+i+'-'+j+'"  class="form-textarea resizable">'+$( '#edit-engraving'+i, fieldset ).val()+'</textarea><div class="description">'+descrText+'</div></div>' );
					}
					Drupal.textareaAttach();
					var textareas = $( '.form-item label[for^="edit-engraving'+i+'-"]', fieldset ).parent();
					var fs = $( 'fieldset.fs-engraving'+i+':hidden', optionBase );
					if( fs.length ) {	// fieldset is hidden
						$( textareas ).slice( 0, upQty ).not( ':visible, :animated' ).show();
						$( '.form-item:visible label[for="edit-engraving'+i+'"]', fieldset ).parent().hide();
						fs.animate( { height:'show', opacity:'show' }, 'slow' );
					} else {
						$( textareas ).slice( 0, upQty ).not( ':visible, :animated' ).show();
						$( '.form-item:visible label[for="edit-engraving'+i+'"]', fieldset ).parent().hide();
					}
					break;
				case '0': // no engraving
					var fs = $( 'fieldset.fs-engraving'+i+':visible', optionBase );
					if( fs.length ) {	// fieldset is visible
						fs.animate(
							{ height:'hide', opacity:'hide' },
							{ duration:'slow', callback:function() {
									textareas.hide();
									$( '.form-item:visible label[for="edit-engraving'+i+'"]', fieldset ).parent().hide();
								}
							} );	// hide it and contents
					} else { // fieldset is hidden
						removeTextarea();
						$( '.form-item:visible label[for="edit-engraving'+i+'"]', fieldset ).parent().hide();
					}
					break;
			}
		}
		for (var i = 0; i < fieldsetsEngraving.length; i++) {
      var fieldset = getEngravingFieldset(fieldsetsEngraving, i);
		  var engraving = $('.form-item textarea:visible:first', fieldset);
		  if (engraving.length) {
		    var ppl = $('input[name="'+engraving.attr('name')+'-ppl"]', optionBase);
		    if (ppl.length && ppl.val()) {
		      var price_per_line = sanitisePrice($('.form-item label .option-price:first', fieldset).text());
		      var text = trim(engraving.val()).replace(/\r/g,'\n').replace(/\n+/g,'::NEWLINE::').replace(/\s+/g,'');
		      var lines = text.split(/::NEWLINE::/).length;
		      
		      lines -= 2; // 2 free
		      if (lines > 0) {
		        price = parseFloat(price) + (price_per_line * lines);
		      }
		    } else {
		      var option = $('fieldset.'+engraving.attr('name').replace(/engraving/,'fs-engraving-options')+' input.form-radio:checked', optionBase);
		      if ((option.val() > 0 || option.length <= 0) && engraving.val().length > 0) {
		        price = parseFloat(price) + sanitisePrice($('.form-item label .option-price:first', fieldset).text());
		      }
		    }
		  }
		}

    if( fieldsetArtworkOptions && fieldsetArtwork ) {
      var artworkOption = $( 'input.form-radio:checked', fieldsetArtworkOptions );
      if( artworkOption.val() != 0 ) {
        var img = $('img.artwork-thumb', fieldsetArtwork);
        if( img ) {
          var s = img.attr( 'src' );
          if( s ) {
            switch( parseInt( artworkOption.val() ) ) {
              case artworkBlackWhite:
                if( s.match( /\.artwork-thumb-c\.jpg$/ ) ) {
                  s = s.substring( 0, s.length - '.artwork-thumb-c.jpg'.length )+'.artwork-thumb-bw.jpg';
                  img.attr( 'src', s );
                }
                break;
              case artworkColour:
                if( s.match( /\.artwork-thumb-bw\.jpg$/ ) ) {
                  s = s.substring( 0, s.length - '.artwork-thumb-bw.jpg'.length )+'.artwork-thumb-c.jpg';
                  img.attr( 'src', s );
                }
                break;
              default:
                break;
            }
          }
        }
        fieldsetArtwork.animate( { height:'show', opacity:'show' }, 'slow' );
      } else {
        fieldsetArtwork.animate( { height:'hide', opacity:'hide' }, 'slow' );
      }
      
      fixedPrice = sanitisePrice( $( '.option-price', $( 'input:checked', fieldsetArtworkOptions ).parent( ) ).text( ) );
    }

		price = price * upQty + fixedPrice;
		$( '#product-value-price', optionBase ).html( priceFormat( price ) );
	}
	
	var getEngravingFieldset = function(fieldsets, id) {
	  for (var loop = 0; loop < fieldsets.length; loop++) {
	    if (fieldsets[loop].className.match('fs-engraving'+id)) {
	      return fieldsets[loop];
	    }
	  }
	};
	
	var submitForm = function() {
		updateProduct();
		var qty = Math.max(1, parseInt(inputQty.val()));
		for (var loop = 0; loop < fieldsetsEngravingOptions.length; loop++) {
      var i = trim(fieldsetsEngravingOptions[loop].className.replace(/fs-engraving-options/g,''));
      var fieldset = getEngravingFieldset(fieldsetsEngraving, i);

			switch ($('input:checked', fieldsetsEngravingOptions[loop]).val()) {
			  default: // no engraving
				case '1': // same engraving on all
					break;
				case '2': // seperate engraving
					var _val = new Array();
					for (var j = 0; j < qty; j++) {
						_val[j] = $('textarea#edit-engraving'+i+'-'+j, fieldset).val();
					}
					$('#edit-engraving'+i, fieldset).val(serializeArray(_val));
					break;
				case '0': // no engraving
					$('#edit-engraving'+i, fieldset).val('');
					break;
			}
		}
		return true;
	}
	var alterQty = function( e ) {
		switch( e.keyCode ) {
			case 38:
				var _val = parseInt( inputQty.val() );
				if( isNaN( _val ) ) _val = 0;
				inputQty.val(Math.max(1 + _val, minQtyVal));
				break;
			case 40:
				var _val = parseInt( inputQty.val() );
				if( isNaN( _val ) ) _val = 0;
				inputQty.val(Math.max(minQtyVal, (-1) + _val ));
				break;
			default:
				break;
		}
		return updateProduct();
	}
	var updatePrices = function() {
	  if( fieldsetSize.length ) {
      size = $( 'input:checked', fieldsetSize ).val();
  	  $('span.option-price', optionBase).each(function() {
  	    var t = $(this);
  	    var e = t.siblings('.form-radio[name!="size"]:first');
  	    
  	    if(e.length) {
  	      var v = $('input[name="'+e.attr('name')+'-size-'+e.val()+':'+size+'"]', optionBase);
  	      if(!v.length) {
  	        v = $('input[name="'+e.attr('name')+'-size-'+e.val()+':default"]', optionBase);
  	      }
  	      if(v.length) {
  	        var val = sanitisePrice(v.val());
  	        if(val) {
              t.html('(add '+priceFormat(val)+')');
            } else {
              t.text('');
            }
  	      }
  	    } else {
  	      /* can't find standard attributes, try engraving */
  	      e = $('textarea#'+t.parent().attr('for'));

  	      if (e.length) {
  	        var v = $('input[name="'+e.attr('name').replace(/-[0-9]+$/, '')+'-size:'+size+'"]', optionBase);
            if(!v.length) {
              v = $('input[name="'+e.attr('name').replace(/-[0-9]+$/, '')+'-size:default"]', optionBase);
            }

    	      if(v.length) {
              var val = sanitisePrice(v.val());
              if(val) {
                var ppl = $('input[name="'+e.attr('name')+'-ppl"]', optionBase);
                if (ppl.length && ppl.val()) {
                  t.html('(two free lines included, add '+priceFormat(val)+' per additional line)');
                } else {
                  t.html('(add '+priceFormat(val)+')');
                }
              } else {
                t.text('');
              }
            }
  	      }
  	    }
  	  });
	  }
	}
	
	var baseForm = $( 'form#product-cart-form' );
	baseForm.submit( submitForm );
	var base = $( '#product-add-item .product', baseForm );
	var optionBase = $( '.product-options-wrapper', base );

	var fieldsetQty = $( 'fieldset.fs-qty', optionBase );
	var inputQty = $( 'input#edit-qty', fieldsetQty );
	
	var minQty = $('input#edit-min-qty');
	var minQtyVal = 1;
	if (minQty.length && (_mqv = parseInt(minQty.val())) > 1) {
	  minQtyVal = _mqv;
	}	

	inputQty.parent().append( '<span class="edit-qty-alter"><a href="#" class="edit-qty-plus">+</a><a href="#" class="edit-qty-minus">-</a></span>' );
	$( '.edit-qty-plus', inputQty.parent() ).click( function() { alterQty( { keyCode: 38 } ); return false; } );
	$( '.edit-qty-minus', inputQty.parent() ).click( function() { alterQty( { keyCode: 40 } ); return false; } );

	var fieldsetSize = $( 'fieldset.fs-size', optionBase );
	var inputsSize = $( 'input[name="size"]', fieldsetSize );

	var fieldsetsEngravingOptions = $( 'fieldset[class^="fs-engraving-options"]', optionBase );
	var fieldsetsEngraving = $( 'fieldset[class^="fs-engraving"]:not([class^="fs-engraving-options"])', optionBase );
	var inputsEngravingOptions = new Array();
	var inputsEngraving = new Array();
	for( var loop = 0; loop < fieldsetsEngravingOptions.length; loop++ ) {
    var i = trim(fieldsetsEngravingOptions[loop].className.replace(/fs-engraving-options/g,''));
    var fieldset = getEngravingFieldset(fieldsetsEngraving, i);
		inputsEngravingOptions[i] = $( 'input[name="engraving_options'+i+'"]', fieldsetsEngravingOptions[loop] );
		inputsEngraving[i] = $( 'textarea#edit-engraving'+i, fieldset );
	}

	var fieldsetArtworkOptions = $( 'fieldset.fs-artwork-options', optionBase );
  var fieldsetArtwork = $( 'fieldset.fs-artwork', optionBase );

	var fieldsetsOther = $( 'fieldset[class^="fs-"]:not(.fs-qty):not(.fs-size):not([class^="fs-engraving"]):not([class^="fs-artwork"])', optionBase );
	
	inputsSize.each( function() { $( this ).change( updatePrices ).keyup( updatePrices ).click( updatePrices ); } ).keypress( function( e ) { return e.keyCode != 13; } );
	
	inputQty.change( updateProduct ).keyup( updateProduct ).keypress( function( e ) { return e.keyCode != 13; } ).keydown( alterQty );
	$('input:radio', optionBase).each( function() { $( this ).change( updateProduct ).keyup( updateProduct ).click( updateProduct ); } ).keypress( function( e ) { return e.keyCode != 13; } );
	$('textarea', optionBase).each( function() { $( this ).change( updateProduct ).keyup( updateProduct ).click( updateProduct ); } );
	
	
	//$('input, textarea', optionBase).focus(function() { $.scrollTo($(this).parents('fieldset:first'), {offset: -300, axis: 'y', duration: 'fast'} ); });

	updatePrices();
	updateProduct();
} );