//------------------------------------
function MagicInput(options, data, callback){
  this.data = data;
  this.options  = options;
  this._callback = callback;
}

MagicInput.prototype.toString = function(){
  return 'This is MagicInput object';
}

MagicInput.prototype.callback = function(){
  this._callback.apply(this, arguments);
}

MagicInput.instance = function(el, data, callback){
//  var options = $(el).mapAttributes('mi-', true);
  el = $(el);
  var options = {};
  options['action'] = el.attr('mi-action');
  options['title']  = el.attr('mi-title');
  options['iface']  = el.attr('mi-iface');
  options['data']   = el.attr('mi-data');
  try{
    $.extend(data, options.data ? $.parseJSON(options.data) : {});
    delete options.data;
    options.iface = 'mi' + options.iface.substring(0,1).toUpperCase() + options.iface.substring(1);
    return input = new window[options.iface](options, data, callback);
  }catch(e){
    console.log('MagicInput::instance ' + e);
    throw e;
  }
}
//------------------------------------
function miNone(options, callback){
  miNote.superclass.constructor.apply(this, arguments);
  this.callback();
}
extend(miNone, MagicInput);

miNone.prototype.toString = function(){
  return 'This is miNone object';
}
//------------------------------------
function miNote(options, callback){
  miNote.superclass.constructor.apply(this, arguments);
  if(confirm('Eniieuciaaou "'+this.options.title+'" nae?an?')){
    this.callback()
  }
}
extend(miNote, MagicInput);

miNote.prototype.toString = function(){
  return 'This is miNote object';
}
//------------------------------------
function miDialog(options, data, callback, content, dialogOptions){
  miDialog.superclass.constructor.apply(this, arguments);
  var mi = this;
  this.dialog = content.dialog($.extend({},{
        title: this.options.title,
        resizable: false,
        minHeight: 20,
        dialogClass: 'sand-style mi-container',
        beforeClose: function(e, ui){
          var tmp = true;
          if(1 * $(this).attr('submit')){
            mi._collect.call(mi);
            if(tmp = mi._validation.call(mi)){
              return true;
            }
          }
          $(this).attr('submit', 0);
          return tmp;
        },
        close: function(e, ui){
          if(1 * $(this).attr('submit')){
            mi.callback();
          }
          mi.destroy();
        }
      }, dialogOptions))
    .on('click','.dialog-submit',function(){
      $(this).closest('.ui-dialog-content').attr('submit', 1).dialog('close')
    })
}
extend(miDialog, MagicInput);

miDialog.prototype.toString = function(){
  return 'This is ABSTRACT miDialog object';
}

miDialog.prototype.destroy = function(){
  this.dialog.dialog('destroy').remove();
}

miDialog._oneInput = function(p){
  var i = $('<input type='+(p.type ? p.type : 'text')+' class=text>').attr('name',p.name);
  if(p.grabber){
    h[p.grabber].set(i);
  }else{
    i.select();
  }
  return $('<div class=oneinput></div>')
    .append('<input type=button class="button dialog-submit" value=" »» ">')
    .append($('<div></div>').append(i));
}

miDialog.prototype._collect = function(){
  var mi = this;
  this.dialog.find('[name]').each(function(){
      var el = $(this);
      if(el.is('input[type="checkbox"]')){
          mi.data[el.attr('name')] = ~~el.is(':checked');
          return;
      }
    mi.data[el.attr('name')] = el.val();
  })
}

miDialog.prototype._validation = function(){
  return true;
}

function miUser(options, data, callback){
  var mi = this;
  miUser.superclass.constructor.call(this, options, data, callback,
      $('<div>Укажите логин персонажа :<br /><small>(можно кликнуть по логину в чате)</small></div>')
        .append(miDialog._oneInput({name:'victim',grabber:'grabLogin'})),
      {width: 250});
}
extend(miUser, miDialog);

miUser.prototype._validation = function(){
  this.data.victim = $.trim(this.data.victim);
  return miUser.superclass._validation.apply(this)
    && this.data.victim.length > 0;
}