// постепенное внедрение новых кнопок V2
// class=v2 - используем новый интерфейс
// event=click,keyup - событие, по которому начинается отработка запроса
// ext - использовать ajax.php из указанного расширения сайта
// ext_admin - использовать ajax.php из указанного расширения движка
// success - имя функции, которое будет выполнено после успешного выполения AJAX-запроса. Функции будет передан параметр responseXML
//         - ajax_to_modal_window - функция для показа результата в модальном окне
// остальные атрибуты кнопки являются опциональными и передаются
//
var ajax_script='/cab/ajax.php' ;
var _FE_MODE=0 ;
var jBox_window ;

$j(document).ready(function()
{
    $j('.v1').prepare_form({}) ;
    $j('.v2').prepare_ajax({}) ;
    $j('[is_checked]').ajax_check({}) ;

    $j('textarea.source_code').each(function()
    { var code_id=$j(this).attr('code_id') ;
      var text="" ;
      if (code_id) text=$j('#'+code_id).html() ;
      else         text=$j(this).prev().html() ;
      // вычисляем сколько срок в тексте
      var  arr=text.split('\n');
      $j(this).val(text) ;
      $j(this).attr('rows',arr.length+2) ;

    })

    new jBox('Confirm', {confirmButton: 'Да!',cancelButton: 'Нет'});

    $j('body').on('click','button.cancel',function(){if (jBox_window!=undefined) jBox_window.close();return(false);})

    $j("body").on('keyup','input[lang],input[case]',input_check_lang_case) ;



}) ;

function send_ajax_request(data,func)
{
  //$j.ajax({url:'/ajax.php',type:'POST',dataType:'xml',success:exec_ajax_cmd_success_JQ,data:data});
  //console.log(func) ;
  if (func!==undefined)  $j.ajax({url:ajax_script,type:'POST',dataType:'xml',success:func,data:data});
  else                  $j.ajax({url:ajax_script,type:'POST',dataType:'xml',success:exec_ajax_cmd_success_JQ,data:data});
}

$j.fn.open_modal_panel = function(options)
{
    new jBox('Modal', {openOnInit:true,
                    closeOnBodyClick:false,
                    closeOnMouseleave:false,
                    closeInTitle:true,
                    content:$j(this).attr('panel_id'),
                    title:$j(this).attr('title'),
                    position:{x:'center',y:'center'},
                    width:$j(this).attr('modal_width'),
                    overlay:true,
                    overlayStyles:{color: 'black',opacity: 0.5},
                    overlayFadeDuration: 50,
                    fade: {open: true,close: true},
                    fadeDuration: 500,
                    buttons: [ { title: 'Закрыть'}],
                    //onOpen: function() { if (data.no_close_button!=1) this.addButtons({ title: 'Закрыть' })},
                    onClose: function(){ //if (data.after_close_update_page) location.reload() ;
                                         //if (data.after_close_go_url) document.location=data.after_close_go_url ;
                                       }

                   });
}   ;

$j.fn.prepare_form = function(options)
{ if ($j(this).hasClass('off') || $j(this).hasClass('return')) return ;
  $j(this).each(function(i)
  {   var form=$j(this).closest('form') ;
      //if (!form.length)  { $j(this).wrap('<form style="display:inline;"></form>') ; form=$j(this).closest('form') ; }
      if (form.length) $j(form).attr('method','POST') ; // все отпавки форм только через POST

      // если объект находиться в контейнене с параметром reffer - добавляем этот параметр в текущий элемент
      if ($j(this).attr('reffer')==undefined && $j(this).closest('[reffer]').length) $j(this).attr('reffer',$j(this).closest('[reffer]').attr('reffer')) ;

      var submitFormOnEnter=($j(this).attr('NoSubmitFormOnEnter'))? false:true ;
      // цепляем ajax на соответствующее событие
         //if ($j(this).attr('event')=="click") $j(this).on('click',function(){$j(this).open_modal_panel({})}) ;
         if ($j(this).attr('href')!=undefined && $j(this).attr('href')!="" && !$j(this).hasClass('off')) $j(this).on('click',function()
         {   if ($j(this).attr('window'))
             { window.open($j(this).attr('href'),$j(this).attr('window'),'status=1,dependent=1,width=1200,height=800, resizable=1, scrollbars=yes')
               console.log('Создаем новое окно: '+$j(this).attr('href')) ;
               return(false) ;
             }
             else
             { $j(location).attr('href',$j(this).attr('href'));
               console.log('Открываем в текущем окне: '+$j(this).attr('href')) ;
               return(false) ;
             }
         }) ;
         else if ($j(this).attr('update_page')!=undefined && !$j(this).hasClass('off')) $j(this).on('click',function(){ document.location=document.location ;}) ;
         else $j(this).on('click',send_current_form) ;


  });

  function send_current_form()
  { var form=$j(this).closest('form') ;
    if (!form.length)  { $j(this).wrap('<form style="display:inline;"></form>') ; form=$j(this).closest('form') ; }
    $j(form).attr('method','POST') ; // все отпавки форм только через POST

    // добавляем все атрибуты кнопки как скрытые переменные формы
    convert_tags_to_hiddend_vars(this,form) ; // добавляем атрибуты кликнутой кнопки в форму в виде скрытых переменных - они уйдут в POST через AJAX
    // отправляем форму
    form.submit() ;

  }
} ;


$j.fn.prepare_ajax = function(options)
{ $j(this).each(function(i)
  { if ($j(this).hasClass('off') || $j(this).hasClass('return') || $j(this).hasClass('cancel')) return ;
    if (!$j(this).hasClass('ok'))
  {   // если объект находиться в контейнене с параметром reffer - добавляем этот параметр в текущий элемент
      if ($j(this).attr('reffer')==undefined)
         if ($j(this).closest('[reffer]').length) $j(this).attr('reffer',$j(this).closest('[reffer]').attr('reffer')) ;

      //var submitFormOnEnter=($j(this).attr('NoSubmitFormOnEnter')=='')? false:true ;
      var submitFormOnEnter=false ;

      // эмулируем отправку форму по ENTER - так как передеача параметра через OPTIONS не работает
      if (submitFormOnEnter) $j(this).closest('form').find('input[type=text],input[type=password],select').keydown(send_form_by_enter) ; // поиск по нажатию на enter
      else                   $j(this).closest('form').find('input[type=text],input[type=password],select').keydown(enter_as_tab) ; // переход как по TAB


      var event=$j(this).attr('event') ;
          // поддержка select временно отключена
          //if (this.nodeName=='SELECT' && $j(this).hasClass('data-select'))  new mForm.Element.Select({original:this,max:20,maxBuffer:2,onClose:exec_ajax_cmd_to_data_select}); // для select.data-select
              if (this.nodeName=='SELECT') $j(this).on('change',exec_ajax_cmd) ; // изминение данных - для select
          else if (this.nodeName=='INPUT' && this.type=='checkbox') $j(this).on('change',exec_ajax_cmd) ; // изминение данных - для checkbox
          else if (this.nodeName=='INPUT' && this.type=='text') $j(this).blur(exec_ajax_cmd) ; // изминение данных - для checkbox
          else if (event=='keyup')  $j(this).on('keyup',exec_ajax_cmd) ; // нажатие кнопки - для input
          else if (event=='change') $j(this).on('change',exec_ajax_cmd) ; // изминение данных - для select
          else                                 $j(this).on('click',exec_ajax_cmd) ; // по умолчанию - click
      $j(this).addClass('ok') ;
    }
  });

  function exec_ajax_cmd_to_data_select()
  {
      var element=this.original ;
      exec_ajax_cmd(element) ;
  }

  function exec_ajax_cmd(element)
    { if (element.nodeName!="SELECT") element=this ;
      if (!$j(element).attr('cmd')) return ;
      var params=convert_tag_attributes_to_array(element) ;
      if (!params['value'] || params['event']=='keyup') params['value']=$j(element).val() ; // последнее условие сделано для корретной отправки данных при изменении значения в input
      if ($j(element).attr('type')=="text") params['value']=$j(element).val() ; // корректное получение значения input.text
      if ($j(element).attr('type')=="checkbox") params['checked']=($j(element).attr('checked')? 1:0) ;

      //if ($j(element).attr('type')=="submit" || element.nodeName=="BUTTON") {  $j(element).attr('disabled',true).attr('DIS_OFF',1) ; }

      // для ckeditor4
      if ($j(element).attr('get_ckeditor_content') && editor!=undefined) params['CKeditor_content']=editor.getData();
      // для ckeditor5
      //if ($j(element).attr('get_ckeditor_content') && CKeditor!=undefined) params['CKeditor_content']=CKeditor.getData();

      if (element.nodeName=="SELECT") params['value']=$j(element).val(); // для выпадающих списков
      // проверяем - если есть форма, то отпралявем через ajax данные формы
      var form ;
      if ($j(this).attr('use_form') && $j('form#'+$j(this).attr('use_form')).length) form=$j('form#'+$j(this).attr('use_form')) ;
      else  form=$j(element).closest('form') ;

      // https://github.com/jquery-validation/jquery-validation
      // проверка валидации формы
      // требуется библиотека jquery.validate.js
      if (form!=null && $j(this).attr('no_send_form')==undefined)
      { var validator = $j( form ).validate();
        if (validator!=undefined)
        { var result=validator.form();
          if (result==false)  { show_notife4('Проверьте правильность заполнения формы','red') ;  return ; }
        }
      }

      // блокировка кнопки только после проверки вилидатности формы
      if ($j(element).attr('type')=="submit" || element.nodeName=="BUTTON") {  $j(element).attr('disabled',true).attr('DIS_OFF',1) ; }

      //if (form.length && !$j(element).attr('no_send_form'))
      if (form.length && $j(this).attr('no_send_form')==undefined)
      {  $j(form).submit(function(){return false; }); // если есть форма, блокируем её отправку стандартным способом
         $j(form).ajaxSubmit({url:ajax_script,type:'POST',dataType:'xml',cache:false,error:exec_ajax_cmd_error_JQ,success:exec_ajax_cmd_success_JQ,data:params})  ;
      }
      // если кнопка вне формы - переводим все атрибуты кнопки в переменные и тоже на ajax
      else             $j.ajax({url:ajax_script,type:'POST',dataType:'xml',cache:false,error:exec_ajax_cmd_error_JQ,success:exec_ajax_cmd_success_JQ,data:params});
      if ($j(element).attr('type')!='checkbox' && $j(element).attr('type')!='radio') return(false) ;
     /* {   $j(this).closest('div.grid-container4').mouseleave() ;
          return(false) ;
      }*/
    }

} ;

  // $j(this.form)  - форма, из которой был сделан запрос
  function exec_ajax_cmd_success(responseXML)
  { if (responseXML==null) return([]) ;
    if (responseXML==undefined) return([]) ;
    var data=convert_XML_to_obj(responseXML) ;

    // если передан атрибут и в документе существует блок с таким ID - заменить содержимое блока
    update_panel_by_tag_name(responseXML) ;

    if (data.close_mBox_window) close_jBox_instances('mBox_'+data.close_mBox_window);

    if (data.success) window[data.success](data,responseXML);
    if (data.showErrorMsg)              show_ErrorMsg(responseXML);
    if (data.show_notife)              show_notife2(responseXML);
    if (data.show_modal_window)        show_modal_window(responseXML);
    if (data.show_new_window)          show_new_window(responseXML);
    if (data.update_page==1)           location.reload() ;
    if (data.go_url)                   document.location=data.go_url ;
    if (data.JSCODE)                   $j('body').append(data.JSCODE) ;

    // назначаеим обработчики событий для ввовь созданных элементов
    $j('.v1').prepare_form({}) ;
    $j('.v2').prepare_ajax({}) ;
    if (_FE_MODE==1) $j(document).fastedit() ;
    if ($j('input[mask]').length) $j('input[mask]').each(function(){$j(this).mask($j(this).attr('mask'));}) ;
    //if (input_autoComplete!=undefined) $j('input[SetAutoComplete]').each(input_autoComplete) ;
    $j("select[multiple]").multipleSelect({filter: true});


    //$j(data).each(function(){if ($j())}) ;

    update_capcha() ;
    return(data) ;
  }


  // вторая принимающая функция - для ajax через JQuery
  function exec_ajax_cmd_success_JQ(responseXML,status,link)
  { $j('[DIS_OFF="1"]').attr('disabled',false) ;
    exec_ajax_cmd_success(responseXML);
  }

  function exec_ajax_cmd_error_JQ(request,message,isk)
  {
    //if (isk.message!='undefined')
        alert(message+"\n\n"+isk.message) ;
  }


 // если передан атрибут и в документе существует блок с таким ID - заменить содержимое блока
 function update_panel_by_tag_name(XML)
 { var param ;
   // разные режимы изменения элемента
   var mode='replace_element' ;
   var xml_doc=XML.childNodes[0] ;
   if (!xml_doc.childNodes.length) xml_doc=XML.childNodes[1] ;
   for(var j=0; j<xml_doc.childNodes.length; j++)
   { param=xml_doc.childNodes[j] ;
     if (param.nodeType==1)
     { // получаем имя и атрибуты элемента
       var name=param.nodeName ;
       // если имя содержит .HTML - заменяем содержимое элемента
       if(name.indexOf('.HTML') + 1) { name=name.replace(".HTML","") ; mode='update_inner_html' ; }
       if(name.indexOf('.SRC') + 1) { name=name.replace(".SRC","") ; mode='update_src' ; }
       if(name.indexOf('.APPEND') + 1) { name=name.replace(".APPEND","") ; mode='append' ; }
       if(name.indexOf('.CMD_REPLACE') + 1) { name=name.replace(".CMD_REPLACE","") ; mode='cmd_replace' ; }
       // если элемент с таким id существует
       if ((name!='title' && name!='success' && name!='html' && name!='text') && $j('#'+name)[0]!=undefined)
       { var mode=(param.attributes.getNamedItem('mode')!=null)? param.attributes.getNamedItem('mode').value:mode ;
         //var value=(param.childNodes.length)? param.childNodes[0].nodeValue:"" ;
         //var value=(param.childNodes.length)? param.childNodes[0].innerHTML:"" ;
         //var value=(param.childNodes.length)? param.childNodes[0].textContent:"" ;
         //var value=(param.childNodes.length)? param.innerHTML:"" ;
         var value=(param.childNodes.length)? param.textContent:"" ;

         var element=$j('#'+name) ;
         // если элемент является INPUT или TEXTAREA - обновляем значение элемента
         if (element[0].nodeName=='INPUT' || element[0].nodeName=='TEXTAREA' || element[0].nodeName=='SELECT') mode='update_value' ;
         // если в атрибуте указан режим - испоьзуем этот режим
         if (mode=='append')  { mode='append_to_element' ;  if (element[0].nodeName=='TEXTAREA') mode='append_to_textarea' ; }
         if (mode=='update')  mode='update_inner_html' ;
         if (mode=='replace') mode='replace_element' ;

         switch(mode)
         { case 'replace_element':     element.replaceWith(value) ; break ;
           case 'append_to_element':   element.append(value) ; //+element[0].scrollHeight+' '+element[0].clientHeight) ;
                                       element.animate({scrollTop:element[0].scrollHeight-element[0].clientHeight});
                                       break ;
           case 'append_to_textarea':  element.val($j('#'+name).val()+"\n"+value) ; break ;
           case 'update_value':        element.val(value) ; break ;
           case 'update_inner_html':   $j('#'+name).html(value) ; break ;
           case 'update_src':          element.attr('src',value) ; break ;
           case 'cmd_replace':         element.attr('cmd',value) ; break ;
         }
       }
     }
   }
 }


// показ уведомления
// add_element($doc,$xml,'success','show_notife',array('type'=>'info','pos_x'=>'center','pos_y'=>'center')) ;

function show_notife(data,responseXML)
{ //var tags=get_xml_tag_attr(responseXML,'success') ;
  var notife_type='error' ; if (data.type!=undefined) notife_type=data.type ;
  var pos_x='right' ; if (data.pos_x!=undefined) pos_x=data.pos_x ;
  var pos_y='top' ; if (data.pos_y!=undefined) pos_y=data.pos_y ;
  var delayClose=1500 ; if (data.delayClose!=undefined) delayClose=data.delayClose ;

  // другие варианты $position="{x:'right',y: ['bottom', 'outside']}" ; $target=$open_element ;
  if (text!="") new jBox('Notice', {content: text});
  //new mBox.Notice({content:data.text,type:notife_type,position:{x:pos_x,y:pos_y},overlayFadeDuration: 50,delayClose:delayClose});
}

function show_ErrorMsg(responseXML)
{ var tags=get_xml_tag_attr(responseXML,'showErrorMsg') ;
  var text=get_xml_tag_value(responseXML,'showErrorMsg') ;
  var element_id=get_xml_tag_value(responseXML,'id') ;
  var form=$j('#'+element_id).closest('form');
  $j('#'+element_id).removeClass('m-loader m-loader--right m-loader--light').attr('disabled', false);
  showErrorMsg(form, 'danger', text);

}

var showErrorMsg = function(form, type, msg) {
        var alert = $('<div class="m-alert m-alert--outline alert alert-' + type + ' alert-dismissible" role="alert">\
			<button type="button" class="close" data-dismiss="alert" aria-label="Close"></button>\
			<span></span>\
		</div>');

        form.find('.alert').remove();
        alert.prependTo(form);
        alert.animateClass('fadeIn animated');
        alert.find('span').html(msg);
    }


function show_notife2(responseXML)
{ var tags=get_xml_tag_attr(responseXML,'show_notife') ;
  var text=get_xml_tag_value(responseXML,'show_notife') ;
  var params={};
  params.content=text ;
  if (tags.color) params.color=tags.color ;
  if (tags.type=='error') params.color='red' ;
  var pos_x='right' ; if (tags.pos_x!=undefined) pos_x=tags.pos_x ;
  var pos_y='top' ; if (tags.pos_y!=undefined) pos_y=tags.pos_y ;
  var delayClose=1500 ; if (tags.delayClose!=undefined) delayClose=tags.delayClose ;
  // другие варианты $position="{x:'right',y: ['bottom', 'outside']}" ; $target=$open_element ;
  show_notife3(params) ;
  //new mBox.Notice({content:text,type:notife_type,position:{x:pos_x,y:pos_y},overlayFadeDuration: 50,delayClose:delayClose});
}

function show_notife3(params)
{
  new jBox('Notice',params);
}

function show_notife4(text,color)
{ var params={};
  params.content=text ;
  params.color=color ;
  params.pos_x='right' ;
  params.pos_y='top' ;
  //var pos_x='right' ; if (tags.pos_x!=undefined) pos_x=tags.pos_x ;
  //var pos_y='top' ; if (tags.pos_y!=undefined) pos_y=tags.pos_y ;
  //var delayClose=1500 ; if (tags.delayClose!=undefined) delayClose=tags.delayClose ;
  new jBox('Notice',params);
}

function show_new_window(responseXML)
{   var tags=get_xml_tag_attr(responseXML,'show_new_window') ;
    var url=get_xml_tag_value(responseXML,'show_new_window') ;
    var width=(tags.width)? tags.width:1200 ;
    var height=(tags.height)? tags.height:800 ;
    var newWin=window.open(url,tags.title,'status=1,dependent=1,width='+width+',height='+height+', resizable=1, scrollbars=yes') ;
    newWin.focus() ;
}

// показ результатов ajax  в модальном окне
// data - массив с параметрами окна
// data.html            - текст, который будет выведен в окне
// data.text            - тот же html но очищенный от метатегов - для вывода в случае ошибкт
// data.no_close_button - показывать или нет кнопку "закрыть"
// data.modal_panel_width   -   ширина модального окна
// data.after_close_update_page - обновление страницы/фрейма после закрытия модального окна
// data.after_close_go_url - переход на указанный url после закрытия модального окна
function modal_window(data,responseXML){ajax_to_modal_window(data,responseXML)}
function show_modal_window(responseXML)
{ var tags=get_xml_tag_attr(responseXML,'show_modal_window') ;
  var text=get_xml_tag_value(responseXML,'show_modal_window') ;
  // совместимость со старыми параметрами
  if (tags.width!=undefined)  tags.modal_panel_width=tags.width ;
  if (tags.pos_x!=undefined)  tags.modal_panel_pos_x=tags.pos_x ;
  if (tags.pos_y!=undefined)  tags.modal_panel_pos_y=tags.pos_y ;
  if (tags.target!=undefined) tags.modal_panel_target=tags.target ;
  if (tags.cmd==undefined)    tags.cmd=get_xml_tag_value(responseXML,'cmd');
  if (text=='HTML')           tags.html=get_xml_tag_value(responseXML,'html');

  ajax_to_modal_window(tags,responseXML)
}
function ajax_to_modal_window(data,responseXML)
    {  var width = (data.modal_panel_width)? data.modal_panel_width:500 ;  //  ширина модального окна
       var pos_x=(data.modal_panel_pos_x)? eval(data.modal_panel_pos_x):'center'  ;
       var pos_y=(data.modal_panel_pos_y)? eval(data.modal_panel_pos_y):'center'  ;      // другие варианты $position="{x:'right',y: ['bottom', 'outside']}" ; $target=$open_element ;
       var target=(data.modal_panel_target)? data.modal_panel_target:null  ;      // другие варианты $position="{x:'right',y: ['bottom', 'outside']}" ; $target=$open_element ;
        close_jBox_instances() ;
       //var result_panel_id=data.cmd+'_ajax_result' ;
                 // промежуточная панель используется для того, чтобы отработался JS код из html, будет автоматом удалена после mBox_ajax_result.open();
                 //$j('div#mBox_'+data.cmd).next('div').remove() ;
                 //$j('div#mBox_'+data.cmd).remove() ;
                 //$j('div#'+result_panel_id).remove() ;
                 //$j('body').after('<div id='+result_panel_id+'>'+data.html+'</div>') ;
                 jBox_window=   new jBox('Modal', {id : 'mBox_'+data.cmd,
                                    openOnInit:false,
                                    closeOnBodyClick:false,
                                    closeOnMouseleave:false,
                                    closeInTitle:true,
                                    //content:$j('#'+result_panel_id),
                                    content:data.html,
                                    title:data.title,
                                    target:target,
                                    position:{x:pos_x,y:pos_y},
                                    width:width,
                                    overlay:true,
                                    overlayStyles:{color: 'black',opacity: 0.5},
                                    overlayFadeDuration: 50,
                                    fade: {open: true,close: true},
                                    fadeDuration: 500,
                                    closeButton:'title',
                                    onOpen: function()
                                    { //if (!data.no_close_button) this.addButtons([{ title: 'Закрыть' }]) ;
                                      //if (data.button_1) this.addButtons([{}]) ;
                                        $j(this.content).find('.cancel').click(function() {
                                            close_jBox_instances() ;
                                            //$j(this).jBox_instances().close() ;
                                        }) ;
                                        $j(this.content).find('.v1').prepare_form({}) ;
                                        $j(this.content).find('.v2').prepare_ajax({}) ;
                                        if ($j('input[mask]').length) $j('input[mask]').each(function(){$j(this).mask($j(this).attr('mask'));}) ;
                                        $j('[data-required]').attr('required',true) ;
                                        //$j('input[SetAutoComplete]').each(input_autoComplete) ;

                                    },
                                    onOpenComplete:function()
                                    { //alert(1) ;


                                      //var el_id=data.el_id  ;
                                      //$j('div#inner_'+el_id).tinyscrollbar({}) ;
                                      ///$j('img.zoom').hs_zoom({}) ;
                                      //$j('img.zoom2').hs_zoom2({}) ;
                                    },
                                    onClose: function()
                                    { if (data.after_close_update_page) location.reload() ;
                                      if (data.after_close_go_url) document.location=data.after_close_go_url ;
                                      if (data.after_close_func) eval(data.after_close_func+'()')  ;
                                    },
                                    onCloseComplete: function()
                                    {
                                      $j('#'+this.id).remove() ;
                                    }
                       });
        jBox_window.open() ;

    }

// возвращает экземпляр модального окна mBox, в котором находиться указанный элемент
function get_jBox_instances(mBox_id)
{  var jBox_instances=null ;
   jBox.instances.each(function(instance)
     { try { if (instance.id=mBox_id) jBox_instances=instance; }
       catch(e) {}
                                   });
   return(jBox_instances) ;
              }

// возвращает экземпляр модального окна mBox, в котором находиться указанный элемент
function close_jBox_instances(mBox_id)
{   if (jBox_window!=undefined) jBox_window.close() ;
    //return ;
   /* jBox.instances.each(function(instance)
     { try { if (mBox_id='mBox_all') instance.close();
             else if (instance.id=mBox_id) instance.close(); }
       catch(e) {}
     });*/
}

// возвращает экземпляр модального окна mBox, в котором находиться указанный элемент
$j.fn.jBox_instances = function()
{  var jBox_instances=null ;
   var mBox_id=$j(this).closest('.jBox-Modal').attr('id') ;
   if (jBox.instances!=undefined) jBox.instances.each(function(instance)
     { try { if (instance.id=mBox_id) jBox_instances=instance; }
       catch(e) {}
     }) ;
   return(jBox_instances) ;
} ;

function alert_array(data)
  { var acc = [] ;
    $j.each(data, function(index, value){acc.push(index + ': ' + value);});
    alert(JSON.stringify(acc,"",1));
  }

// возвращем массив с атрибутами тега
 // просто вернуть .attributes нельзя, так как в IE в этом свойсве хранятся, помимо атрибутов, также и DOM-свойства объекта. Другого места, где находились бы атрибуты тега, в IE нет.
 // поэтому для выделения тегов разбираем  outerHTML тега
 // можно разобрать outerHTML через регулярное выражение /\b((\w+)=(["'])([^"']+)["'])/ig  при условии, что все значения тегов заключены в ковычки
 // но и тут IE отличился -  его outerHTML не заключает в ковычки атрибуты id,name,value: <input id=test class="demo my input" reffer="1111" cmd="222/888" name=a333 value=444s>
 // что сильно усложняет подбор регулярного выражения
 // в итоге был выбран промежуточный вариант - имена тегов получаем из outerHTML, а значения тегов из .attributes
 function convert_tag_attributes_to_array(tag_obj)
 {   var arr_attr= {} ;
     var text=tag_obj.outerHTML ;
     var myRe = /\b((\w+)=)/ig;
      while ((myArray = myRe.exec(text)) != null)
      {   var name = myArray[2] ;
          var attr=tag_obj.attributes.getNamedItem(name) ;
          if (attr!=null) arr_attr[name] = attr.value ;
   }
    return arr_attr ;
}

// переменосим параметры из <input type=submit......> в сткрытые переменные перед отправкой формы по AJAX
// вызывается из mForm.Submit.js
function convert_tags_to_hiddend_vars(input,form)
{  // удаляем старые временные переменные, если форма отправляется повторно
   $j(form).find('input.temp[type="hidden"]').remove() ;
   // переводим все аттрибуты кликнутого элемента в скрытые переменные
   //ВНИМАНИЕ! в IE в input.attributes будут находиться все свойства объекта, а не только атрибуты тега
   var arr_attr=convert_tag_attributes_to_array(input) ;
   for (key in arr_attr) $j(form).append('<input type="hidden" class="temp" name="'+key+'" value="'+arr_attr[key]+'">') ;
   {   //$j(form).append('<input type="hidden" class="temp" name="'+key+'" value="'+arr_attr[key]+'">') ;
       //var temp_input = new Element('input', {'type': 'hidden','class': 'temp','name': key,'value':arr_attr[key]});
       //temp_input.inject(form) ;
   }
   //$j(form).reInit=1 ;
   //for(var j=0; j<input.attributes.length; j++) $j(form).add($j('<input type="hidden" class="temp" name="'+input.attributes.item(j).nodeName+'" value="'+input.attributes.item(j).nodeValue+'">').get()) ;
   // сохраняем содержимое радектора в форме
   //if (editor)  { $j('textarea[name="'+editor.name+'"]').val(editor.getData()) ;  }
   //if (CKEDITOR!=undefined && CKEDITOR.length) $j.each(CKEDITOR.instances,function(){this.updateElement()})  ;
   //
   //removeEditor() ;
}



function update_capcha()
{  // обновляем капчу по всем документе сразу - чтобы не было разных данных
  //$j(panel).find('img.checkcode').attr('src',$j(panel).find('img.checkcode').attr('src')) ;
  //$j(panel).find('input.checkcode').val('') ;
  $j('img.checkcode').attr('src',$j('img.checkcode').attr('src')) ;
  $j('input[name="_check_code"]').val('') ;
}

// проверка корректности полей формы через AJAX ---------------------------------------------------------------------------------------------------------------------------------

$j.fn.ajax_check = function(options)
{ var settings = $j.extend(
     { 'position' : {x: ['right', 'outside'],y:'center'}
     }, options);


 $j(this).each(function(i)
 { var cur_element=this ;
  var tooltip_alert ;

   $j(this).on('change',function()
       {  $j.ajax({url:ajax_script,type:'POST',dataType:'xml',cache:false,success:check_success,
                   data:{   ext:$j(this).attr('ext'),
                            cmd:$j(this).attr('is_checked'),
                            element_id:$j(this).attr('id'),
                            value:$j(this).val()
                        }
                  });
       }) ;

   function check_success(data,status,link)
      { if (status=='success')
          { var xml = link.responseXML;
            if (xml==undefined) return ;
        var data=convert_XML_to_obj(xml) ;
        var result = data.result;
        if (!result) {  $j(cur_element).addClass('input_error').removeClass('check_ok') ;
                        var alert_text = $j(cur_element).attr('alert_text');
                        if (!alert_text) alert_text=data.alert_text;
                        var content_class=(data.content_class!=undefined)? data.content_class:'alert' ;
                        //tooltip_alert = new
                          //$j('#propusk').jBox('Tooltip',{content: alert_text,
            /*
                          $j('#'+$j(cur_element).attr('id')).jBox('Tooltip',{content: alert_text,
                                                          //attach: cur_element ,
                                                          //target: $j('#'+$j(cur_element).attr('id')) ,
                                                          //target: cur_element ,
                                                          position: settings.position,
                                                          //closeOnBodyClick: true,
                                                          openOnInit:true,
                                                          //instant:false,
                                                          addClass:{content:content_class},
                            zIndex: 11000
                                 });*/
                         $j(cur_element).closest('form').find('input[type="submit"]').attr('disabled',true) ;
                      }
        else          { if (tooltip_alert!=undefined && tooltip_alert.length) tooltip_alert.close({instant:false}) ;
                        $j(cur_element).closest('form').find('input[type="submit"]').attr('disabled',false) ;
                        $j(cur_element).removeClass('input_error').addClass('check_ok') ;
                      }
          }
      }

 }) ;


} ;


function enter_as_tab2(e)
{ var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
  if(key == 13) {
       e.preventDefault();
       var inputs = $j(this).closest('form').find(':input:visible');
       inputs.eq( inputs.index(this)+ 1 ).focus();
   }
}

function enter_as_tab(e) {
            /* ENTER PRESSED*/
        //console.log(e.which) ;
            if (e.which == 13) {
                /* FOCUS ELEMENT */
                var inputs = $j(this).parents("form").eq(0).find(":input");
                var idx = inputs.index(this);

                if (idx == inputs.length - 1) {
                    inputs[0].select()
                } else {
                    inputs[idx + 1].focus(); //  handles submit buttons
                    inputs[idx + 1].select();
                }
                return false;
            }
        }

function send_form_by_enter(e)
{
    if(e.keyCode==13)$j(this).closest('form').find('input[type=submit]').click() ;
}



// функции для обработки элементов ввода ---------------------------------------------------------------------------------------------------------------------------------

var map_to_RUS = { 'q' : 'й', 'w' : 'ц', 'e' : 'у', 'r' : 'к', 't' : 'е', 'y' : 'н', 'u' : 'г', 'i' : 'ш', 'o' : 'щ', 'p' : 'з', '[' : 'х', ']' : 'ъ', 'a' : 'ф', 's' : 'ы', 'd' : 'в', 'f' : 'а', 'g' : 'п', 'h' : 'р', 'j' : 'о', 'k' : 'л', 'l' : 'д', ';' : 'ж', '\'' : 'э', 'z' : 'я', 'x' : 'ч', 'c' : 'с', 'v' : 'м', 'b' : 'и', 'n' : 'т', 'm' : 'ь', ',' : 'б', '.' : 'ю','Q' : 'Й', 'W' : 'Ц', 'E' : 'У', 'R' : 'К', 'T' : 'Е', 'Y' : 'Н', 'U' : 'Г', 'I' : 'Ш', 'O' : 'Щ', 'P' : 'З', '[' : 'Х', ']' : 'Ъ', 'A' : 'Ф', 'S' : 'Ы', 'D' : 'В', 'F' : 'А', 'G' : 'П', 'H' : 'Р', 'J' : 'О', 'K' : 'Л', 'L' : 'Д', ';' : 'Ж', '\'' : 'Э', 'Z' : '?', 'X' : 'ч', 'C' : 'С', 'V' : 'М', 'B' : 'И', 'N' : 'Т', 'M' : 'Ь', ',' : 'Б', '.' : 'Ю'};
var map_to_LAT = { 'й' : 'q', 'ц' : 'w', 'у' : 'e', 'к' : 'r', 'е' : 't', 'н' : 'y', 'г' : 'u', 'ш' : 'i', 'щ' : 'o', 'з' : 'p', 'Х' : '[', 'Ъ' : ']', 'ф' : 'a', 'ы' : 's', 'в' : 'd', 'а' : 'f', 'п' : 'g', 'р' : 'h', 'о' : 'j', 'л' : 'k', 'д' : 'l', 'Ж' : ';', 'Э' : '\'', 'я' : 'z', 'ч' : 'x', 'с' : 'c', 'м' : 'v', 'и' : 'b', 'т' : 'n', 'ь' : 'm', 'Б' : ',', 'Ю' : '.', 'Й' : 'Q', 'Ц' : 'W', 'У' : 'E', 'К' : 'R', 'Е' : 'T', 'Н' : 'Y', 'Г' : 'U', 'Ш' : 'I', 'Щ' : 'O', 'З' : 'P', 'Ф' : 'A', 'Ы' : 'S', 'В' : 'D', 'А' : 'F', 'П' : 'G', 'Р' : 'H', 'О' : 'J', 'Л' : 'K', 'Д' : 'L', '?' : 'Z', 'ч' : 'X', 'С' : 'C', 'М' : 'V', 'И' : 'B', 'Т' : 'N', 'Ь' : 'M'};

function input_check_lang_case(e)
{ if(e.keyCode!=37 && e.keyCode!=39)
    { var str = $j(this).val();
      var r = '';
      if ($j(this).attr('lang')=='RUS') for (var i = 0; i < str.length; i++) { r += map_to_RUS[str.charAt(i)] || str.charAt(i); }
      else if ($j(this).attr('lang')=='LAT') for (var i = 0; i < str.length; i++) { r += map_to_LAT[str.charAt(i)] || str.charAt(i); }
      else r=str ;
      if ($j(this).attr('case')=='LOVER') r=r.toLowerCase()  ;
      if ($j(this).attr('case')=='UPPER') r=r.toUpperCase()  ;
      $j(this).val(r);
      //console.log(e.keyCode) ;
    }
}


// функции для обработки XML ---------------------------------------------------------------------------------------------------------------------------------

// переносим данные из XML в массив
 function convert_XML_to_obj(XML)
 {  var arr= {} ; var param ;
   var xml_doc=XML.childNodes[0] ;
   if (!xml_doc.childNodes.length) xml_doc=XML.childNodes[1] ;
   for(var j=0; j<xml_doc.childNodes.length; j++)
   { param=xml_doc.childNodes[j] ;
     var name=param.nodeName ;
     if (param.childNodes.length) arr[name]=param.childNodes[0].nodeValue ;
     else                         arr[name]="" ;
   }
   return(arr) ;
 }


function get_xml_tag_value(xml,tag_name)
{   var elem = xml.getElementsByTagName(tag_name);
    if (elem.length)
    {   if ($j.browser.msie) return(elem[0].text);
        else                 return(elem[0].textContent);
    }
    else return('');
}

// получаем атрибуеты XML TAG объекта
// тут в IE атрибуты отрабатывают нормально - в атрибутах только атрибуты, без свойтсв
function get_xml_tag_attr(xml,tag_name)
{   var attr = new Object();
    if (xml.getElementsByTagName(tag_name).length)
    { var attr_XML=xml.getElementsByTagName(tag_name).item(0).attributes;
      if (attr_XML.length) for(var j=0; j<attr_XML.length; j++) attr[attr_XML[j].nodeName]=attr_XML[j].nodeValue ;
    }
    return(attr);
}

// получаем атрибуеты XML OBJ объекта
function get_xml_obj_attr(obj)
{   var attr_XML=obj.attributes;
    var attr = new Object();
    for(var j=0; j<attr_XML.length; j++) attr[attr_XML[j].nodeName]=attr_XML[j].nodeValue ;
    return(attr);
}
