LAF = {};

LAF.Page = {
  load:function(url,params){
    location.search = LAT.insertParams2Url(location.href,params);
  }  
}

LAF.Form = {
  submit:function(f,validation,ajax_mode){
    var result = LAF.Form.validate(f,validation);
    if(result && ajax_mode){
      LAT.Form.submit(f,function(data){
        data = OAT.JSON.parse(data);
        if(data.type == 'error'){
          LAF.showError(data.msg);
          return;
        }else if(data.type == 'redirect'){
          window.location = data.data;
          return;
        }
        var msg = 'Данните са записани успешно.\n ';
        if(data.data && data.data.cnt){
          msg += 'Общо:'+data.data.cnt+' записа\n';
        }
        if(data.data && data.data.cnt_insert){
          msg += 'Нови:'+data.data.cnt_insert+' записа\n'
        }
        if(data.data && data.data.cnt_update){
          msg += 'Променени:'+data.data.cnt_update+' записа'
        }
        alert(msg);
      });
      return false;
    }
    return result;
  },
  
  /* Валидира полетата */
  validate:function(f,validation){
    if(f.no_validation) return true;
    var ok = true;
    for(field in validation){
      if(f.elements[field]){
        var el = f.elements[field];

        var result = LAF.Form.validate_field(el,validation[field],'submit')
        //var func = el.onblur;
        if(!result){
          ok = false;  
        }
      }
    }
    if(!ok){
      alert('Пропуснали сте задължително поле.\n Моля, вижте отбелязаните с червено')
    }
    return ok;   
  },
    
  validate_field:function(el,validation,mode){

    var validate_eror = 'Полето е задължително.';
    if(el.length && !el['type']){
      /* подаден ни е масив - би трябвало да е група radio бутони */  
      for (var i = 0; i < el.length; i++) {
        el_r = el[i];
        if (el_r.checked) {
          if(LAT.Dom.isVisible(el_r) && !el_r.disabled){
            return true;
          }
        }
      }
      LAF.Form.validate_field_error(el,mode,validate_eror);
      return false;
      /* Спираме до тук, защото няма какво друго да проверим за радио бутони */
    }

    if(el.type != 'file'){
      el.value = el.value.trim();
    }
    if(mode != 'submit' && el.value == '') return true;
    if(!LAT.Dom.isVisible(el) || el.disabled) return true;
    

    OAT.Dom.hide('validate_eror_'+el.id)    
    if(el.type == 'checkbox'){
      el.parentNode.style.border = '';
    }else if(el.type == 'radio'){
      for (var i = 0; i < el.form[el.name].length; i++) {
        el.form[el.name][i].parentNode.style.border = '';
      }
    }else{
      el.style.border = '';
    }

    if(validation == 'string-cyr'){
       validation = /^([а-яА-Я \-]{1,100})$/i
       validate_eror = 'Полето е задължително и трябва да съдържа само букви на кирилица'

    }else if(validation == 'string-lat'){
       validation = /^([a-z ]{1,100})$/i
       validate_eror = 'Полето е задължително и трябва да съдържа само букви на латиница'

    }else if(validation == 'string-lat-integer'){
       validation = /^([a-z 0-9]{1,100})$/i
       validate_eror = 'Полето е задължително и трябва да съдържа само букви на латиница'

    }else if(validation == 'string'){
       validation = /^([a-zа-я ]{1,100})$/i
       validate_eror = 'Полето е задължително и трябва да съдържа само букви'

    }else if(validation == 'integer'){
       validation = /^([0-9]{1,100})$/i
       validate_eror = 'Полето е задължително и трябва да съдържа само цифри'

    }else if(validation == 'phone'){
       validation = /^([0-9\- \+]{1,100})$/i
       validate_eror = 'Полето е задължително и може да съдържа само цифри'

    }else if(validation == 'email'){
       validation = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i 
       validate_eror = 'Полето е задължително и може да съдържа само валиден e-mail адрес'

    }else if(validation == 'date'){
       validation = /^([0-9]{1,2})\.([0-9]{1,2}).([0-9]{2,4})$/i
       validate_eror = 'Полето трябва задължително да се избере'

    }else if(validation == 'checked'){
       validation = /^(1)$/i
       validate_eror = 'Полето трябва задължително да се избере'

    }else if(validation == 'any'){
       validation = /^(.{1,100})$/i
       validate_eror = 'Полето трябва задължително да се избере'

    }

    var re = new RegExp(validation);
    if(el.type == 'checkbox' || el.type == 'radio'){
      var val = el.checked?1:0;  
    }else if(el.type == 'file'){
      if(eval("(typeof(validate_"+el.id+") == 'undefined')?0:1")){
        var val = 1;
      }else{
        var val = el.value;  
      }
    }else{

      var val = el.value;  
    }
    if(!re.test(val)){
      LAF.Form.validate_field_error(el,mode,validate_eror);
      return false;
    }
    return true;
  },
  
  /* Показва грешка при валидиране на input */
  validate_field_error:function(el,mode,validate_eror){
    if(el.length){
      /* подаден ни е масив - би трябвало да е група radio бутони */  
      for (var i = 0; i < el.length; i++) {
        el[i].parentNode.style.border = 'solid 2px #f00';
      }
      return;
    }
    var err_div = $('validate_eror_'+el.id);
    if(err_div.innerHTML == '' || err_div.auto_validate_eror){
      err_div.innerHTML = validate_eror+'<br><b>'+el.value+'</b>';
      err_div.auto_validate_eror = 1;
    }
    if(mode == 'submit'){
      if(el.type == 'checkbox'){
        el.parentNode.style.border = 'solid 2px #f00';
      }else{
        el.style.border = 'solid 2px #f00';
      }
      //el.focus();
    }else{
      OAT.Dom.show(err_div);
    }
  },
  
  /* Изтегля данни от сървъра по подадени обект, метод,ключ и допълнителни параметри*/
  load_data:function(f,object_name,object_key,params){
    if(object_key == '') return;
    var uparams = '';
    if(params){
      for(params in param){
        uparams += '&'+params[param]+'='+f.elements[params[param]];
      }
    }
    OAT.AJAX.GET('?object_action=get&object_name='+object_name+'&object_key='+object_key+uparams, false, function(data) {
      data = OAT.JSON.parse(data);
      if(data.type != 'ok'){
        LAF.showError(data.msg);
        return;
      }
      data = data.data;
      LAF.Form.clean(f);
      LAF.Form.fill(f,data);
      f.object_key.value = object_key;
    })

  },
  /* Попълва изтеглените данни във форма, като търси съвпадение на имената */
  fill:function(f,data){
    for(row in data){
      if(f.elements[row]){
        var el = f.elements[row];
        if(f.elements[row].type == 'checkbox'){
          f.elements[row].checked = data[row];
        }else if(f.elements[row].getAttribute('calendar')){
          if(d = LAT.getDate(data[row])){
            f.elements[row].value = d.format('d.m.Y');
          }
        }else if(f.elements[row].getAttribute('combobox_params')){
          Combobox_init(f.elements[row]);
          f.elements[row].combo.input_value.value = data[row];
          if(f.elements[row].combo.title_name && data[f.elements[row].combo.title_name])
          f.elements[row].combo.input.value = data[f.elements[row].combo.title_name];
        }else{
          f.elements[row].value = data[row];
          if(el.type == 'select-one'){
            el.style.backgroundColor=el.options[el.selectedIndex].style.backgroundColor;
          }
        }
      }
    }
  },
  edit:function(object_name,object_key,default_values){
    var form_id = object_name + '_form';
    var f = $(form_id);
    if(!f){
      LAF.showError('Form/dialog id="'+form_id+'" not found')
      return;
    }
		 
    if(!f.dialog){
      OAT.Dom.show(f);
      var x = 500;
      for (var i=0;i<f.childNodes.length;i++) {
  			var node = f.childNodes[i];
  			if(node.nodeType != 3){
    			var dims = OAT.Dom.getWH(node);
    			x = Math.max(x,dims[0]);
    		}
  		} 
      f.dialog = new OAT.Dialog("Редактиране",f,{width:x,height:0,modal:1,zIndex:1001,resize:0});
    }
    f.dialog.ok = function(){
      f.dialog.okBtn.disabled = true;
      LAT.Form.submit(f,function(data){
        data = OAT.JSON.parse(data);
        if(data.type != 'ok'){
          LAF.showError(data.msg);
          f.dialog.okBtn.disabled = false;
          return;
        }
        if($(object_name+'_list')){
          OAT.AJAX.GET(LAF.add_base_location()+'content_part='+object_name+'_list', false, function(data) {
            $(object_name+'_list').innerHTML = data;
          })
        }else{
          location.reload();
        }
        f.dialog.hide();
      });
    };
    f.dialog.cancel = function() {
      OAT.AJAX.abortAll();
      f.dialog.hide();
    }
    LAF.Form.clean(f);
    f.dialog.show()
    f.dialog.okBtn.disabled = false;

    if(object_key != ''){
      LAF.Form.load_data(f,object_name,object_key);
    }else if(default_values){
      LAF.Form.fill(f,default_values);
    }
  },

  'new':function(object_name,default_values){
    LAF.Form.edit(object_name,'',default_values);
  },

  'delete':function(object_name,object_key){
    if(!confirm('Сигурни ли сте че искате да изтриете този запис ?')) return
    var addition_params = location.search.substring(1);
    OAT.AJAX.GET('?object_action=delete&object_name='+object_name+'&object_key='+object_key+'&'+addition_params, false, function(data) {
      /* ТОДО - да изтрива реда - проблем: незнам кой ред да изтрия */
      data = OAT.JSON.parse(data);
      if(data.type == 'ok'){
        if($(object_name+'_list')){
          OAT.AJAX.GET(LAF.add_base_location()+'content_part='+object_name+'_list', false, function(data) {
            $(object_name+'_list').innerHTML = data;
          })
        }else{
          location.reload();
        }
      }else{
        LAF.showError(data.msg);
      }
    });
  },

  clean:function(f){
    for(var i=0;i<f.elements.length;i++){
      el = f.elements[i];
      if(el.getAttribute('system') != 1 && el.type != 'button' && el.type !='submit' && el.type != 'checkbox'){
        if(el.type == 'select-one'){
          el.selectedIndex = 0; 
          if(el.getAttribute('onChange')){
            //el.onChange(); 
            el.style.backgroundColor='#fff';
          }
        }else{
          el.value = '';
        }
      }
    }
  },
  parse_js_params:function(str){
    if(str == '') return '';
    var params = str.split(',');
    var url = '';
    for(var i=0;i<params.length;i++){

      param = params[i].split(':');
      if(param[1].indexOf('$') == 0){
        var value = eval(param[1]).value;
      }else{
        var value = param[1];
      }
      url += '&object_key['+param[0]+']='+value+'';
    }
    return url;
  },

  parse_js_param:function(params){
    if(params == '') return '';
    param = params.split(':');
    if(param[1].indexOf('$') == 0){
      var value = eval(param[1]).value;
    }else{
      var value = param[1];
    }
    return '&object_key='+value;
  },

  fill_select:function(obj,callback){
    var obj = $(obj);
    var url = window.location.href;
    if(url.indexOf('?') == -1){
      url += '?';
    }else{
      url += '&';
    }
    url += 'object_action='+obj.object_action+'&';
    url += 'object_name='+obj.object_name;
    url += LAF.Form.parse_js_param(obj.object_key);
    url += '&format=raw';

    OAT.AJAX.GET(url,false, function(data) {
      data = OAT.JSON.parse(data);
      if(data.type == 'error'){
        LAF.showError(data.msg);
        return;
      }
      data = data.data;
      obj.options.length = 0;
      var selected_index = 0;
      for(var i=0;i<data.length;i++){
        OAT.Dom.option(data[i][obj.option_value],data[i][obj.option_key],obj);
        if(obj.select_value == data[i][obj.option_key]){
          selected_index = i;  
        }
      }
      obj.selectedIndex = selected_index;
      if(callback){
        callback();
      }
    });
  },
  value_check_live:function(object_name,obj,action){
    var url = window.location.href;
    url += '&object_name='+object_name;
    url += '&object_action='+action;
    url += '&object_key='+obj.value;
    url += '&format=raw';

    OAT.AJAX.GET(url,false, function(data) {
      data = OAT.JSON.parse(data);
      if(data.type == 'error'){
        LAF.showError(data.msg);
        return;
      }
      data = data.data;
      if(obj.callback){
        obj.callback(data);
      }
    });
  }
}

LAF.Calendar = {
  show:function(obj,callback){
    var obj = $(obj);
    var pos = OAT.Dom.position(obj)
    var o = new OAT.Calendar({popup:true});
    o.dayNames = i18n.get('dayNames');
    o.monthNames = i18n.get('monthNames');
    var fh = document.documentElement.scrollHeight;
    var h = pos[1]+25;
    if(fh - pos[1] < 200 && pos[1] > 230){
      h = pos[1]-225;
    }
	  o.show(pos[0],h,function(date_value){
	    if(obj.disabled){
	      return;  
	    }
	    obj.value = date_value[2]+'.'+date_value[1]+'.'+date_value[0];
	    if(callback){
	      callback(obj);  
	    }
	  })
  }
}
LAF.Table = {
  sort:function(obj,field){
    var table = LAT.find_parent(obj, 'table');
    var col = obj.parentNode;
    if(col.sort_way && col.sort_way == 1){
      col.sort_way = 2;
    }else{
      col.sort_way = 1;
    }
    OAT.AJAX.GET('?content_part='+table.id+'&sort_field='+field+'&sort_way='+col.sort_way, false, function(data) {
      $(table.id).innerHTML = data;
      OAT.Dom.addClass(col.id,'sortcol');
      $(col.id).sort_way = col.sort_way;
    })
  }
}

LAF.Help = {
  show:function(id){
    if(!LAF.Help.help_win){
      help_win = new OAT.Window({close:1,max:0,min:0,width:350,height:0,x:0,y:0,title:"Какво да попълня тук?",resize:0},OAT.WindowData.TYPE_RECT);
      LAF.Help.help_win = help_win;
      document.body.appendChild(help_win.div);
  		var clickRef = function(event) {
  			if (!help_win.visible) { return; }
  			var target = OAT.Dom.source(event);
  			if (OAT.Dom.isChild(target,help_win.div)) { return; }
  			help_win.visible = false;
  			OAT.Dom.hide(help_win.div);
  		}
  		OAT.Dom.attach(document,"click",clickRef);
    }else{
      OAT.Dom.show(help_win.div)  
    }
    help_win.visible = 1;
    var lnk = $('help_link_'+id);
    var txt = $('text_'+id);
    help_win.onclose = function(){OAT.Dom.hide(help_win.div);help_win.visible = 0;};
    help_win.content.style.padding="5px";
    help_win.div.style.backgroundColor="#FFF8CC";
    help_win.div.style.zIndex="1002";
    help_win.content.innerHTML = txt.innerHTML;
    pos = OAT.Dom.position(lnk);
    help_win.anchorTo(pos[0]+20,pos[1]);
    help_win.accomodate();
  },  
  change:function(to,from){
    if(!$('text_'+to).default_text){
      $('text_'+to).default_text = $('text_'+to).innerHTML;
    }
    if($('text_'+from)){
      $('text_'+to).innerHTML = $('text_'+from).innerHTML;
    }else{
      $('text_'+to).innerHTML = $('text_'+to).default_text;
    }
  }
}

LAF.get = function(object_name,object_action,params,callback){
  var url = window.location.href;
  if(url.indexOf('?') == -1){
    url += '?';
  }else{
    url += '&';
  }
  url += '&object_name='+object_name;
  url += '&object_action='+object_action;
  var uparams = '';
  if(params){
    for(var i=0;i<params.length;i++){
      for(param in params[i]){
        uparams += '&'+param+'='+params[i][param];
      }
    } 
  }
  url += uparams + '&format=raw';

  OAT.AJAX.GET(url,false, function(data) {
    data = OAT.JSON.parse(data);
    if(data.type == 'error'){
      LAF.showError(data.msg);
      return;
    }
    data = data.data;
    if(callback){
      callback(data);
    }
  });
}

LAF.showError = function(msg){
  alert('Проблем!\n'+msg)
}

LAF.add_base_location = function(){
  return location.protocol + '//' + location.host + location.pathname + (location.search==''?'?':location.search+'&');
}

function dd(txt){
  if(typeof console == 'object'){
    console.debug(txt);
  }
}


