	var ESVars = {};
	var userKey = 'undefined';

	var eSelect = {
		getObj : function(obj) { // Возвращает DOM-элемент и только если это SELECT
			if (typeof obj == 'string')
				obj = document.getElementById(obj);
			if (obj && obj.nodeName && obj.nodeName.toLowerCase() == 'select')
				return obj;
			else
				return false;
		},
		add : function(obj, option) {
			obj = this.getObj(obj);
			if (/*@cc_on!@*/false) 
				obj.add(option);
			else
				obj.add(option, null);
		},
		getValue : function(obj) {
			obj = this.getObj(obj);
			return obj.value;
		},
		setValue : function(obj,vl) {
			obj = this.getObj(obj);
			obj.value = vl;
		},
		getText : function(obj) {
			obj = this.getObj(obj);
			return obj.options[obj.selectedIndex].text;
		},
		truncate : function(obj) { // Очистка селекта от опшинов
			obj = this.getObj(obj);
			while (obj.options.length)
				obj.remove(obj.options.length - 1);
			obj.options.length = 0;
		},
		lock : function(obj, status) { // Блокировка селекта с выводом статусного сообщения
			obj = this.getObj(obj);
			this.truncate(obj);
			if (status)
				this.add(
					obj,
//					new Option(status ? status : '', status ? status : 0)
					new Option(status ? status : '', status ? '-1' : 0)
				);
			obj.disabled = true;
		},
		fill : function(obj, array) { // Заполнение из массива: array[i][0] = value, array[i][1] => text
			obj = this.getObj(obj);
			this.truncate(obj);
			this.lock(obj,"Wait please...");
			for (var i = 0; i < array.length; i++)
				this.add(
					obj,
					new Option(array[i][1] ? array[i][1] : array[i][0], array[i][0])
				);
			obj.remove(0);
			obj.disabled = false;
			obj.selectedIndex = -1;
			obj.options=null;
		},
		efill : function(obj, arr) { // Заполнение из ассоциативного массива: array[value] => text
			obj = this.getObj(obj);
			this.truncate(obj);
			for ( id in arr) 
				this.add(
					obj,
					new Option(arr[id],id)
				);
			obj.disabled = false;
			obj.selectedIndex = -1;
			obj.selectedIndex = 0;
		}
	};



 function elID(id) { return document.getElementById(id); }

 function getSIndex(eID) {
  return elID(eID).selectedIndex;
 }

 function getLabel(eID) {
  return elID(eID).options[getSIndex(eID)].text;
 }

 function getValue(eID) {
  e = elID(eID) || false;
  if (e) return elID(eID).options[getSIndex(eID)].value
  else return false;
 }

 function setValue(eID,vl) {
  elID(eID).options[getSIndex(eID)].value = vl;
 }


 function spaces(n) {
  var ret="";
  for (i=0; i<n; i++) {
   ret = ret + "&nbsp;";
  }
  return ret;
 }


 function scan(o,lvl) {
  var txt = elID("txt");
  for ( id in o) {
   if (typeof(o[id]) == 'object') {
    txt.innerHTML = txt.innerHTML+"<br>"+spaces(lvl)+id+":"+" { ";
    scan(o[id],lvl+4);
    txt.innerHTML = txt.innerHTML+"<br>"+spaces(lvl+4)+" } ";
   } else {
    txt.innerHTML = txt.innerHTML+"<br>"+spaces(lvl)+id+":"+o[id];
   }
  }
 }


 function selBlock(selItems,Msg) {
  for(arrN in selItems) {
   eSelect.lock(selItems[arrN],Msg);
  }
 }






function insertElement(url, callName, flds, successLoad) {

   url = url || '';
   callName = callName || '';
   flds = flds || {};
   successLoad = successLoad || '';

//   obj = eSelect.getObj(id);
   if (url !='' && callName !='' && flds != {}) {

    var tflds = "";
    var tfn = 0;
    for(id in flds) {
     if (tfn>0) tflds = tflds+"&";
     tflds = tflds+id+"="+flds[id];
     tfn++;
    }

    call2 = url+"?call2="+callName+"&"+tflds+"&sl="+successLoad+"&sk="+userKey;

//    alert(call2); return false;

      jQuery.getScript(call2, 
       function(){

       }
      );

   } else {
     return false;
   }

}






function fillSelect(id, url, callName, varName, preLoad, postLoad, successLoad, lockMsg){

   id = id || '';
   url = url || '';
   varName = varName || '';
   callName = callName || '';
   preLoad = preLoad || '';
   postLoad = postLoad || '';
   successLoad = successLoad || '';
   lockMsg = lockMsg || '-- Nothing found --';

   obj = eSelect.getObj(id);
   if (obj && url !='' && callName !='' && varName !='') {

    call2 = url+"?call2="+callName+"&var=ESVars[\""+varName+"\"]&sk="+userKey;

//    alert(call2);

    if (preLoad != '') {
     eval(preLoad+"('"+callName+"')");
    }

      addSpinner(id,"Loading...")

      jQuery.getScript(call2, 
       function(){
        if (successLoad != '') {
         eval(successLoad+"(ESVars["+varName+"])");
        }

        var v = ESVars[varName];
        remSpinner(id)
	if (
		v["-1"].substr(0,18) == "Please, choose the" ||
		v["-1"].substr(0,14) == "Please, select"
	   ) {
         v["-1"] = v["-1"].replace(/Please, choose the/, "-- Select ");
         v["-1"] = v["-1"].replace(/Please, select/, "-- Select ");
         v["-1"] = v["-1"].replace(/\.\.\./, " --");
         v["-1"] = v["-1"].replace(/ country/, " Country");
         v["-1"] = v["-1"].replace(/ state/, " State");
         v["-1"] = v["-1"].replace(/ city/, " City");
         v["-1"] = v["-1"].replace(/ resort/, " Resort");
        }

        eSelect.efill(id,v);
	
	eval(eSelect.getObj(id).onChange);
	if (v["-1"] == "Nothing found...") {
	 eSelect.lock(id,lockMsg);
	}
	
       }
      );

    if (postLoad != '') {
     eval(postLoad+"('"+callName+"')");
    }

   } else {
     return false;
   }

}



var spinnerOn = false;
var spinners = {};
var spinDefTimer = 100;
var spinTimer = spinDefTimer;
var spinID = null;
var spinEls = new Array(' : ',' :: ',' ::: ',' :::: ',' ::::: ',' :::::: ',' ::::::: ',' :::::::: ',' ::::::: ',' :::::: ',' ::::: ',' :::: ',' ::: ',' :: ');
var spinCnt = 0;
                                            

function addSpinner(id,msg) {
 spinners[id] = { 'msg': msg, 'num': 0 };
 spinCnt++;
 if (spinCnt>0 && !spinnerOn) spinInit();
}


function remSpinner(id) {
 delete spinners[id];
 spinCnt--;
}


function spinInit(timer) {
 spinnerOn = true;
 timer = timer || spinDefTimer
 spinTimer = timer
 spinID=setTimeout('spinIt()',spinTimer)
}

function spinMsg(id) {
 eSelect.lock(id,spinners[id]["msg"]+spinEls[spinners[id]["num"]%spinEls.length]);
 spinners[id]["num"]++;
}


function spinIt() {

  spinnerOn = false;
  clearTimeout(spinID);
  
  for (id in spinners) {
   spinMsg(id);
  }

  if (spinCnt>0 && !spinnerOn) spinInit();

}

