diff --git a/birthdays.js b/birthdays.js
index 5d6a936..cfcb2bb 100644
--- a/birthdays.js
+++ b/birthdays.js
@@ -3,7 +3,7 @@
 Drupal.behaviors.birthdays = {
   attach: function (context) {
     var settings = {
-      dateFormat: 'yy/mm/dd',
+      dateFormat: Drupal.settings.birthdays.dateformat,
       autoSize: true,
       changeMonth: true,
       changeYear: true,
@@ -14,7 +14,7 @@ Drupal.behaviors.birthdays = {
     };
 
     var noYearSettings = jQuery.extend({}, settings);
-    noYearSettings.dateFormat = 'mm/dd';
+    noYearSettings.dateFormat = Drupal.settings.birthdays.dateformat_noyear;
 
     $('.birthdays-datepicker', context).datepicker(settings);
     $('.birthdays-datepicker-noyear', context).datepicker(noYearSettings);
diff --git a/birthdays.module b/birthdays.module
index 1fae948..ba4ac9d 100644
--- a/birthdays.module
+++ b/birthdays.module
@@ -99,6 +99,7 @@ function birthdays_field_info() {
           'description' => '',
         ),
         'datepicker' => FALSE,
+        'dateformat' => 'yy/mm/dd',
       ),
     ),
   );
@@ -223,8 +224,15 @@ function birthdays_field_widget_form(&$form, &$form_state, $field, $instance, $l
     else {
       $element['value']['#attributes']['class'] = array('birthdays-datepicker');
     }
-    $element['value']['#attached'] = array(
-      'js' => array(drupal_get_path('module', 'birthdays') . '/birthdays.js'),
+    $element['value']['#attached']['js'][] = drupal_get_path('module', 'birthdays') . '/birthdays.js';
+    $element['value']['#attached']['js'][] = array(
+      'data' => array(
+        'birthdays' => array(
+          'dateformat' => $instance['settings']['dateformat'], 
+          'dateformat_noyear' => str_ireplace(array('/yy', '-yy', 'yy-', 'yy/'), '', $instance['settings']['dateformat']),
+        ),
+      ),
+      'type' => 'setting',
     );
   }
 
@@ -280,6 +288,8 @@ function birthdays_field_textfield_validate($element, &$form_state) {
       }
     }
 
+dsm($birthday);
+dsm($birthday->toArray());
     // Make the values ready to save.
     form_set_value($element, $birthday->toArray() + array('triggers' => $triggers), $form_state);
   }
@@ -302,13 +312,25 @@ function birthdays_field_instance_settings_form($field, $instance) {
   $settings = $instance['settings'];
 
   // Datepicker option.
-  $form['datepicker'] = array(
+  $form['date'] = array(
+    '#type' => 'fieldset',
+    '#title' => 'Datepicker',
+  );
+  $form['date']['datepicker'] = array(
     '#type' => 'checkbox',
     '#title' => t('Use a datepicker'),
     '#description' => t('Select to optionally use a datepicker popup to select dates.'),
     '#default_value' => $settings['datepicker'],
   );
 
+  // Datepicker Date format.
+  $form['date']['dateformat'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Choose the date format'),
+    '#description' => ('Type the date format you want, examples: yy/mm/dd, dd/mm/yy, mm-dd-aa'),
+    '#default_value' => $settings['dateformat'],
+  );
+
   // Year settings.
   $form['hide_year'] = array(
     '#type' => 'radios',
@@ -606,7 +628,7 @@ function _birthdays_get($trigger, $instance, $day, $month, $year = NULL) {
 function birthdays_cron() {
   $instances = _birthdays_field_instances();
 
-  // The the cronjob run at most once a day.
+  // The cronjob run at most once a day.
   $day = 24 * 60 * 60;
   $last_cron = variable_get('birthdays_last_cron', REQUEST_TIME - $day);
   if ($last_cron > REQUEST_TIME - $day) {
diff --git a/birthdays_birthday.inc b/birthdays_birthday.inc
index cb0bb61..9f87c20 100644
--- a/birthdays_birthday.inc
+++ b/birthdays_birthday.inc
@@ -47,19 +47,39 @@ class BirthdaysBirthday {
    *
    * @return A BirthdaysBirthday instance.
    */
-  public static function fromString($text, $allow_future = FALSE) {
+  public static function fromString($text, $allow_future = FALSE, $mask = 'dd/mm/yyyy') {
     $text = trim($text);
     if ($text === '') {
       return self::fromEmpty();
     }
 
+    // find out which separator we are using
+    foreach(array('/', '-', '.') as $sep) {
+      if (strpos($mask, $sep)) break;
+    }
+
+    switch ($mask) {
+    case "dd{$sep}mm{$sep}yyyy":
+      $date = explode($sep, $text);
+      return self::fromDate(isset($date[2]) ? $date[2] : 0, $date[1], $date[0], $allow_future);      
+      break;
+    case "mm{$sep}dd{$sep}yyyy": 
+      $date = explode($sep, $text);
+      return self::fromDate(isset($date[2]) ? $date[2] : 0, $date[0], $date[1], $allow_future);      
+      break;
+    case "yyyy{$sep}mm{$sep}dd": 
+      $date = explode($sep, $text);
+      return self::fromArray($matches, $allow_future);
+      break;
+    }
+    
     // Match dd.mm(.yyyy).
     if (preg_match('/^(\d{1,2})\.(\d{1,2})\.?(\d{4}|\d{2})?$/', $text, $matches)) {
       return self::fromDate(isset($matches[3]) ? $matches[3] : 0, $matches[2], $matches[1], $allow_future);
     }
 
-    // Match (yyyy-)mm-dd or (yyyy/)mm/dd.
-    foreach (array('\/', '-') as $sep) {
+    // Match (yyyy-)mm-dd or (yyyy/)mm/dd or (yyyy.)mm.dd
+    foreach (array('/', '-', '.') as $sep) {
       if (preg_match('/^((?P<year>\d{4}|\d{2})' . $sep . ')?(?P<month>\d{1,2})' . $sep . '(?P<day>\d{1,2})/', $text, $matches)) {
         return self::fromArray($matches, $allow_future);
       }
