function Ajax(url, callbackfunction, async){
	//var m_request = navigator.appName=="Microsoft Internet Explorer"?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();
	var m_request = createRequestObject();
	var m_callbackfunction = callbackfunction;
	this.request = m_request;
	this.url = url;
	this.callbackfunction = m_callbackfunction;
	this.errorfunction = null;
	this.error = null;
	this.async = async;
	this.send = function(){
		try{
			if( this.async == null ) {this.async = true};
			this.request.open("get", encodeURI(this.url + "&rnd=" + Math.random()), this.async);
			if(this.callbackfunction != null){
				this.request.onreadystatechange = function(){try{AjaxOnStateChange(m_request, m_callbackfunction);}catch(err){}};
			}
			this.request.send(null);
			return true;
		}catch(err){
			this.error = err;
			if(this.errorfunction!=null){eval(this.errorfunction)};
			return false;
		}
	};
}

function AjaxOnStateChange(request, callbackfunction){
	if(request.readyState == 4){
		eval(callbackfunction);
	}
}


function createRequestObject() {
	var ro;
	if(navigator.appName == "Microsoft Internet Explorer"){
		ro = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		ro = new XMLHttpRequest();
	}
	return ro;
}

/* Obsolete. Use Ajax javascript object instead. */
var http = null;
function sendReq(url, callbackfunction, async) {
	try{
		if (http==null) {http = createRequestObject()};
		if( async == null ) {async = true};
		
		http.open('get', encodeURI(url + '&rnd=' + Math.random()), async);
		if(callbackfunction != null){
			http.onreadystatechange = function () {
				if (http.readyState == 4) {
					eval(callbackfunction);
				}
			}; 
		}
		http.send(null);
		return true;
	}catch(err){
		return false;
	}
}
function ajaxGetAttributeForQueryString(obj,attName){
	var val=obj.getAttribute(attName);
	if(val!=null&&val!=''){
		return ' '+attName+'=\"'+val +'\"';
	}
	return '';
}

function ajaxReplaceElement(id, url, fn){
	$J.ajax({
		type: "GET"
		, url: url
		, dataType: "html"
		, async: true
		, success: function(html){$J('#'+id).replaceWith(html);if(eval(fn)!=null){fn();};}
	});
}

function ajaxReplaceElementContent(id, url, fn){
	//$J('#'+id).empty();
	// andrey. I comment $J('#'+id).empty() , because on frontpage appear "dancing" effect
	var obj=$(id);
	/*
	var att='';
	
	att+=ajaxGetAttributeForQueryString(obj,'id');
	att+=ajaxGetAttributeForQueryString(obj,'name');
	att+=ajaxGetAttributeForQueryString(obj,'class');
	att+=ajaxGetAttributeForQueryString(obj,'style');
	att+=ajaxGetAttributeForQueryString(obj,'tabindex');
	*/
	$J.ajax({
		type: "GET"
		, url: url //+'&att='+ escape(att)
		, dataType: "html"
		, async: true
		, success: function(html){
			$J('#'+id).empty().append(html);
			if(eval(fn)!=null){fn(id);}
		}
	});
}

var aCities;
var limit = 1000;
var timerId = null;
function ajaxUpdateSelect(id,url,postUpdateFn){
	//$J('#'+id).empty();
	var obj=$(id);

	var att='';

	att+=ajaxGetAttributeForQueryString(obj,'id');
	att+=ajaxGetAttributeForQueryString(obj,'name');
	att+=ajaxGetAttributeForQueryString(obj,'class');
	//att+=ajaxGetAttributeForQueryString(obj,'style');
	att+=ajaxGetAttributeForQueryString(obj,'tabindex');
//	if (url.indexOf("Cities") != -1)	
//	{
//		$J('#'+id).parent().block({ message: null });
//		$J.getJSON(url.replace("Cities.aspx", "Cities1.aspx"), function(data){			
//	  
//			alert(data.length);
//			aCities = data;
//			var pobj = $J('#'+id);						
//			for(i=0;i<limit;i++){
//			  var div = $J("<div></div>")
//							.append($J("<input type='checkbox'>")
//										.attr("name", "cblCities")
//										.attr("id", "cblCities_cb" + i)
//										.attr("class", "checkbox")
//										.attr("value", data[i].id)
//									)
//							.append($J("<label></label>")
//										.attr("for", "cblCities_cb" + i)
//										.text(data[i].name)
//									)
//							.appendTo(pobj);			  
//			}
//			
//			$J('#'+id).parent().unblock();
//			//alert(pobj.html());
//			
//			/*
//			$J.each(data.items, function(i,item){
//				$("<img/>").attr("src", item.media.m).appendTo("#images");
//            if ( i == 3 ) return false;
//			});
//			*/

//	});

//}else{
	var ie7 = (jQuery.browser.msie && parseInt(jQuery.browser.version) == 7) ? "true" : "false";
	
	if (timerId) clearTimeout(timerId);
	
	$J.ajax({
		type: "GET"
		, url: url +'&att='+ escape(att) + (ie7 == "true" ? "&ie7=true" : "")
		, dataType: "html"
		, async: true
		, success: function(html){
			//$J('#'+id).empty().append(html);
			$J('#'+id).replaceWith(html);
			if (obj.options) {
			    if(obj.options.length > 0){
			        if (obj.disabled != undefined)
			            obj.disabled=false;
			    }
			}
			else {
			    if (obj.disabled != undefined)
					obj.disabled=false;
			}

			if(eval(postUpdateFn)!=null){postUpdateFn(id, 0, 500);}
		}
	});
//	}
}

function convertDdltoCbl(id, start, end)
{
	var ie7 = (jQuery.browser.msie && parseInt(jQuery.browser.version) == 7) ? "true" : "false";
	
	if (ie7 == "false")
		return;
	
	var obj=$(id);
	if (start == 0 && window.console) {
		console.time("convertDdltoCbl");
	}
	//jQuery.Console.writeLn("Started: "+(new Date()).toString() + " start: " + start + " end: " + end + (obj.options ? " obj.options.length: " + obj.options.length : ""));
	if (obj.options) 
	{
		//$J('#'+id).parent().block({ message: null });
		
		var pobj = $J('#'+id);
		var container;
		if ($J("#cblCities_container").length == 0)
			container = $J("<div></div>").attr("id", "cblCities_container").attr("class", "checkbox_list").height(100).insertBefore(pobj);
		else
			container = $J("#cblCities_container");
			
		pobj.hide();
		//container.hide();
		if (start == 0)
		{
			container.empty();
		}
		var upperLimit = (end > obj.options.length) ? obj.options.length : end;
		//for (var i = 0; i < obj.options.length; i++)
	    for (var i = start; i < upperLimit; i++)
	    {
			if (obj.options[i].value){
				var div = $J("<div></div>")
							.append($J("<input type='checkbox'>")
										.attr("name", "cblCities")
										.attr("id", "cblCities_cb" + i)
										.attr("class", "checkbox")
										.attr("value", obj.options[i].value)
										.attr("checked", (obj.options[i].selected ? "checked" : ""))
									)
							.append($J("<label></label>")
										.attr("for", "cblCities_cb" + i)
										.text(obj.options[i].text)
									)
							.appendTo(container);			  
			}
			
	    }
	    //container.show();
	    
	    //$J('#'+id).parent().unblock();
	    
	    if (end < obj.options.length)
			timerId = setTimeout("convertDdltoCbl('" + id + "', " + end+ ", " + (end+500) + ")", 250);
		else if (window.console){
			console.timeEnd("convertDdltoCbl");
			console.info("obj.options.length: " + obj.options.length);
		}
	}
}


function ajaxUpdateCheckboxList(id,url,postUpdateFn){
	//$J('#'+id).empty();
	var obj=$(id);
	
	var att='';
	

	att+=ajaxGetAttributeForQueryString(obj,'id');
	att+=ajaxGetAttributeForQueryString(obj,'name');
	att+=ajaxGetAttributeForQueryString(obj,'class');
	//att+=ajaxGetAttributeForQueryString(obj,'style');
	att+=ajaxGetAttributeForQueryString(obj,'tabindex');
	
	$J('#'+id).parent().block({ message: null });
	
	$J.ajax({
		type: "GET"
		, url: url +'&att='+ escape(att)
		, dataType: "html"
		, async: true
		, success: function(html){
			//$J('#'+id).empty().append(html);
			//$J('#'+id).load(function(){$J('#'+id).parent().unblock();});
			
//			var e = $J('#'+id);
//	        var p = e.parent();
//	        var s = e.prev();
//		    e.remove();

//			if (s[0])
//				s.after(html);
//			else
//				p.prepend(html);

			$J('#'+id).replaceWithAndReturnNew(html);
			
			//$J('#'+id).ready(function(){$J('#'+id).parent().unblock();});
			//$J('img.loading').load(function(){$J('#'+id).parent().unblock();});
			
			$J('#'+id).parent().unblock();
			
			//alert($J('#'+id+' > label:last').html());
			if (obj.options) {
			    if(obj.options.length > 0){
			        if (obj.disabled != undefined)
			            obj.disabled=false;
			    }
			}
			else {
			    if (obj.disabled != undefined)
			    obj.disabled=false;
			}
			
			if(eval(postUpdateFn)!=null){postUpdateFn(id);}
		}
	});
}

function ajaxPostUpdateElement(id, url, formData, fade){
    if (!id || !url) {
        return;
    }
    if (!fade) {
        fade = 300;
    }
    
    var elementToUpdate = $J('#' + id);
    elementToUpdate.fadeTo(fade, 0.4, function() {
        $J.ajax({
            url: url,
            type: "POST",
            data: formData,
            complete: function(req) {
                if (req.status == 200) { //success
                    var respText = req.responseText;
                    elementToUpdate.fadeTo(fade, 0.1, function() {
                        elementToUpdate.html(respText);
                        elementToUpdate.fadeTo(300, 100);
                    });
                } else { //failure
                    elementToUpdate.fadeTo(fade * 7, 1);
                }
            }
        });
    });
    
}