/***************************************************************************
 *                              dn.js
 *                              ---------
 *   begin                : Ignatov V. Oleg, Apr 19, 2006
 *   author               : Ignatov V. Oleg (o.ignatov@westpower.ru)
 *   copyright            : (C) 2006-2008 West Power Development Studio 
 *   mail                 : support@westpower.ru
 *   url                  : www.westpower.ru
 *   license              : commerce
 *
 *   $Id: dn.inc.js,v 1.31 2007/12/25 09:36:09 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)
{
   //var el = wp_event.get_element(event);
   if (dn._dn.fields[el.id]['require'] || el.value != '') {
      if (el.value == '' || 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.getElementById(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_MAX']);        
      } 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_MIN']);   
      } 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.getElementById(id);
   var el_s_out = document.getElementById(id + '_out');
   var el_b_out_all = document.getElementById(id + '_boutall');
   var el_b_out = document.getElementById(id + '_bout');
   var el_b_in = document.getElementById(id + '_bin');
   var el_b_in_all = document.getElementById(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';
      }      
     
   }
   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.getElementById(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) {
                  //console.log(dn._dn.fields[id]['type']);
                  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){
         //console.log(id);
         if (dn._dn.fields[id]['type'] == 'select_multy') {
            var el = document.getElementById(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)
{
   wp_modal_window.open(600, 500, title, '');
   var req = new Subsys_JsHttpRequest_Js();
   req.onreadystatechange = function() {
       if (req.readyState == 4) {
          if (req.responseJS) {                     
             wp_modal_window.set_content(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 editor_id = tinyMCE.getEditorId(DN_restore_field);
         var inst = tinyMCE.getInstanceById(editor_id);
         inst.setHTML(restore);     
         break;
      case 'input'  :
         el.value = restore;
         break;
   }
   wp_modal_window.close();
}

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;   
}
