function serialize(mixed_value)
{
  var _getType = function(inp)
  {
    var type = typeof inp, match;

    if (type == 'object' && !inp)
    {
      return 'null';
    }

    if (type == "object")
    {
      if (!inp.constructor)
      {
        return 'object';
      }

      var cons = inp.constructor.toString();

      if (match = cons.match(/(\w+)\(/))
      {
        cons = match[1].toLowerCase();
      }

      var types = ["boolean", "number", "string", "array"];

      for (key in types)
      {
        if (cons == types[key])
        {
          type = types[key];
          break;
        }
      }
    }

    return type;
  };

  var type = _getType(mixed_value);
  var val, ktype = '';

  switch (type)
  {
    case "function":
      val = "";

      break;

    case "undefined":
      val = "N";

      break;

    case "boolean":
      val = "b:" + (mixed_value ? "1" : "0");

      break;

    case "number":
      val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;

      break;

    case "string":
      val = "s:" + mixed_value.length + ":\"" + mixed_value + "\"";

      break;

    case "array":
    case "object":
      val = "a";

      var count = 0;
      var vals = "";
      var okey;

      for (key in mixed_value)
      {
        ktype = _getType(mixed_value[key]);

        if (ktype == "function" && ktype == "object")
        {
          continue;
        }

        okey = (key.match(/^[0-9]+$/) ? parseInt(key) : key);
        vals += serialize(okey) + serialize(mixed_value[key]);
        count++;
      }

      val += ":" + count + ":{" + vals + "}";
      break;
  }

  if (type != "object" && type != "array")
    val += ";";

  return val;
}

/********* Default value plugin for a search input field **********/
(function($)
{
  $.fn.inputDefualts = function(options)
  {
    // дефолтные значения
    var defaults = { cl: 'inactive', text: this.val() }, opts = $.extend(defaults, options);

    this.addClass(opts['cl']); // добавляем класс к инпуту
    this.val(opts['text']);    // ставим значение по умолчанию

    // обрабатываем события фокуса на поле
    this.focus(function()
    {
      if ($(this).val() == opts['text'])
        $(this).val('');               // обнуляем его, если надо
      $(this).removeClass(opts['cl']); // убираем класс
    });

    // теперь очередь блюра
    this.blur(function()
    {
      if ($(this).val() == '')
      {
        $(this).val(opts['text']);    // возвращаем значение
        $(this).addClass(opts['cl']); // и класс, если надо
      }
    });
  };
})(jQuery);

/**************jQery functions****************/
$(document).ready(function()
{
  $('TABLE.listTab tr.odd, TABLE.listTab tr.even').hover(function()
  {
    $(this).addClass('thover');
  }, function()
  {
    $(this).removeClass('thover');
  });
});

$.tabs = function(selector, savepos, id, start)
{
  var saved_tab = 0;

  if (savepos)
  {
    saved_tab = parseInt($.cookie('saved_tab[' + id + ']')) || 0;
  }
  $(selector).each(function(i, element)
  {
    $($(element).attr('tab')).css('display', 'none');
    $(element).click(function()
    {
      $.cookie('saved_tab[' + id + ']', i);
      $(selector).each(function(i, element)
      {
        $(element).removeClass('selected');
        $($(element).attr('tab')).css('display', 'none');
      });

      $(this).addClass('selected');

      $($(this).attr('tab')).css('display', 'block');
    });
  });

  if (!start)
  {
    start = $(selector + ':eq(' + saved_tab + ')').attr('tab');
  }

  $(selector + '[tab=\'' + start + '\']').trigger('click');
};

/*************Other functions**************/
/*function getCookie(name) {
     var p = name + "=";
     var si = document.cookie.indexOf(p);
     if (si == -1) return null;
     var ei = document.cookie.indexOf(";", si + p.length);
     if (ei == -1) ei = document.cookie.length;
     return(document.cookie.substring(si + p.length, ei));
}*/

/*function gzipHolder() {
    var b = getCookie("pg_size_before");
    var a = getCookie("pg_size_after");
    if (a && b) {
        document.getElementById('gzip').innerHTML = (100 - a / b * 100).toFixed(2) + "%";
        */
/*
document.getElementById('gzip').innerHTML = "[" +
    "was: " + (b / 1024).toFixed(2) + "Kb" + 
    "; become: " + (a / 1024).toFixed(2) + "Kb" +
    "; compression: " + (100 - a / b * 100).toFixed(2) + "%" +
    "]";
*/
/*
}
}*/
var isNN = (navigator.appName.indexOf("Netscape") != -1);

function GetToField(input, e)
{
  var keyCode = (isNN) ? e.which : e.keyCode;

  // var filter = (isNN) ? [0,8,9] : [0,8,9,16,17,18,37,39,46];
  //if(!containsElement(filter,keyCode)) {
  //window.status = keyCode;
  if (keyCode == 38)
  {
    input.form[(getIndex(input) - 1) % input.form.length].focus();
  }
  else if (keyCode == 40)
  {
    input.form[(getIndex(input) + 1) % input.form.length].focus();
  }
  // }

  /*  function containsElement(arr, ele) {
      var found = false, index = 0;
      while(!found && index < arr.length)
      if(arr[index] == ele)
      found = true;
      else
      index++;
      return found;
    }*/

  function getIndex(input)
  {
    var index = -1, i = 0, found = false;

    while (i < input.form.length && index == -1)
      if (input.form[i] == input)
        index = i;
      else
        i++;

    if (index == 0)
      index = input.form.length;

    return index;
  }

  return true;
}(function($)
{
  $.jMessage = function(text, type, sticky)
  {
    if (type == null)
    {
      type = 'info';
    }

    if (sticky == null)
    {
      sticky = false;
    }
    var theme = '';

    switch (type)
    {
      case 'info':
        theme = 'infomsg';
        break;

      case 'error':
        theme = 'errormsg';
        break;

      case 'success':
        theme = 'successmsg';
        break;

      case 'mailsuccess':
        theme = 'mailsuccessmsg';
        break;
    }
    var out = '';

    if (typeof (text) == 'array')
    {
      $.each(text, function(i, n)
      {
        if (out != '')
        {
          out += '<br />';
        }
        out += n;
      });
    }
    else if (typeof (text) == 'string')
    {
      out = text;
    }
    $.jGrowl(out, { sticky: sticky, easing: 'swing', theme: (theme || '') });
  };
})(jQuery);

$.fn.resizer = function()
{
  // выполняем плагин для каждого объекта
  return this.each(function()
  {
    // определяем объект
    var me = $(this);
	
    // вставляем в после объекта…
      me.after(
      // в нашем случае это наш "ресайзер" и производим обработку события mousedown
      $('<div class="resizehandle"></div>').bind('mousedown', function(e)
      {

        // определяем высоту textarea
        var h = me.height();
        // определяем кординаты указателя мыши по высоте
        var y = e.clientY;
        // фнкция преобразовывает размеры textarea
        var moveHandler = function(e)
        {
          me.height(Math.max(20, e.clientY + h - y));
        };
        // функци прекращает обработку событий
        var upHandler = function(e)
        {
          $('html').unbind('mousemove', moveHandler).unbind('mouseup', upHandler);
        };
        // своего рода, инициализация, выше приведённых, функций
        $('html').bind('mousemove', moveHandler).bind('mouseup', upHandler);
      }));
  });
}
$(document).ready(function()
{
  $("textarea.resize").resizer();
});
