- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 
                        function toUrl(url, key, value) {
  if(url=='') url=window.location.href; 
  if(url.indexOf('//')<0) url='//'+url;
  // protocol
  var u=url.split(/\/?\//); 
  url={}; url.protocol=u.shift()+'//';
  // hostname
  url.hostname=u.shift().split(':'); 
  if(url.hostname.length>1) url.port=':'+url.hostname.pop()
  url.hostname=url.hostname.pop().split('@').pop();
  // сохраним порядок для последующей свертки
  url.pathname='/'; url.pagename=''; 
  try { 
    // hash
    url.search=u.pop().split(/#/); 
    if(url.search.length==2) url.sh='#'+url.search.pop();
    url.search=url.search.shift().split(/\?/);
    
    // pagename
    url.pagename=url.search.shift(); url.search=url.search[0]
  
    // pathname
    url.pathname+=u.join('/')+(u.length?'/':'');
  
    // разбор search, (c) Steven Benner, 2010
    try {
      var u = {};
      url.search.replace(
        new RegExp('([^?=&]+)(=([^&]*))?', 'g'),
        function($0, $1, $2, $3) { 
           u[$1] = decodeURIComponent($3); 
        }
      );
      url.search=u;
    } catch(e) { 
      delete url.search; 
    }
  } catch(e) { };
  // вернем URL как объект, где search так же
  // представлен объектом {key:value}
  if(!key && !value) return(url);
  // возвращаем значение ключа
  if(key && !value) return(url.search[key]);
  // roll up url
  var roll = function(url,search){
    var out='';
    for(var key in url) {
      out+=(search?'&'+key+'=':'')+(key=='search'?'?'+roll(url[key],1).substr(1):url[key]);
    };
    return out;
  };
  
  // устанавливаем значение ключа
  if(value) url.search[key]=value.toString(); 
  
  // сворачиваемся, с учетом порядка следования свойств
  return(roll(url));    
}
// применение
console.log(toUrl('http://site.my:81/home/path/page.htm?a=1&b=2#hash','a',5));