var PosterOrder = {
  loggedIn: false,
  orderInfo: false,
  mediaPopupBox: false,

  contactDetailsFields: ['business_name', 
                         'first_name', 
                         'last_name', 
                         'email_address',
                         'phone_number',
                         'address_street',
                         'address_suburb',
                         'address_state',
                         'address_postcode'],

  /**
   * Initializes the instance.
   * 
   */
  init: function(loggedIn, previousDeliveryDetailsJSON)
  {
    this.loggedin = loggedIn;
    Auth.loginSuccess = this.loginSuccess.bind(this);  
  
    var clientDetails = $('client-details');
    if (clientDetails)
    {
      var listener =  this.copyClientToDelivery.bindAsEventListener(this);
      clientDetails.observe('change', listener);
      clientDetails.observe('keyup', listener);
    }

    var deliveryDetails = $('delivery-details');
    if (deliveryDetails)
    {
      var listener =  this.deliveryDetailsChanged.bindAsEventListener(this);
      deliveryDetails.observe('change', listener);
      deliveryDetails.observe('keyup', listener);
    }
    
    this.previousDeliveryDetails = previousDeliveryDetailsJSON.evalJSON();
  },

  /**
   * Fetches min quantity and price via ajax
   */
  updateOrderInfo: function()
  {
    var idposter_size = $Fi('idposter_size_field');
    var idmedia = $Fi('idmedia_field');
    var quantity = $Fi('quantity_field');
    
	var height = $Fi('height_field');
	var width = $Fi('width_field');
	
	
	
    if (idposter_size == 0 || idmedia == 0)
    {
      this.updateOrderInfoCallback(false);
      return;
    }
	
	if (idposter_size == 1 && (  parseFloat(width) < 250.0   )  )
	{
		this.updateOrderInfoCallback(false);
     	return;
	}
	if (idposter_size == 1 && ( parseFloat(width) > 900.0 && parseFloat(height) > 900.0 )  )
	{
		this.updateOrderInfoCallback(false);
     	return;
	}
	
	
	
	if ( idposter_size == 1 && ( height == ""  ||  width == "" )  )
	{
		this.updateOrderInfoCallback(false);
      	return;
	}

    sendAjaxMessage(
      'posterorder', 
      'getOrderInfo',
      {
        idposter_size: idposter_size,
        idmedia: idmedia,
        quantity: quantity,
		
		height: height,
		width: width
		
      },
      this.updateOrderInfoCallback.bind(this)
    ); 
  },
  
  
  
  showWidthHeight: function()
  {
	if (document.getElementById("idposter_size_field").value == "1")
	{
	document.getElementById("heightWidth").style.display = 'block';  
	}
	else {
		document.getElementById("heightWidth").style.display = 'none';  
	}
  },
  
  
  
  	
  
  
  
  
  /**
   * Ajax callback for updateOrderInfo
   * 
   * @param {Object} orderInfo
   */
  updateOrderInfoCallback: function(orderInfo)
  {
    this.orderInfo = orderInfo;
    
    if (!this.checkOrderInfo())
    {
      $('poster-order-price').innerHTML = '';
      return;
    }
    
    $('poster-order-min-quantity-value').innerHTML = orderInfo.min_quantity;
    if (orderInfo.quantity < orderInfo.min_quantity)
      $('poster-order-min-quantity').addClassName('hilite');
    else
      $('poster-order-min-quantity').removeClassName('hilite');
    $('poster-order-min-quantity').show();
      
	 
	 
    $('poster-order-price').innerHTML = orderInfo.price ? orderInfo.price : 'n/a';
	
  },
  
  /**
   * Calls updateOrderInfo after n seconds to avoid ajax call while still typing
   */
  updateOrderInfoDelayed: function(seconds)
  {
    this.updateOrderInfo.bind(this).delay(seconds);
  },
  
  /**
   * Makes sure any order info obtained via ajax still matches
   * the order details entered by the user.
   */
  checkOrderInfo: function()
  {
    var idposter_size = $Fi('idposter_size_field');
    var idmedia = $Fi('idmedia_field');
    var quantity = $Fi('quantity_field');
	var height = $Fi('height_field');
	var width = $Fi('width_field');
	
    if (this.orderInfo
        && this.orderInfo.idposter_size == idposter_size
        && this.orderInfo.idmedia == idmedia
        && this.orderInfo.quantity == quantity
		&& this.orderInfo.height == height
		&& this.orderInfo.width == width
		)
      return true;

    this.orderInfo = false;
    return false;
  },
  
  /**
   * Copies client contact details to the delivery details, unless
   * the 'deliver to client' checkbox is unchecked.
   */
  copyClientToDelivery: function()
  {
    // abort if deliver to client details unchecked
    if (!$F('deliver_to_client_details_field'))
      return;
      
    this.contactDetailsFields.each(function(field){
      $('delivery_' + field + '_field').setValue($F('client_' + field + '_field'));
    });
  },
  
  deliveryDetailsChanged: function()
  {
    this.disableCopyClientToDelivery();
  }, 
  
  disableCopyClientToDelivery: function()
  {
    if ($F('deliver_to_client_details_field'))
      $('deliver_to_client_details_field').setValue(false);
  },


	

  clientEmailAddressKeyUp: function()
  {
    if (this.loggedIn)
      return;
      
    var emailAddress = $F('client_email_address_field');
    
    $('login-username').setValue(emailAddress);
    
    if (emailAddress.length == 0 || !emailAddress.match(/.+@.+/))
      $('poster-order-account-exists').hide();
    else
      this.queryAccountExists.bind(this).delay(0.5, emailAddress);
  },
    
  queryAccountExists: function(emailAddress)
  {
    sendAjaxMessage(
      'PosterOrder', 
      'accountExists',
      { email_address: emailAddress}, 
      this.queryAccountExistsCallback);
  },
  
  queryAccountExistsCallback: function(results)
  {
    var emailAddress = results['email_address'];
    var accountExists = results['account_exists'];
    
    if ($F('client_email_address_field') == emailAddress
        && accountExists)
    {
      $('poster-order-account-exists').show();
      $('login-username').setValue(emailAddress);
    }
    else
      $('poster-order-account-exists').hide();
  },

 
  /**
   * Show/hide payment method dependent fields.
   */
  paymentMethodChanged: function()
  {
    if ($RF('poster-order-form', 'payment_method') == 'Credit Card')
    {  
      $('payment-by-bank-transfer').hide();    
      $('payment-by-credit-card').show();    
    }
    else
    {
      $('payment-by-credit-card').hide();    
      $('payment-by-bank-transfer').show();    
    }
  },
  
  /**
   * Hides the file upload input field and shows a fake progress bar.
   */
  posterGraphicUploadStart: function()
  {
    if ($F('poster_graphic_file_field'))
    {
      $('poster-graphic-file-label').innerHTML = 'Uploading file...';
      $('poster_graphic_file_field').hide();
      $('poster-graphic-uploading').show();
    }
  },
  
  /**
   * Auth.loginSuccess event handler.
   * 
   * @param {Object} results
   */
  loginSuccess: function(results)
  {
    // fill in client details that have not already been entered
    this.fillInClientDetails(results['client_details']);
    
    // populate 
    this.previousDeliveryDetails = results['previous_delivery_details'];
    if (this.previousDeliveryDetails.length > 0)
      this.showPreviousDeliverySelect();
  },
  
  fillInClientDetails: function(clientDetails)
  {
    this.contactDetailsFields.each(function(field){
      var elem = $('client_' + field + '_field');
      elem.setValue(clientDetails[field]);
    });
    
    this.copyClientToDelivery();
  },
  
  showPreviousDeliverySelect: function(previousDeliveryDetails)
  {
  
    var f = $('previous_delivery_field');
    f.clearOptions(true);
    
    this.previousDeliveryDetails.each(function(deliveryDetails, index){
      f.addOption(index, deliveryDetails.display);
    });
    
    $('previous-delivery-details').show();
  },

  /**
   * Fills in previous delivery details.
   */  
  previousDeliveryChanged: function()
  {
    var i = $F('previous_delivery_field');
    
    if (!this.previousDeliveryDetails[i])
      return;
      
    var d = this.previousDeliveryDetails[i];
    this.contactDetailsFields.each(function(field){
      var elem = $('delivery_' + field + '_field');
      elem.setValue(d[field]);
    });
    
    this.disableCopyClientToDelivery(); 
  },
  
  showMediaInfo: function()
  {
    if (this.mediaPopupBox)
      this.mediaPopupBox.hide();
      
    var idmedia = $Fi('idmedia_field');
    var contentElemId = 'media-' + idmedia;

    this.mediaPopupBox = new PopupBox(contentElemId, 'media-info-button', ['idmedia_field']);
    this.mediaPopupBox.show();
  },
  
  updateMediaInfo: function()
  {
    if (!this.mediaPopupBox)
      return;
      
    var idmedia = $Fi('idmedia_field');
    var contentElemId = 'media-' + idmedia;
    if (this.mediaPopupBox.visible() && !this.mediaPopupBox.isShowing(contentElemId))
      this.showMediaInfo();
  }
  
  
  
}
