function no_ajax()
{
  $("#fade, #ajax_load_img").fadeOut(200);
  if (ajax_tmr) clearTimeout(ajax_tmr); ajax_tmr = null;   
}
ajax = function(url, callback)
{
  if (arguments.length > 2 || callback == "r")
  {
    if (typeof(arguments[2]) == "string") var str = arguments[2];
    else var str = arguments[2] === 2 ? "Gegevens ophalen..." : "Gegevens verwerken...";
    if (arguments[2] != "none") handle_ajax(str);
  }
  
  if (typeof(callback) == "string" && callback == "r")
  {
    callback = function(xml) 
    {
      var data = xml.responseText;
      no_ajax();
      document.location.reload();
    };
  }
  var idx = url.indexOf("?");
  if (idx > 0)
  {
    var raw_url = url.substring(0, idx);
    var post_vars = url.substr(raw_url.length+1);
  } else
  {
    var raw_url = url;
    var post_vars = null;
  }
  
  var params = typeof(arguments[3]) != "undefined" ? arguments[3] : null;
  
  jQuery.ajax( { 
    url: raw_url,
    data: post_vars,
    type: "post",
    success: function(data)
    {
      no_ajax();
      callback({responseText:data}, params);
    }
  });
};
ajax_json = function(url, callback)
{
  if (arguments.length > 2 || callback == "r")
  {
    if (typeof(arguments[2]) == "string") var str = arguments[2];
    else var str = arguments[2] === 2 ? "Gegevens ophalen..." : "Gegevens verwerken...";
    if (arguments[2] != "none") handle_ajax(str);
  }
  
  if (typeof(callback) == "string" && callback == "r")
  {
    this.callback_action = callback;
    callback = function(xml) 
    {
      no_ajax();
      document.location.reload();
    };
  }
  
  var idx = url.indexOf("?");
  if (idx > 0)
  {
    var raw_url = url.substring(0, idx);
    var post_vars = url.substr(raw_url.length+1);
  } else
  {
    var raw_url = url;
    var post_vars = null;
  }
  
  var params = typeof(arguments[3]) != "undefined" ? arguments[3] : null;
  
  jQuery.ajax( { 
    url: raw_url,
    data: post_vars,
    type: "post",
    success: function(data)
    {
      no_ajax();
      if (data != "SUCCESS")
      {
        try {
          var a = $.parseJSON(data);
        } catch(error) { alert(data); return; }
        if (!a) { alert("Geen (json) resultaat."); return; }
        if (!a.succes) { alert(a.msg); return; }
        if (typeof(callback) == "function") callback({responseText:data, json: a}, params);
      } else if (typeof(callback) == "function") callback({responseText:data}, params);
    }
  });
};

var ajax_tmr = null;
function handle_ajax(str)
{
    if (!document.getElementById("ajax_info_txt")) return;
    
    document.getElementById("ajax_info_txt").innerHTML = str;
    var scrolltop = get_scroll_top();
    $("#fade").height(document.body.scrollHeight + "px").css("top", scrolltop + "px");
    
    $("#ajax_load_img").css("top", (350 + scrolltop) + "px");
   
    clearTimeout(ajax_tmr); ajax_tmr = null;
    ajax_tmr = setTimeout(_handle_ajax, 400);
}
function _handle_ajax(str)
{
  $("#fade").fadeIn(300);
  $("#ajax_load_img").show().centerScreen();
  var img = $("#ajax_load_img").find("img");
  img.css("margin-top", (($("#ajax_load_img").height() / 2) - img.height()) + "px");
}

// ######################### FORM SUBMIT ######################## \\
function form_submit()
{
  if (arguments.length > 0) var f = document.forms[arguments[0]];
  else var f = document.forms[0];
  if (!f) return true;
  var params = "";
  for (n = 0; n < f.elements.length; n++)
  {
    var o = f.elements[n];
    if (!o || !o.tagName || !o.name || o.name == "") continue;
    var v = "";
    switch(o.tagName)
    {
      case "INPUT": 
        v = encodeURIComponent(o.value);
        if ( (o.type != "checkbox" && o.type != "radio") || o.checked)
          params += "&" + o.name + "=" + v; 
        break;
      case "TEXTAREA": 
        if (tinyMCE.get(o.id))
          v = encodeURIComponent(tinyMCE.get(o.id).getContent());
        else
          v = encodeURIComponent(o.value.replace(/\n/g, "<br/>"));
        params += "&" + o.name + "=" + v; 
        break;
      case "SELECT": 
      {
        var ops = o.options;
        if (o.multiple)
        {
          var added = false;
          for(on = 0; on < ops.length; on++)
          {
            if (ops[on] && ops[on].tagName && ops[on].tagName.toUpperCase() == "OPTION" && (ops[on].selected || o.getAttribute("save_all") == "true") && parseInt(on) == on)
            {
              params += "&" + o.name + "=" + ops[on].value;
              added = true;
            }
          }
          if (!added) params += "&" + o.name + "=";
        } else if (o.selectedIndex >= 0) params += "&" + o.name + "=" + ops[o.selectedIndex].value;
        break;
      }
    }
  }
  return params;
}
Ajax_search_boxes = Array();
Ajax_search_box = function(id, url, txt_value, id_value, callback)
{
  Ajax_search_boxes["object_" + id] = this;
  
  this.id = id;
  this.obj = null;
  this.ajax_results = null;
  this.ajax_start_timer = null;
  this.ajax_search_select_funct = callback;
  this.ajax_res_sel = -1;
  this.url = url;
  this.id_value = id_value;
  this.txt_value = txt_value;
  this.result_count = 0;
  
  this.start_ajax_searching = function(event)
  {
    var key = event.keyCode || event.which;
    
    var c = String.fromCharCode(key).toLowerCase();
    if (c < "a" || c > "z") return false;
    
    if (event.keyCode == 40 || event.keyCode == 38) return;
    if (event.keyCode == 13 && Ajax_search_boxes["object_" + id].ajax_res_sel >= 0)
    {
      Ajax_search_boxes["object_" + id].ajax_search_select($("#ajax_results_" + id + " div a.active"));
      return; 
    }
           
    this.search_value = this.value;  
    $("#div_" + id).html("");
    $("#_" + id).val("");
    Ajax_search_boxes["object_" + id].ajax_res_sel = -1;
    $.clear(Ajax_search_boxes["object_" + id].ajax_start_timer);
    Ajax_search_boxes["object_" + id].ajax_start_timer = $.timeout(function() { Ajax_search_boxes["object_" + id]._start_ajax_searching(id);}, 500);
  };
  this._start_ajax_searching = function(obj)
  {              
    var obj = $("#ajax_search_" + obj);
    var tmp = obj.val();
    Ajax_search_boxes["object_" + id].set_value("", -1); 
    obj.val(tmp);
    if (obj.val().length < 3) { Ajax_search_boxes["object_" + id].stop_ajax_searching(); return false; }
    var url = this.url;
    url += "?val=" + Ajax_search_boxes["object_" + id].obj.val();
    Ajax_search_boxes["object_" + id].ajax_results = new ajax_json(url, Ajax_search_boxes["object_" + id].ajax_update_search);
  };

  // VANAF HIER VERDER
  this.ajax_search_select = function(obj)
  {
    //Ajax_search_boxes["object_" + id].set_value(obj.html(), obj.attr("_id"));
    //return;
    
    Ajax_search_boxes["object_" + id].obj.val(obj.html().replace(/<[^>]+>/g, ""));
    
    Ajax_search_boxes["object_" + id].txt_value = obj.html();    
    Ajax_search_boxes["object_" + id].id_value = obj.attr("_id");
    
    $("#_" + id).val(obj.attr("_id"));  
    
    Ajax_search_boxes["object_" + id].stop_ajax_searching();
    if (Ajax_search_boxes["object_" + id].ajax_search_select_funct) 
      Ajax_search_boxes["object_" + id].ajax_search_select_funct(id, Ajax_search_boxes["object_" + id]);
  };              
  this.ajax_update_search = function(xml)
  {
    var results = xml.json.results;
    var content_html = "<div class='close'>Resultaten voor " + Ajax_search_boxes["object_" + id].obj.val() + "</div><div class='ajax_results_container'>";
    var x = 0;
    for (n in results)
    {
      content_html += "<a _id='" + results[n].id + "' class='corner_5' href='javascript:void(0)'>" + results[n].name + "</a>";
      x++;
    }
    Ajax_search_boxes["object_" + id].result_count = x;
    content_html += "</div>";
    $("#ajax_results_" + id).html(content_html).fadeIn(300);
    $("#ajax_results_" + id + " div.ajax_results_container a").bind("mousedown", function() { Ajax_search_boxes["object_" + id].ajax_search_select($(this));});
  };
  this.ajax_searching_keydown = function(event)
  {
    event = event.originalEvent;
    var key = event.keyCode || event.which;
    if (event.keyCode != 38 && event.keyCode != 40) return;

    var new_ajax_res_sel = Ajax_search_boxes["object_" + id].ajax_res_sel;
    
    switch (event.keyCode)
    {
      case 38: new_ajax_res_sel--; break;
      case 40: new_ajax_res_sel++; break;
    }
    if (new_ajax_res_sel < 0) new_ajax_res_sel = 0;
    
    if (new_ajax_res_sel >= Ajax_search_boxes["object_" + id].result_count) new_ajax_res_sel = Ajax_search_boxes["object_" + id].result_count - 1;
    
    $("#ajax_results_" + id + " a").removeClass("active");
    $("#ajax_results_" + id + " div.ajax_results_container a:nth-child(" + (new_ajax_res_sel- -1) + ")").addClass("active");
    Ajax_search_boxes["object_" + id].ajax_res_sel = new_ajax_res_sel;
  };
  this.stop_ajax_searching = function()
  {
    Ajax_search_boxes["object_" + id].ajax_res_sel = -1;
    Ajax_search_boxes["object_" + id].hide_wnd("ajax_results_" + id, 250);
  }; 
  this.hide_wnd = function(time)
  {
    $.timeout(function() { $("#ajax_results_" + id).fadeOut(300);}, time);
  };
  this.set_value = function(txt_value, id_value)
  {
    this.obj.val(txt_value);
    this.ID_input.val(id_value);
    this.txt_value = txt_value;
    this.id_value = id_value;
    if (Ajax_search_boxes["object_" + id].ajax_search_select_funct) 
      Ajax_search_boxes["object_" + id].ajax_search_select_funct(id, Ajax_search_boxes["object_" + id]);
  };
  
  var s = "";

  s += "<div class='ajax_results corner_5' id='ajax_results_" + id + "'></div>" +
       "<span class='input_long'>" +
       "  <input default_value='' " + 
                "title='Zoeken op naam, inlog ID, gebruikers ID of klas' " + 
                "id='ajax_search_" + id + "' " +
                "type='text' " +
                "autocomplete='off' " + 
                "value=''" +  
                "name='raw_" + this.id + "'" + 
                "class='input_long ajax' /></span>" +
          "<input type='hidden' name='" + id + "' id='_" + id + "' value=''/>";

  document.write(s);
  this.obj = $("#ajax_search_" + this.id);
  this.obj.bind("blur", this.stop_ajax_searching)
      .bind("keydown", this.ajax_searching_keydown)
      //.bind("focus", function() { this.select(); })
      .bind("keyup", this.start_ajax_searching);
      
  this.checked_div = $("#div_" + id);
  this.ID_input = $("#_" + id);
  
  this.set_value(this.txt_value, this.id_value);
                
  if (typeof(ajax_search_select_funct) != "undefined") 
    this.ajax_search_select_funct = ajax_search_select_funct;
}

function ajax_form_submit()
{
  if (arguments.length > 0) var form = arguments[0]; else var form = 0;
  dates_before_submit(document.forms[form]);
  var url = document.forms[form].getAttribute("action");
  url = url + (url.indexOf("?")<0?"?":"&") + form_submit(form);
  //alert(url);return;
  //document.location.href = url; 
  var callback = arguments.length > 1 ? arguments[1] : "r";
  new ajax(url, callback);
}
function ajax_form_submit_json()
{
  if (arguments.length > 0) var form = arguments[0]; else var form = 0;
  dates_before_submit(document.forms[form]);
  var url = document.forms[form].getAttribute("action");
  url = url + (url.indexOf("?")<0?"?":"&") + form_submit(form);
  //alert(url);return;
  //document.location.href = url; 
  var callback = arguments.length > 1 ? arguments[1] : "none";
  var param = arguments.length > 2 ? arguments[2] : null;
  //document.forms[form].submit();return;
  new ajax_json(url, callback, null, param);
}
