/***************************************************************************
 *                              dn.js
 *                              ---------
 *   begin                : Ignatov V. Oleg, Apr 19, 2006
 *   author               : Ignatov V. Oleg (o.ignatov@onlike.ru)
 *   copyright            : (C) 2006-2008 Studio Onlike
 *   mail                 : support@onlike.ru
 *   url                  : www.onlike.ru
 *   license              : commerce
 *
 *   $Id: dn.inc.js,v 1.40 2009/07/14 10:19:46 O.Ignatov Exp $
 *
 ***************************************************************************/

dn = function (form_name, error_stack)
{
   this.error_stack = error_stack;

   this.form_submit = true;

   this._dn = null;
   this._restore_level = null;

   this.elform = 'undefined';
   this.elform_submit = 'undefined';
   this.form_name = form_name;

   this.event = new wp_event();

   this.fields = Array();
}

dn.check_input = function (event)
{
   var el = wp_event.get_element(event);
   dn._check_input(el);
}

dn._check_input = function (el)
{
   if (dn._dn.fields[el.id]['require'] || el.value != '') {
      if (el.value == '') {         
         dn.error(el.id, true, dn._dn.error_stack['EMPTY_INPUT']);
         return false;         
      } else if (el.value.length > dn._dn.fields[el.id]['length'] ||
          !dn._dn.fields[el.id]['preg'].test(el.value)) {
         var _error = dn._dn.error_stack['ERROR_FORMAT'];

         if (dn._dn.error_stack[el.id]) {
            _error = dn._dn.error_stack[el.id];
         }

         dn.error(el.id, true, _error);
         return false;
      } else {
         dn.error(el.id, false, '');
         return true;
      }
   }
   dn.error(el.id, false, '');
   return true;
}


dn.prototype.set_input = function (id, require, length, preg)
{
   var el = document.forms[this.form_name].elements[id];

   eval('var _preg = '+ preg + ';');
   this.fields[id] = {'type' : 'input', 'id' : id,
                      'require' : require, 'length' : length, 'preg' : _preg,
                      'error' : null};

   this.event.add(el, 'blur', dn.check_input);
}



dn.select_multy_move = function (event)
{
   var el = wp_event.get_element(event);
   dn._select_multy_move(el);
}

dn._select_multy_move = function (el)
{

   var afix = el.id.substring(el.id.lastIndexOf('_'));
   var id = el.id.substring(0, el.id.lastIndexOf('_'));

   // опредл направление перемещение
   var _in = true;
   if (afix == '_boutall' || afix == '_bout') {
      _in = false;
   }
   // опредл перемещать все или выбранное
   var _all = false;
   if (afix == '_boutall' || afix == '_binall') {
      _all = true;
   }

   var s_el_in = document.getElementById(id + (_in ? '' : '_out'));
   var s_el_out = document.getElementById(id + (_in ? '_out' : ''));

   // перемещение
   var _del_opt = new Array();

  for (var i = 0; i < s_el_out.options.length; i++) {
      if (_all || s_el_out.options[i].selected) {
         s_el_in.options[s_el_in.options.length] = new Option(s_el_out.options[i].text, s_el_out.options[i].value);
         s_el_in.options[s_el_in.options.length - 1].title  = s_el_out.options[i].title
         _del_opt[_del_opt.length] = s_el_out.options[i].value;
      }
   }
    // удаление
   for (var i = 0; i < _del_opt.length; i++) {
      for (var j = 0; j < s_el_out.options.length; j++) {
         if (s_el_out.options[j].value == _del_opt[i]) {
            s_el_out.options[j] = null;
         }
      }
   }

   // проверка на количество заполнения
   var s_el = _in ? s_el_in : s_el_out;

   if (dn._dn.fields[s_el.id]['require'] || s_el.options.length > 0) {
      if (s_el.options.length  < dn._dn.fields[s_el.id]['min_check']) {
         dn.error(s_el.id, true, dn._dn.error_stack['ERROR_COUNT_MIN']);
      } else if (dn._dn.fields[s_el.id]['max_check'] != 0 && s_el.options.length  > dn._dn.fields[s_el.id]['max_check']) {
         dn.error(s_el.id, true, dn._dn.error_stack['ERROR_COUNT_MAX']);
      } else {
         dn.error(s_el.id, false, '');
      }
   } else {
      dn.error(s_el.id, false, '');
   }

}


dn.prototype.set_select_multy = function (id, require, min_check, max_check)
{
   var el_s_in = document.forms[this.form_name].elements[id];
   var el_s_out = document.forms[this.form_name].elements[id + '_out'];
   var el_b_out_all = document.forms[this.form_name].elements[id + '_boutall'];
   var el_b_out = document.forms[this.form_name].elements[id + '_bout'];
   var el_b_in = document.forms[this.form_name].elements[id + '_bin'];
   var el_b_in_all = document.forms[this.form_name].elements[id + '_binall'];
   this.fields[id] = {'type' : 'select_multy', 'id' : id,
                      'require' : require, 'min_check' : min_check, 'max_check' : max_check,
                      'error' : null};


   this.event.add(el_b_out_all, 'click', dn.select_multy_move);
   this.event.add(el_b_out, 'click', dn.select_multy_move);
   this.event.add(el_b_in, 'click', dn.select_multy_move);
   this.event.add(el_b_in_all, 'click', dn.select_multy_move);
   dn._select_multy_move(el_b_in);
   //dn._dn.event.send(el_b_in, 'click');
}

dn.check_checkbox = function (event)
{
   var el = wp_event.get_element(event);

   dn._check_checkbox(el);
}

dn._check_checkbox = function (el)
{

   var id = el.id.replace('_' + el.value, '')

   var els = document.getElementsByTagName('input');
   var count = 0;
   for (var i = 0; i < els.length; i++) {
      if (els[i].id.replace('_' + els[i].value, '') == id && els[i].checked) {
         count++;
      }
   }

   if (dn._dn.fields[id]['require'] || count > 0) {

      if (count < dn._dn.fields[id]['min_check']) {
         dn.error(id, true, dn._dn.error_stack['ERROR_COUNT_MIN']);
         return false;
      }

      if (dn._dn.fields[id]['max_check'] != 0 && count >  dn._dn.fields[id]['max_check']) {
         dn.error(id, true, dn._dn.error_stack['ERROR_COUNT_MAX']);
         return false;
      }

   }

   dn.error(id, false, '');
   return true;
}

dn.prototype.set_checkbox = function (id, require, min_check, max_check)
{
   this.fields[id] = {'type' : 'check', 'id' : id,
                      'require' : require, 'min_check' : min_check, 'max_check' : max_check,
                      'error' : null};

   var el = document.getElementsByTagName('input');
   for (var i = 0; i < el.length; i++) {
      if (el[i].id.replace('_' + el[i].value, '') == id) {
        this.event.add(el[i], 'click', dn.check_checkbox);
      }
   }
}

dn.check_radio = function (event)
{
   var el = wp_event.get_element(event);

   dn._check_radio(el);
}

dn._check_radio = function (el)
{

   var id = el.id.replace('_' + el.value, '');

   var els = document.getElementsByTagName('input');
   var count = 0;
   for (var i = 0; i < els.length; i++) {

      if (els[i].id.replace('_' + els[i].value, '') == id && els[i].checked) {
         count++;
      }
   }

   if (el.id == id + '_-1') {
      var id_other = id + '_other'
      var el_other = document.getElementById(id_other);
      var _prev_other = '';
      if (el_other) {
         _prev_other = el_other.value;
      }

      var other = prompt('', _prev_other);
      if (other != null) {
          if (el_other) {
             el_other.value = other;
          } else {
		       var other_i = document.createElement("input");
		       other_i.setAttribute('type','hidden');
		       other_i.setAttribute('value', other);
		       other_i.setAttribute('name', id_other);
		       other_i.setAttribute('id', id_other);
		       dn._dn.elform.appendChild(other_i);
          }
      } else {
         el.checked = false;
      }
   }

   if (dn._dn.fields[id]['require'] && count <= 0) {
      dn.error(id, true, dn._dn.error_stack['ERROR_COUNT_MIN']);
      return false;
   }
   dn.error(id, false, '');
   return true;
}

dn.prototype.set_radio = function (id, require)
{
   this.fields[id] = {'type' : 'radio', 'id' : id,
                      'require' : require,
                      'error' : null};

   var el = document.getElementsByTagName('input');
   for (var i = 0; i < el.length; i++) {
      if (el[i].id.replace('_' + el[i].value, '') == id) {
        this.event.add(el[i], 'click', dn.check_radio);
      }
   }
}

dn.error = function (id, error, error_message)
{
   var el_e = document.getElementById(id + '_error');
   var el_e_c = document.getElementById(id + '_error_content');
   if (error) {
      if (el_e) {
         el_e.style.display = utils.is_ie ? 'inline' : 'table-row';
      }
      el_e_c.style.display = 'block';
      el_e_c.innerHTML = error_message;

   } else {
      el_e_c.style.display = 'none';
      el_e_c.innerHTML = '&nbsp';
      if (el_e) {
         el_e.style.display = 'none';
      }

   }
   if (dn._dn.fields[id]) {
      dn._dn.fields[id]['error'] = error;
   }
   dn.check();

}

dn.set_block_info = function (code, error_message)
{

   var el_e = document.getElementById('DN_block_error');
   var el_e_c = document.getElementById('DN_block_error_content');
   if (code != 1) {
      if (el_e) {
         el_e.style.display = utils.is_ie ? 'inline' : 'table-row';
      }
      el_e_c.style.display = 'block';
      el_e_c.innerHTML = error_message;

   } else {
      el_e_c.style.display = 'none';
      el_e_c.innerHTML = '&nbsp';
      if (el_e) {
         el_e.style.display = 'none';
      }

   }
}

dn.check = function ()
{
   var _false = true;
   for (var id in dn._dn.fields) {
      if (dn._dn.fields[id]['error'] == true) {
         _false = false;
         break;
      }
   }
   dn._dn.form_submit = _false;
}

dn.check_all = function ()
{

   for (var id in dn._dn.fields) {
      if (dn._dn.fields[id]['error'] == null) {//;
         if (dn._dn.fields[id]['type'] == 'input') {
            var el = document.forms[dn._dn.form_name].elements[id];
            dn._check_input(el);
         } else if (dn._dn.fields[id]['type'] == 'radio' || dn._dn.fields[id]['type'] == 'check') {
            var els = document.getElementsByTagName('input');
            for (var i = 0; i < els.length; i++) {
               if (els[i].id.replace('_' + els[i].value, '') == id) {
                  if (dn._dn.fields[id]['type'] == 'radio') {
                     dn._check_radio(els[i]);
                  } else {
                     dn._check_checkbox(els[i]);;
                  }
                  break ;
               }
            }
         }
      }
   }
   dn.check();
}

dn.co_submit = function ()
{

   dn.check_all();
   if (dn._dn.form_submit) {
      dn._dn.elform_submit.disabled = true;
      // выделение все ин блоков в поле типа мульти выбор
      for (var id in dn._dn.fields){
         if (dn._dn.fields[id]['type'] == 'select_multy') {
            var el = document.forms[dn._dn.form_name].elements[id];
            for (var i = 0; i < el.options.length; i++) {
               el.options[i].selected = true;
            }
         }
      }
      return true;
   }
   return false;
}

var DN_restore_level = 1;
var DN_restore_field = '';
var DN_restore_type = '';

dn.prototype.start = function ()
{
   this.elform = document.getElementById(this.form_name);
   this.elform_submit = document.getElementById('submit');
   this.event.add(this.elform, 'submit', dn.co_submit);
}

dn.restore = function (url, assemble_id, field, type, title)
{
   $('#dialogTopContent').html(title);
   $('#dialog').attr('dialog_mnemonic', '#restore_'+field);
   if($('#dialog').css('display') == 'none') {
		$('#dialog').show('drop', {direction : 'up', distance: 1020}, 400);
	} else {
		$('#dialog').hide('transfer', { to: $('#dialog').attr('dialog_mnemonic'), className: 'transferer2' }, 400, 	setTimeout(function(){ $("#dialog:visible").hide().fadeOut();		}, 100));
		return false;
	}
   
   document.documentElement.onkeypress = wp_modal_window.keypress;
   var req = new JsHttpRequest();
   req.onreadystatechange = function() {
       if (req.readyState == 4) {
          if (req.responseJS) {
          	 $('#dialogContent').html(req.responseJS.dn_restore);
             DN_restore_level = 1;
             DN_restore_field = field;
             DN_restore_type = type;
          }
       }
    }
    req.caching = false;
    req.open('GET', url + '?restore_id=' + assemble_id + '&restore_field=' + field, true);
    req.send();
}

dn.select_restore = function ()
{
   var el = document.getElementById('dn_restore');
   var v = el.options[el.selectedIndex].value;
   document.getElementById('dn_restore_value_' + v).style.display = 'block';
   document.getElementById('dn_restore_value_' + DN_restore_level).style.display = 'none';
   DN_restore_level = v;
}

dn.change_restore = function ()
{
   var restore = document.getElementById('dn_restore_value_' + DN_restore_level).innerHTML;
   var el = document.getElementById(DN_restore_field);
   switch (DN_restore_type) {
      case 'editor' :
         var inst = tinyMCE.get(DN_restore_field);
         inst.setContent(restore);
         break;
      case 'input'  :
         el.value = restore;
         break;
   }
   $('#dialog').hide('transfer', { to: $('#dialog').attr('dialog_mnemonic'), className: 'transferer2' }, 400, setTimeout(function(){ $("#dialog:visible").hide().fadeOut();		}, 100)	);
}

dn.get_container_data = function(id)
{
   var send_data = {};

    var varr   = document.getElementById(id);
    var inputs = varr.getElementsByTagName('input');
    var textarea = varr.getElementsByTagName('textarea');
    var select = varr.getElementsByTagName('select');


    for (var i = 0; i < inputs.length; i++) {
          if (inputs[i].type == 'radio' || inputs[i].type == 'checkbox') {
             if (inputs[i].checked) {
                send_data[inputs[i].name] = inputs[i].value;
             }
          } else {
             send_data[inputs[i].name] = inputs[i].value;
          }
    }

    for (var i = 0; i < textarea.length; i++) {
        send_data[textarea[i].name] = textarea[i].value;
    }

    for (var i = 0; i < select.length; i++) {

          if (select[i].type == 'select-one') {
             if (select[i].selectedIndex != -1) {
                send_data[select[i].name] = select[i].options[select[i].selectedIndex].value;
             }
          } else {
             send_data[select[i].name] = new Array();
             for (var j = 0; j < select[i].options.length; j++) {
                if (select[i].options[j].selected == true) {
                   send_data[select[i].name][j] = select[i].options[j].value;
                }
             }
          }

    }
    return send_data;
}