function ajax(url,params,target,cache,onload_function)
{
    loading_started();
	// Create new JsHttpRequest object.
	var ajax_obj = new JsHttpRequest();
	if(!cache) cache=false;
	else cache = true;
	ajax_obj.caching = cache;

    // Code automatically called on load finishing.
    ajax_obj.onreadystatechange = function() {
        if (ajax_obj.readyState == 4) {
            // Write result to page element (_RESULT becomes responseJS). 
            if(target) target.innerHTML = ajax_obj.responseJS.content;
            if(ajax_obj.responseJS.script) {
               if(tt_ie) {
    // IE sux
                  window.setTimeout(ajax_obj.responseJS.script, 0);
               }
               else {
                  eval(ajax_obj.responseJS.script);
               }
            }
            loading_finished();
	    if(onload_function)
	    	eval(onload_function);
        }
    }
    // Prepare request object (automatically choose GET or POST).
    ajax_obj.open('POST', url, true);
    // Send data to backend.
    if(!params)
    	ajax_obj.send( null );
    else
    	ajax_obj.send( params );    
};

function lang_admin(url)
{
	this.url = url;
	
	this._do_action = function(action,module,constant_name,language,value,target)
	{
		var a = new Array();
		if(module) a['module']=module;
		if(action) a['action']=action;
		if(constant_name) a['constant_name']=constant_name;
		if(language) a['lang']=language;
		if(value) a['value']=value;
		ajax(this.url,a,target);
	}
	
	this.edit_constant = function(module,constant_name,language,value,target)
	{
		this._do_action('edit',module,constant_name,language,value,target);
	}
	
	this.add_constant = function(module,constant_name,language,value,target)
	{
		this._do_action('add',module,constant_name,language,value,target);		
	}
	
	this.del_constant = function(module,constant_name,language,target)
	{
		this._do_action('del',module,constant_name,language,null,target);				
	}
	
};

function ch_admin(url,type)
{
    this.url = url;
    this.type = type;

    this.get = function(offset,filter,target)
    {
         var a = new Array();
         a['o']=offset;
         a['filter']=filter;
         a['ch_type']=this.type;
         ajax(this.url,a,target);
    }
};

function admin_by_id(url)
{
    this.url = url;

    this.get = function(id,action,target)
    {
         var a = new Array();
         a['id']=id;
         a['action']=action;
         ajax(this.url,a,target);
    }
};

function loading_started()
{
	if(!document.getElementById('ajax_loader_div')) return;
	var css = document.getElementById('ajax_loader_div').style;
	var x = tt_GetScrollX();
	var y = tt_GetScrollY();
	x = tt_Int(tt_GetClientW() - 34) / 2 + x;
	y = tt_Int(tt_GetClientH() - 22) / 2 + y;
	css.left = x + "px";
	css.top = y + "px";
	css.display='block';
};

function loading_finished()
{
	if(!document.getElementById('ajax_loader_div')) return;
	var css = document.getElementById('ajax_loader_div').style;
	css.display='none';
};

HIDDEN_SELECTS = new Array();

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return {'curleft':curleft,'curtop':curtop};
}

function evaluate_slider(slider)
{
	var tmp=slider.parentNode.lastChild.style.display;
	ff.forElement('div','slider',function(elm){
		elm.style.display="none";
	});
	ff.forElement('div','slider_btn_pressed',function(elm){
		elm.className="slider_btn";
	});
	show_hidden_selects();
	if(tmp!='block') 
	{
		slider.parentNode.lastChild.style.display='block'; 
		var pos=findPos(slider);
		slider.parentNode.lastChild.style.left = slider.parentNode.lastChild.style.top = null;
		if(slider.parentNode.lastChild.id && 0 > pos.curleft - tt_GetDivW(slider.parentNode.lastChild) + tt_GetDivW(slider))
		{
			slider.parentNode.lastChild.style.left = pos.curleft - tt_GetDivW(slider.parentNode.lastChild) + tt_GetDivW(slider);
		}
		if(tt_GetClientH()+tt_GetScrollY()<pos.curtop+tt_GetDivH(slider.parentNode.lastChild))
		{
			slider.parentNode.lastChild.style.top = pos.curtop - tt_GetDivH(slider.parentNode.lastChild);
		}
		if(tt_GetClientW()+tt_GetScrollX()<pos.curleft+tt_GetDivW(slider.parentNode.lastChild))
		{
			slider.parentNode.lastChild.style.left = pos.curleft - tt_GetDivW(slider.parentNode.lastChild) + tt_GetDivW(slider);
		}
		slider.className="slider_btn_pressed";
		hide_cross_selects(slider.parentNode.lastChild);
	}
	return false;
};

function hide_cross_selects(obj)
{
	if(!tt_ie56) return;
	var elements = document.getElementsByTagName('select');
	for(i=0;i<elements.length;i++)
	{
		elements[i].style.visibility='hidden';
	}
};

function show_hidden_selects()
{
	if(!tt_ie56) return;
	var elements = document.getElementsByTagName('select');
	for(i=0;i<elements.length;i++)
	{
		elements[i].style.visibility='visible';
	}
};

function admin_panel_switch(panel)
{
	var t=document.getElementById('admin_main_menu');
	if(t.style.display=="none")
	{
		t.style.display="block";
		panel.innerHTML='<img src="'+SRVROOT+'media/des/application_side_contract.gif">';
		panel.className="slider_btn";
	}
	else
	{
		t.style.display="none";
		panel.innerHTML='<img src="'+SRVROOT+'media/des/application_side_expand.gif">';
		panel.className="slider_btn_pressed";
	}
	save_in_session({admin_panel_state:t.style.display+''});
};

function save_in_session(params)
{	
	var ajax_obj = new JsHttpRequest();
    ajax_obj.open('GET', '/ajax/session_storage', true);
    ajax_obj.send( params );    
}

/**
 * lightbox
 */
function light_box_ajax(id)
{
    loading_started();
	// Create new JsHttpRequest object.
	var ajax_obj = new JsHttpRequest();
	ajax_obj.caching = true;

    // Code automatically called on load finishing.
    ajax_obj.onreadystatechange = function() {
        if (ajax_obj.readyState == 4) {
	       	//if (window.fuckinglightboxisdisplayingonfuckingpage == false) return;
            // Write result to page element (_RESULT becomes responseJS). 
            light_box_show(ajax_obj.responseJS.script,ajax_obj.responseJS.content);
        }
    }
    // Prepare request object (automatically choose GET or POST).
    ajax_obj.open(null, '/ajax/image/_/'+id, true);
    // Send data to backend.
    ajax_obj.send( null );
};

function start_light_box(id)
{
	light_box_ajax(id);
};

function light_box_show(uri,content)
{
	loading_finished();
	var anchor = A({'title': content, 'href': uri, 'rel': 'lytebox'});
	myLytebox.start(anchor, false, false);
	return false;
}

function add_to_bookmark(a) {
	if(window.opera&&window.print) {
		var mbm=a;
		mbm.setAttribute("rel","sidebar");
		mbm.setAttribute("title",document.title);
		mbm.setAttribute("href",window.location.href);
		mbm.click();
	}
	else if(window.sidebar) {
		window.sidebar.addPanel(document.title,window.location.href,"");
	}
	else if(window.external) {
		window.external.AddFavorite(window.location.href, document.title);
	}
}

function setHome(ob) {
	if(tt_ie) {
		ob.style.behavior='url(#default#homepage)'; 
		ob.setHomePage(document.location); 
	}
}

function hotel_search_helper(url) {
	obj=document.getElementById('hotel_search_input');
	obj_variants=document.getElementById('hotel_search_variants');
	if(obj.value.length>2) {
		obj_variants.style.display='block';
		a=new Array();
		a['word']=obj.value;
		ajax(url,a,obj_variants,true);
	}
	else {
		obj_variants.style.display='none';
	}
}

function route_search_helper(url,is_secret_field) {
	if(is_secret_field) {
		prefix='_secret_field';
	}
	else {
		prefix='';
	}
	obj=document.getElementById('route_search_input'+prefix);
	obj_variants=document.getElementById('route_search_variants'+prefix);
	if(obj.value.length>2) {
		obj_variants.style.display='block';
		a=new Array();
		a['word']=obj.value;
		ajax(url,a,obj_variants,true);
	}
	else {
		obj_variants.style.display='none';
	}
}

function send_to_friend(ajax_url) {
	loading_started();
	var ajax_obj=new JsHttpRequest();
	ajax_obj.caching=true;
	ajax_obj.onreadystatechange=function() {
		if(ajax_obj.readyState==4) {
			loading_finished();
			var anchor = A({'title':ajax_obj.responseJS.content, 'rel': 'lyteframe'});
//			var anchor = A({'title':ajax_obj.responseJS.content, 'href': ajax_obj.responseJS.script, 'rel': 'lyteframe'});
			myLytebox.start(anchor,false,true);
			document.getElementById('lbIframeContainer').innerHTML=ajax_obj.responseJS.content;
			return false;
		}
	}
	ajax_obj.open(null,ajax_url,true);
	ajax_obj.send(null);
}

function send_to_friend_data(url) {
	if(document.getElementById('email_subject').value.length==0) {
		if(!confirm('Вы не указали тему сообщения. Отправить письмо без темы?')) {
			return;
		}
	}
	data_to_send=new Array();
	data_to_send['email_from']=document.getElementById('email_from').value;
	data_to_send['email_to']=document.getElementById('email_to').value;
	data_to_send['email_subject']=document.getElementById('email_subject').value;
	data_to_send['email_text']=document.getElementById('email_text').value;
	if(document.getElementById('capture')) {
		data_to_send['capture']=document.getElementById('capture').value;
	}
	ajax(url,data_to_send,null,false);
}

// Google Maps functions

function init_google_map(lat,lon,size,map_div,need_listener,opts) {
	if(map_div==null) {
		map_div='map_canvas';
	}
	if(GBrowserIsCompatible()) {
		map=new GMap2(document.getElementById(map_div),opts);
		map.enableDoubleClickZoom();
		map.setCenter(new GLatLng(lat,lon),size);
		map.setUIToDefault();
	}
	if(need_listener==null||need_listener==true) {	
		GEvent.addListener(map, "click", function(a,b) { single_click_on_map(b,a); } );
	}
	return map;
}

function place_other_objects_on_map(http_host) {
	for(i in object_types_to_display) {
		other_object_markers[i]=new Array();
	}
	for(i in other_objects) {
		if(!other_objects[i]['id']||!object_types_to_display[other_objects[i]['type_id']]) {
			continue;
		}
		cur_type=other_objects[i]['type_id'];
		var blueIcon=new GIcon(G_DEFAULT_ICON);
		blueIcon.image='http://'+http_host+'/images/object_type_pics/'+object_types[cur_type]['pict_file'];
		blueIcon.iconSize=new GSize(16,16);
		blueIcon.shadow=null;
		blueIcon.iconAnchor=new GPoint(8,8);
		markerOptions={ icon:blueIcon,draggable:false };
		cur_marker=new GMarker(new GLatLng(other_objects[i]['c_lat'],other_objects[i]['c_long']),markerOptions);
		cur_marker.type_id=cur_type;
		cur_marker.object_id=other_objects[i]['id'];
		if(other_objects[i]['in_route']) {
			cur_marker.in_route=1;
		}
		if(other_objects_edit_mode) {
			GEvent.addListener(cur_marker,"mouseover",function(a) { other_object_marker_over(this,1); } );
			GEvent.addListener(cur_marker,"click",function(a) { other_object_marker_over(this); } );
		}
		else {
			GEvent.addListener(cur_marker,"mouseover",function(a) { other_object_marker_over(this); } );
		}
		GEvent.addListener(cur_marker,"mouseout",function(a) { other_object_marker_out(this); } );
		other_object_markers[cur_type].push(cur_marker);
	}
	for(i in object_types_to_display) {
//		marker_manager.addMarkers(other_object_markers[i],8);
		marker_manager.addMarkers(other_object_markers[i],5);
	}
	marker_manager.refresh();
}

function other_object_marker_out(marker) {
	if(edit_box_opened) {
		return;
	}
	close_ew();
}

function close_edit_box() {
	close_ew();
	edit_box_opened=false;
}

function add_other_object_to_route(object_id,type_id,need_to_click) {
	if(need_to_click) {
		add_from_search(other_objects[object_id]['c_lat'],other_objects[object_id]['c_long'],other_objects[object_id]['name']);
	}
	for(i in other_object_markers[type_id]) {
		if(other_object_markers[type_id][i].object_id==object_id) {
			other_object_markers[type_id][i].in_route=1;
			other_objects_in_route.push({"type_id":type_id,"index":i});
			break;
		}
	}
	edit_box_opened=false;
}

function function_exists (function_name) {
	if(typeof function_name=='string') {
		return (typeof this.window[function_name] == 'function');
	}
	else {
		return (function_name instanceof Function);
	}
}
