/*
Name:      Object Tools
Use with:  jQuery
Version:   1.0.4 (19.07.2010)
Author:    Grigory Zarubin, Andrey Sidorov (Shogo.RU)


Набор методов для работы с хэшами.
*/

;(function($) {
  $.obj = {
    // Прикладные методы
    $specialChars: {
      '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\'
    },
    $replaceChars: function(chr) {
      return this.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
    },

    // Преобразует данные в json
    parse: function(hash) {
      var self = this;
      switch(typeof(hash)) {
        case 'string':
          return "\"" + hash.replace(/[\x00-\x1f\\"]/g, function(chr){ return self.$replaceChars.apply(self, [chr]); }) + "\"";
        case 'number':
          return isFinite(hash) ? String(hash) : 'null';
        case 'object':
          if(hash===null) return String(hash);
          var string = [];
          if('length' in hash) {
            for(var i=0,l=hash.length; i<l; i++) {
              if(typeof hash[i]=='undefined') continue;
              string.push(this.parse(hash[i]));
            }
            return '[' + String(string) + ']';
            break;
          }
          for(var i in hash) {
            var json = this.parse(hash[i]);
            if(json) string.push(this.parse(i) + ':' + json);
          }
          return '{' + string + '}';
        default: return String(hash);
      }
      return null;
    },

    // Возвращает количество элементов в хэше (можно передать массив ключей для исключения из подсчёта)
    length: function(hash, exclude) {
      if(!hash || typeof(hash)!=='object') return null;
      var j = false;
      for(var i in hash) {
        if(exclude && $.inArray(i, exclude)!=-1) continue;
        j++;
      }
      return j;
    },

    // Создает клон хэша
    clone: function(hash) {
      if(!hash || typeof(hash)!=='object') return hash;
      var newHash = hash.constructor();
      for(var i in hash)
        newHash[i] = this.clone(hash[i]);
      return newHash;
    },

    // Преобразует массив в хэш
    hash: function(hash) {
      if(!hash || !(hash instanceof Array)) return hash;
      if(hash.length==0) return {};
      var newHash = {};
      for(var i=0,l=hash.length; i<l; i++)
        newHash[i] = hash[i];
      return newHash;
    },

    // Возвращает ключ первого элемента хэша
    key: function(hash) {
      if(!hash || typeof(hash)!=='object') return null;
      for( var key in hash )
        break;
      return key;
    },

    // Возвращает ключ последнего элемента хэша
    lastKey: function(hash) {
      if(!hash || typeof(hash)!=='object') return null;
      for(var key in hash);
      return key;
    }
  };
})(jQuery);
