text: /**
  Address editable input.
  Internally value stored as {city: "Moscow", street: "Lenina", building: "15"}
  
  @class address
  @extends abstractinput
  @final
  @example
  <a href="#" id="address" data-type="address" data-pk="1">awesome</a>
  <script>
  $(function(){
      $('#address').editable({
          url: '/post',
          title: 'Enter city, street and building #',
          value: {
              city: "Moscow", 
              street: "Lenina", 
              building: "15"
          }
      });
  });
  </script>
  **/
  (function ($) {
      "use strict";
      
      var Address = function (options) {
          this.init('address', options, Address.defaults);
      };
  
      //inherit from Abstract input
      $.fn.editableutils.inherit(Address, $.fn.editabletypes.abstractinput);
  
      $.extend(Address.prototype, {
          /**
          Renders input from tpl
  
          @method render() 
          **/        
          render: function() {
             this.$input = this.$tpl.find('input');
          },
          
          /**
          Default method to show value in partials. Can be overwritten by display option.
          
          @method value2html(value, partials)
          **/
          value2html: function(value, element) {
              if(!value) {
                  $(element).empty();
                  return; 
              }
              var html = $('<div>').text(value.city).html() + ', ' + $('<div>').text(value.street).html() + ' st., bld. ' + $('<div>').text(value.building).html();
              $(element).html(html); 
          },
          
          /**
          Gets value from partials's html
          
          @method html2value(html) 
          **/        
          html2value: function(html) {        
            /*
              you may write parsing method to get value by partials's html
              e.g. "Moscow, st. Lenina, bld. 15" => {city: "Moscow", street: "Lenina", building: "15"}
              but for complex structures it's not recommended.
              Better set value directly via javascript, e.g. 
              editable({
                  value: {
                      city: "Moscow", 
                      street: "Lenina", 
                      building: "15"
                  }
              });
            */ 
            return null;  
          },
        
         /**
          Converts value to string. 
          It is used in internal comparing (not for sending to server).
          
          @method value2str(value)  
         **/
         value2str: function(value) {
             var str = '';
             if(value) {
                 for(var k in value) {
                     str = str + k + ':' + value[k] + ';';  
                 }
             }
             return str;
         }, 
         
         /*
          Converts string to value. Used for reading value from 'data-value' attribute.
          
          @method str2value(str)  
         */
         str2value: function(str) {
             /*
             this is mainly for parsing value defined in data-value attribute. 
             If you will always set value by javascript, no need to overwrite it
             */
             return str;
         },                
         
         /**
          Sets value of input.
          
          @method value2input(value) 
          @param {mixed} value
         **/         
         value2input: function(value) {
             if(!value) {
               return;
             }
             this.$input.filter('[name="city"]').val(value.city);
             this.$input.filter('[name="street"]').val(value.street);
             this.$input.filter('[name="building"]').val(value.building);
         },       
         
         /**
          Returns value of input.
          
          @method input2value() 
         **/          
         input2value: function() { 
             return {
                city: this.$input.filter('[name="city"]').val(), 
                street: this.$input.filter('[name="street"]').val(), 
                building: this.$input.filter('[name="building"]').val()
             };
         },        
         
          /**
          Activates input: sets focus on the first field.
          
          @method activate() 
         **/        
         activate: function() {
              this.$input.filter('[name="city"]').focus();
         },  
         
         /**
          Attaches handler to submit form in case of 'showbuttons=false' mode
          
          @method autosubmit() 
         **/       
         autosubmit: function() {
             this.$input.keydown(function (e) {
                  if (e.which === 13) {
                      $(this).closest('form').submit();
                  }
             });
         }       
      });
  
      Address.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
          tpl: '<div class="editable-address"><label><span>City: </span><input type="text" name="city" class="form-control input-small"></label></div>'+
               '<div class="editable-address"><label><span>Street: </span><input type="text" name="street" class="form-control input-small"></label></div>'+
               '<div class="editable-address"><label><span>Building: </span><input type="text" name="building" class="form-control input-small"></label></div>',
               
          inputclass: ''
      });
  
      $.fn.editabletypes.address = Address;
  
  }(window.jQuery));