function $(id) { return document.getElementById(id); }
function $c(name) { return document.createElement(name); }

function addEvent(obj, type, fn){
  if (obj.addEventListener)
    obj.addEventListener(type, fn, false);
  else if (obj.attachEvent){
    obj["e"+type+fn] = fn;
    obj[type+fn] = function(){obj["e"+type+fn](window.event);}
    obj.attachEvent("on"+type, obj[type+fn]);
  }
}

/* class */
function addClass(el,c) { if(!el) return; if(!containsClass(el, c)) el.className += " " + c; }
function removeClass(el, c) { if(!el) return; el.className = el.className.replace(new RegExp(c,"g"),""); }
function containsClass(el, c) { return el.className.indexOf(c) != -1; }

/* alpha */
function setOpacity(el, o) { el.style.opacity = o/100; el.style.filter="alpha(opacity="+o+")"; }

/* cookies */
function getCookie(name)
{
	var arg	= name + '=';
	var alen = arg.length;
	var	clen =document.cookie.length;
	var i = 0;
	while (i<clen)
	{
		var j = i + alen;
		if (document.cookie.substring(i,j)==arg) return getCookieVal(j);
		i = document.cookie.indexOf(" ",i) + 1;
		if (i==0) break;
	};
	return null;
}

function setCookie(name,value,path,expires)
{
	str = name + "=" + value;
	if (expires) str += " ;expires="+expires;
	if (path) str += " ;path="+path;
	document.cookie = str;
}

function getCookieVal(offset)
{
	var endstr = document.cookie.indexOf(";", offset);
	if (endstr==-1) endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset,endstr));
};

function delCookie(name)
{
	if (getCookie(name)){
    	setCookie(name, null ,"/","Thu, 01-Jan-70 00:00:01 GMT")
		return document.cookie;
		}
}

function cookiesAreEnabled()
{
	setCookie("test","test", "/");
	if( getCookie( "test" ) )
	{
		delCookie( "test" );
		return true;
	}

	return false;
}

/* to del */
function debug(object)
{
	var t = "";
	for(var i in object)
		t+=i+" -> "+object[i]+"<br>";
	document.write(t);
}

/* ajax */
function ajaxRequest(url, method, containerResponse, postFunction)
{
	var req;
	if(window.XMLHttpRequest)
		req = new XMLHttpRequest();
	else if(window.ActiveXObject)
		req = new ActiveXObject("Microsoft.XMLHTTP");
	// if browser doesn't support ajax return true
	if(!req) return false;

	method = method.toUpperCase();

	// process function
 	req.onreadystatechange=function()
 	{
  		if (req.readyState == 4) 
  			if(req.status == 200)
  			{
  				if(containerResponse) containerResponse.innerHTML = req.responseText;
  				if(postFunction) postFunction(req);
  			}
	}

	// send request
	if(method == "GET")
	{
		req.open(method, url, true );
		req.send(null);
	}
	else if(method == "POST")
	{
		try // catch an exception to prevent errors (opera <= 8 doesn't support post request)
		{
			req.open(method, url.slice(0,url.indexOf("?")), true );
			var parameters = url.slice(url.indexOf("?") + 1);
			req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	      	req.setRequestHeader("Content-length", parameters.length);
	      	req.setRequestHeader("Connection", "close");
	      	req.send(parameters);
      	}
      	catch (e)
      	{
      		return false;
      	}
	}
	else
	{
		alert("Not normal method: " + method);
		return false;
	}

	return true;
}

/* index */
function indexFormSwitcher()
{
	var animationPlay = false;
	var cookieName = "apt_index_form";
	var options = $("search").getElementsByTagName("ul")[0].getElementsByTagName("a");
	var forms = $("search").getElementsByTagName("form");

	for( var i = 0; i < options.length; i++ )
		options[i].onclick = switchOption;

	// T#3030
	return;

	var activeForm = getCookie(cookieName);
	if(activeForm && activeForm != 0) 
		options[activeForm].onclick();
	
	/* functions */
	function switchOption()
	{
		this.blur();
		var o;
		for( var i = 0; i < options.length; i++ )
			if (containsClass(options[i],"active")) o = i;
			else if (options[i] == this) n = i;
		return animation(o, n);
	}
	
	function animation(o,n)
	{
		if(o == n) return false;
		
		switch(indexAnimationMode)
		{
			case 1: normal(); break;
			case 2: alpha(50,10); break;
			case 3: slide(); break;
		}
		
		setCookie(cookieName,n,"/","Wed, 01-Jan-20 00:00:01 GMT");
		
		return false;
		
		function normal()
		{
			addClass(options[n],"active");
			addClass(forms[n],"active");
			removeClass(options[o],"active");
			removeClass(forms[o],"active");
		}
		
		function alpha(speed, step)
		{
			if(animationPlay) return;
			animationPlay = true;
			var opacity = 0;
			setOpacity(forms[n],opacity);
			forms[n].style.zIndex = 1;
			addClass(forms[n],"active");
			
			var interval = setInterval(function()
			{
				opacity+=step;
				setOpacity(forms[n],opacity);
				setOpacity(forms[o],100-opacity);
				if(opacity > 100)
				{
					clearInterval(interval);
					addClass(options[n],"active");
					removeClass(options[o],"active");
					removeClass(forms[o],"active");
					forms[n].style.zIndex = 0;
					animationPlay = false;
				}
			}, speed);
		}
	}
}

/* index custom tricks */
function switchProximityFields()
{
	var form = $('search_proximity');
	var divs = form.getElementsByTagName("div")
	var switchButtons = divs[divs.length-1].getElementsByTagName("input");
	for( var i = 0; i < switchButtons.length; i++ )
		showSelect(switchButtons[i].checked,switchButtons[i].className);

	function showSelect(flag,className)
	{
		var p = form.getElementsByTagName("p");
		for( var i = 0; i < p.length; i++ )
			if(containsClass(p[i],className))
			{
				if(flag) removeClass(p[i],"hidden");
				else addClass(p[i],"hidden");
				return;
			}
	}
}

function changeAmenities(listId)
{
	var amenities = $(listId).getElementsByTagName('label');
	for( var i = 0; i < amenities.length; i++ )
	{
		amenities[i].icon = amenities[i].style.backgroundImage;
		amenities[i].icon_selected = amenitiesIcon[amenities[i].htmlFor.slice(15)];
		amenities[i].onclick = changeAmenity;
	}

	function changeAmenity()
	{
		// js tricks ;)
		this.style.backgroundImage = this['icon' + ( $(this.htmlFor).checked ? '' : '_selected' )] ;
	}
}

/* dynamic selects v2 */
var citiesData = null;
var loadingCitiesData = false;

function DynamicSelects(state, county, city, proxy)
{
	var selectCountyCopy = county.cloneNode(county);
	var selectCityCopy = city.cloneNode(city);
	var anyValue = county.options[0].innerHTML;

	// get data from xml
	if(citiesData == null && !loadingCitiesData)
	{
		ajaxRequest("/cities.xml?mode=select","GET",null,function(req){ citiesData = req.responseXML; });
		loadingCitiesData = true;
	}

	// javascript dropdowns
	if(state)
	{
		state.onchange = function()
		{
			// sel state+, filter counties+, filter cities by state+, flash:reset map, flash:sel state+
			var stateId = getSelectValue(this);
	
			filterCounties2(stateId);
			filterCitiesByState2(stateId);
	
			if(proxy)
			{
				// alert('onchange: ' + stateId + ' ' + (stateId.length == 0 ? "reset" : "selState"));
				proxy.call( (stateId.length == 0 ? "reset" : "selState"), parseInt(stateId) );
			}
		}
	}

	county.onchange = function()
	{
		// sel state+, filter counties+, sel county+, filter cities+, flash:sel county+
		// var countyName = getSelectHTML(this);
		var countyId = getSelectValue(this);

		var countyStateId = (countyId.length == 0) ? "" :
			getNodeCounty2(countyId).parentNode.getAttribute("pid");

		// var stateName = getSelectHTML(state);
		var stateId = getSelectValue(state);
		if(stateId != countyStateId && stateId.length == 0)
			setSelectValue2(state,countyStateId);

		if(stateId.length > 0 && countyId.length == 0)	
			filterCitiesByState2(stateId);
		else filterCities2(countyId);

		if(proxy)
		{
			// alert('onchange: ' + countyId);
			proxy.call("selCounty",parseInt(countyId));
		}
	}
	
	city.onchange = function()
	{
		// sel state, filter counties, sel county, filter cities, sel city, flash:sel county,
		var cities = getCityIds(this);
		if(cities == null) return updateFlashMapWithCities();	
		var delay = 0;
		
		if(cities.length == 1 && cities[0].length == 0)
		{
			deselectAllCities();
		}
		else if(cities.length == 1 && cities[0].length > 0)
		{
			if(getSelectValue(state) == 0)
			{
				var cityStateId = (cities[0].length == 0) ? "" : getNodeCity2(cities[0]).parentNode.parentNode.getAttribute("pid");
				setSelectValue2(state,cityStateId);
				filterCounties2(cityStateId);
			}
			if(getSelectValue(county) == 0)
			{
				var cityCountyId = (cities[0].length == 0) ? "" : getNodeCity2(cities[0]).parentNode.getAttribute("pid");
				setSelectValue2(county,cityCountyId);
				filterCities2(cityCountyId);
				if(proxy)
				{
					proxy.call("selCounty",parseInt(cityCountyId));
					delay = 1600;
				}
			}

			if(delay==0)
				setSelectValue2(city,cities[0]);
			else
				window.setTimeout(function(){setSelectValue2(city,cities[0])},delay - 100);
		}

		window.setTimeout(updateFlashMapWithCities,delay);
	}
	
	function updateFlashMapWithCities()
	{
		if(!proxy)
			return;
		
		var selectedIds = new String();
		var unSelectedIds = new String();
		for(var i = 0; i < city.options.length; i++)
		{
			if(city.options[i].value.length == 0) continue;
			if(city.options[i].selected) selectedIds += (city.options[i].value + ",");
			else unSelectedIds += (city.options[i].value + ",");
		}
		if(selectedIds.length > 0) selectedIds = selectedIds.slice(0,-1);
		if(unSelectedIds.length > 0) unSelectedIds = unSelectedIds.slice(0,-1);
		var proxyString = selectedIds + "|" + unSelectedIds;

		proxy.call('selCity', proxyString);
	}
	
	/* filters */
	function filterCounties2(stateId)
	{
		replaceOptions(county,(((stateId.length == 0) ? citiesData : getNodeState2(stateId)).getElementsByTagName("county")));
	}
	
	function filterCities2(countyId)
	{
		replaceOptions(city,(((countyId.length == 0) ? citiesData : getNodeCounty2(countyId)).getElementsByTagName("city")));
	}
	
	function filterCitiesByState2(stateId)
	{
		replaceOptions(city,((stateId.length == 0) ? citiesData.getElementsByTagName("city") : getNodeState2(stateId).getElementsByTagName("city")));
	}
	
	/* getters */
	function getNodeState2(id)
	{
		return getNode2(id,"state");
	}
	
	function getNodeCounty2(id)
	{
		return getNode2(id,"county");
	}
	
	function getNodeCity2(id)
	{
		return getNode2(id,"city");
	}
	
	function getNode2(id,nodeName)
	{
		var elements = citiesData.getElementsByTagName(nodeName);
		for(var i = 0; i < elements.length; i++)
			if(elements[i].getAttribute("pid") == id)
				return elements[i];
		return citiesData;
	}
	
	function getCityIds(select)
	{
		var values = new Array();
		for(var i = 0; i < select.options.length; i++)
			if(select.options[i].selected)
				values[values.length] = select.options[i].value;
		if(values.length == 0) return null;
		return values;
	}
	
	function getSelectValue(select)
	{
		if(typeof select == "string")
			return select;
		return select.options[select.selectedIndex].value;
	}
	
	/* setters */
	function setSelectValue2(select,id)
	{
		for( var i = 0; i < select.options.length; i++ )
			if(select.options[i].value == id)
			{
				select.selectedIndex = i;
				return;
			}
	}
	
	function replaceOptions(select,newOptions) // newOptions is xml node
	{
		var options = select.options;

		select.innerHTML = ""; // because of IE :)

		var option = $c("option"); option.innerHTML = anyValue; option.value="";
		select.appendChild(option);

		var names = new Array();
		// sort
		for(var i = 0; i < newOptions.length; i++)
			names[i] = newOptions[i].getAttribute("name") + "%" + newOptions[i].getAttribute("pid");// + "%" + newOptions[i].getAttribute("href");
		names.sort();
		for(var i = 0; i < names.length; i++)
		{
			var data = names[i].split("%");
			var option = document.createElement("option");
			// option.setAttribute("label", data[2]);
			option.value = data[1];
			option.innerHTML = data[0];
			select.appendChild(option);
		}
	}

	function changeSelect2(select,id,selected)
	{
		for(var i = 0; i < select.options.length; i++)
			if(select.options[i].value == id)
			{
				select.options[i].selected = selected;
				return;
			}
	}

	// del
	function deselectAllCities()
	{
		for(var i = 1; i < city.options.length; i++)
			city.options[i].selected = false;
	}

	// flash
	this.selState = function(stateId)
	{
		// sel state, filter counties, filter cities
		setSelectValue2(state,stateId);
		filterCounties2(stateId);
		filterCitiesByState2(stateId);
	}

	this.selCounty = function(countyId)
	{
		this.reSet();

		// sel state, filter counties, sel county, filter cities
		var countyStateId = (countyId.length==0) ? "" : getNodeCounty2(countyId).parentNode.getAttribute("pid");
		filterCounties2(countyStateId);
		setSelectValue2(county,countyId);
		var stateId = getSelectValue(state);
		if(stateId != countyStateId && stateId.length == "")
			setSelectValue2(state,countyStateId);
		filterCities2(countyId);
	}

	this.selCity = function(cityId)
	{
		changeSelect2(city,cityId,true);
	}

	this.deselCity = function(cityId)
	{
		changeSelect2(city,cityId,false);
	}

	this.reSet = function(name)
	{
		setSelectValue2(state,"");
		filterCounties2("");
		filterCities2("");
	}
}

/* flash map integration */
function selState(pid) { dynamic.selState(pid); }
function selCounty(pid) { dynamic.selCounty(pid); }
function selCity(pid) { dynamic.selCity(pid); }
function deselCity(pid) { dynamic.deselCity(pid); }
function reSet() { dynamic.reSet(); }

/* nb tabs */
function nbTabs()
{
	var media = $('nb_media');
	var tabs = media.getElementsByTagName("ul")[0].getElementsByTagName("a");
	var divs = media.getElementsByTagName("div");
	var tabsContent = new Array();
	
	for( var i = 0; i < divs.length; i++ )
		if(containsClass(divs[i],"media_content_tab"))
			tabsContent[tabsContent.length] = divs[i];
	
	for( var i = 0; i < tabs.length; i++ )
	{
		tabs[i].property = i;
		tabs[i].onclick = changeTab;
	}	
	function changeTab()
	{
		this.blur();
		if(this.parentNode.className == "map")
			return openMap();

		for( var i = 0; i < tabs.length; i++ )
		{
			removeClass(tabs[i],"active");
			removeClass(tabsContent[i],"active");
		}
		addClass(this,"active");
		addClass(tabsContent[this.property],"active");
		return false;
	}
	
	function openMap(element)
	{
		var mapLink = $("nb_map").parentNode.getElementsByTagName("a")[0];
		return popupLink(mapLink,800,700,'enlarge_nb_mq');
	}
}

function popupLink(a,width,height,windowName)
{
    var left = (screen.width - width)/2;
    var top = (screen.height - height)/2 - 18;
    if (left<0) { left = 32; windowwidth = screen.width - 2*left; }
    if (top<0) { top = 32; windowheight =  screen.height - 2*top - 18; top = top - 18; }

    var win = window.open(a.href,windowName,"toolbar=no,location=no,directories=no,"+
   	    "status=no,menubar=no,scrollbars=yes,resizable=no,"+
       	"width="+width+",height="+height+",left=" + left + ",top=" + top);
	if(win) win.focus();
	else alert("It seems that your browser has popup blocker. Please allow to open window for this site.");
	return false;
}

function checkSelection(form,message)
{
	var inputs = form.getElementsByTagName("input")
	var marker = new ErrorMarker(inputs);
	marker.clearErrors();

	var hasObjects = false;
	for( var i=0; i<inputs.length; ++i )
	{
		if(inputs[i].type=="checkbox" &&
			inputs[i].name=="object" &&
			inputs[i].checked)
		{
			hasObjects = true;
			break;
		}
	}

	if(!hasObjects)
	{
		marker.setErrors();
		alert(message);
		return false;
	}		

	return true;
}

function ErrorMarker(inputs)
{
	this.inputs = inputs;
}

ErrorMarker.prototype.setErrors = function()
{
	for( var i=0; i<this.inputs.length; ++i )
		if(this.inputs[i].type=="checkbox" && this.inputs[i].name=="object")
			addClass(this.inputs[i].parentNode.getElementsByTagName("label")[0],"error");
}

ErrorMarker.prototype.clearErrors = function()
{
	for( var i=0; i<this.inputs.length; ++i )
		if(this.inputs[i].type=="checkbox" && this.inputs[i].name=="object")
			removeClass(this.inputs[i].parentNode.getElementsByTagName("label")[0],"error");
}

function replaceBgImg(el,bg)
{
	if(bg != '') el.style.backgroundImage = "url('"+ bg + "')";
}

function dynamicNBAction(message)
{
	// var stateUrl = "/neighborhood/state_$.xml";
	// var countyUrl = "/neighborhood/county_$.xml";
	// var cityUrl = "/neighborhood/city_$.xml";

 	var form = $("nb_select");
	var stateSelect = $("search_area_state");
	var countySelect = $("search_area_county");
	var citySelect = $("search_area_city");

	form.onsubmit = checkSelects;

	function checkSelects()
	{
		// var cityValue = citySelect.options[citySelect.selectedIndex].getAttribute("label");
		var cityValue = citySelect.options[citySelect.selectedIndex].value;
		if(cityValue && cityValue != "")
		{
			// location.href = cityValue; //cityUrl.replace("\$",cityValue);
			// return false;
			return true;
		}

		if(countySelect)
		{
			// var countyValue = countySelect.options[countySelect.selectedIndex].getAttribute("label");
			var countyValue = countySelect.options[countySelect.selectedIndex].value;
			if(countyValue && countyValue != "")
			{
				// location.href = countyValue; //countyUrl.replace("\$",countyValue);
				// return false;
				return true;
			}
		}

		if(stateSelect)
		{
			// var stateValue = stateSelect.options[stateSelect.selectedIndex].getAttribute("label");
			var stateValue = stateSelect.options[stateSelect.selectedIndex].value;
			if(stateValue && stateValue != "")
			{
				// location.href = stateValue; //stateUrl.replace("\$",stateValue);
				// return false;
				return true;
			}
		}

		alert(message);
		return false;
	}
}

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

function checkProximity(form)
{
	var s  = 0;
	for(var i=0; i<form.s_proximity.length; ++i)
	{
		if(form.s_proximity[i].checked)
		{
			s = form.s_proximity[i].value;
			break;
		}
	}

	if(s==1 && form.s_metro.value!='') return true;
	else if(s==2 && form.s_school.value!='') return true;
	else if(s==3 && form.s_military.value!='') return true;

	return false;
}

// Hint -----
function showHint(event, element, message)
{
	var hint = Hint.getContainer();
	Hint.show(event);

	// zapamietaj ostatni element 
	if (element==Hint._lastElement) return;
	Hint._lastElement = element;

	// dodatkowe zdarzenia, jeżeli jeszcze nie dodane
	if (!element.hintEvents)
	{
		element.hintEvents = true;
		addEvent(element, "mousemove",Hint.show);
		addEvent(element, "mouseout",Hint.hide);
	} 

	var e = Hint.getContainer().firstChild;
	e.innerHTML=message;
}

/**
 * Comparer
 */
function Comparer() {}

Comparer.prototype = {
	capacity : 4,
	init: function(clean)
	{
		if(clean) delCookie("comparer");
		this.refresh();
	},
	getIds: function()
	{
		var s = getCookie("comparer");
		if (s && s.length>0) return this.normalize(s.split(","));
		return [];
	},
	setIds: function(ids)
	{
		ids = this.normalize(ids)
		setCookie("comparer",ids.join(","),"/");
	},
	refresh: function()
	{
		var ids = this.getIds();
		// add events
		var elements = $("search_results").getElementsByTagName("input");
		var i,j;

		if (elements) for (i=0; i<elements.length; i++)
		{
			if (elements[i].type!='checkbox') continue;
			if (elements[i].name!='object') continue;

			elements[i].onclick=function() {Comparer.instance.add(this);};
			var b = false;
			for (j=0; j<ids.length; j++)
			{
				if (ids[j]!=elements[i].value) continue; 
				b = true;
				break;
			}
			elements[i].checked = b;
		}
	},
	add: function(input)
	{
		var ids = this.getIds();
		ids = this.removeId(ids, input.value);
		if (input.checked) ids = [input.value].concat(ids);
		this.setIds(ids);
		this.refresh();
	},
	normalize: function(ids)
	{
		if (ids.length<=this.capacity) return ids;
		return ids.slice(0,this.capacity);
	},
	removeId: function(ids,value)
	{
		var i;
		for (i=0; i<ids.length; i++)
			if (ids[i]==value) return ids.slice(0,i).concat(ids.slice(i+1));
		return ids;
	},
	compare : function (form, message)
	{
		var marker = new ErrorMarker(form.getElementsByTagName("input"));
		marker.clearErrors();

		var s = getCookie("comparer");
		if (!s || s.length==0 || s.split(",").length < 1)
		{
			marker.setErrors();
			alert(message);
			return false;
		}

		// prepare query string
		var ids = this.getIds()
		var qs = "";
		for(i=0; i<ids.length; ++i)
		{
			qs += ("object=" + ids[i]);
			if(i<ids.length-1) qs += "&";
		}

		var url = (form._event.value=="compare") ? "/apartment/compare.xml" : "/apartment/contact.xml";
		url += ("?" + qs);
		document.location = url;
		return false;
	}	
}

function onAdvSearchClick(id)
{
	var form = $(id);
	if(form)
	{
		form.action = "/search.xml?update=1";
		form.submit();
	}
	return false;
}