/*##############################################################################
#
#  SRC-Module : main.js
#
#  Version    : 0202 (phase version 2 digits/ file version 2 digits)
#
#  Author     : Harald Kovacs
#
#  Purpose    : main javascript functions
#
#  History    :
#  (version / date / description of change)
#  0201 / 12.12.2009 / BR0000085: show all provinces
#  0202 / 04.02.2010 / BR0000097: add new object type
#
##############################################################################*/

	// global script variables
	requestCounter   = 0;
	selectedProvince = new Array();
	selectedDistrict = new Array();

	// saved size from and to values
	sizeFrom = '';
	sizeTo   = '';

	// current mouse position
	mouseX = 0;
	mouseY = 0;

	// previous mouse position
	mouseOldX = 0;
	mouseOldY = 0;

	// draggable element
	currentElement = null;

	// Detect if the browser is IE or not.
	// If it is not IE, we assume that the browser is NS.
	var IE = document.all ? true : false;

	function setCookie(c_name, value, expiredays)
	{
		var exdate = new Date();
		exdate.setDate(exdate.getDate()+expiredays);
		document.cookie = c_name+ "=" +escape(value) + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
	}

	function readCookie(name)
	{
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++)
		{
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	}

	// get current window size
	function getSize()
	{
		var myWidth = 0, myHeight = 0;
		if( typeof( window.innerWidth ) == 'number' )
		{
			//Non-IE
			myWidth = window.innerWidth;
			myHeight = window.innerHeight;
		}
		else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		{
			//IE 6+ in 'standards compliant mode'
			myWidth = document.documentElement.clientWidth;
			myHeight = document.documentElement.clientHeight;
		}
		else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
		{
			//IE 4 compatible
			myWidth = document.body.clientWidth;
			myHeight = document.body.clientHeight;
		}

		return [myWidth , myHeight];
	}

	// get current scroll position
	function getScrollXY()
	{
		var scrOfX = 0, scrOfY = 0;
		if( typeof( window.pageYOffset ) == 'number' )
		{
			//Netscape compliant
			scrOfY = window.pageYOffset;
			scrOfX = window.pageXOffset;
		}
		else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
		{
			//DOM compliant
			scrOfY = document.body.scrollTop;
			scrOfX = document.body.scrollLeft;
		}
		else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
		{
			//IE6 standards compliant mode
			scrOfY = document.documentElement.scrollTop;
			scrOfX = document.documentElement.scrollLeft;
		}
		return [scrOfX, scrOfY];
	}

	// get current mouse position
	function getMouseXY(evt)
	{
		mouseOldX = mouseX;
		mouseOldY = mouseY;

		evt = (!evt && window.event)? window.event : evt;
		// grab the x-y pos.s if browser is IE
		if(IE)
		{
			mouseX = evt.clientX + document.body.scrollLeft;
			mouseY = evt.clientY + document.body.scrollTop;
		}
		// grab the x-y pos.s if browser is NS
		else
		{
			mouseX = evt.pageX;
			mouseY = evt.pageY;
		}

		// catch possible negative values in NS4
		if (mouseX < 0) { mouseX = 0 }
		if (mouseY < 0) { mouseY = 0 }
	}

	// set current element on mouse down
	// used for dragging
	function setMouseDown(event)
	{
		currentElement = null;

		var element = Event.element(event);

		if(!element.hasClassName('aw_drag'))  element = element.up('.aw_drag');
		if(!element) return;

		element.style.cursor = 'move';
		currentElement = element;
	}

	// reset current element on mouse up
	// used for dragging
	function setMouseUp(event)
	{
		var element = Event.element(event);
		currentElement = null;

		if(!element.hasClassName('aw_drag')) element = element.up('.aw_drag');
		if(!element) return;

		element.style.cursor = '';
	}

	// move current element
	// used for dragging
	function moveElement(event)
	{
		// if draggable element select
		if(currentElement)
		{
			el = currentElement;

			elLeft = parseFloat(el.getStyle('left') || '0');
			elTop  = parseFloat(el.getStyle('top')  || '0');

			diffX = mouseX - mouseOldX;
			diffY = mouseY - mouseOldY;

			if(elLeft < 0) elLeft = 0;
			if(elTop < 0) elTop = 0;

			el.setStyle({
				left: (elLeft + diffX).round() + 'px',
				top:  (elTop + diffY).round()  + 'px'
			});
		}
	}

	/**
	 *  set the radio button with the given value as being checked
	 *  do nothing if there are no radio buttons
	 *  if the given value does not exist, all the radio buttons
	 *  are reset to unchecked
	 */
	function setCheckedValue(radioObj, newValue)
	{
		if(!radioObj)
			return;
		var radioLength = radioObj.length;
		if(radioLength == undefined)
		{
			radioObj.checked = (radioObj.value == newValue.toString());
			return;
		}
		for(var i = 0; i < radioLength; i++)
		{
			radioObj[i].checked = false;
			if(radioObj[i].value == newValue.toString())
			{
				radioObj[i].checked = true;
			}
		}
	}

	// send ajax request
	function xhr(param, callback)
	{
		if($('clickshield'))
		{
			requestCounter++;

			var wSize   = getSize();
			var winH    = wSize[1];

			var scroll  = getScrollXY();
			var scrollY = scroll[1];

			var offsetY = ((winH / 2) - 20);
			offsetY += scrollY;

			$('clickshield').style.height   = winH + 'px';
			$('waitcursor').style.marginTop = offsetY + 'px';
			$('clickshield').show();
		}
		param.uniqueid = (new Date()).getTime();   // prevent firebug from caching

		param = $H(param).merge({}).toObject();

		param.page = param.page ? serverBaseurl +'/'+ param.page : serverBaseurl +'/xhr.php';
		if(param.page)
		{
			new Ajax.Request(param.page, { method: 'POST',
					requestHeaders: {Accept: 'text/html'},
					parameters: param,
					evalScripts: false,
					onFailure: handleAjaxError,
					onComplete: function(transport) { if($('clickshield')) { requestCounter--; if(requestCounter<=0) $('clickshield').hide(); } },
					onSuccess: handleAjaxResponse } );
		}
	}

	// handle ajax errors
	function handleAjaxError() {
		alert("Es ist ein Netzwerkfehler aufgetreten.\nBitte versuchen Sie es erneut.");
	}

	// handle response JSON objects and update html elements
	function handleAjaxResponse(transport)
	{
		debug_var = null;
		try
		{
			var data = transport.responseText.extractScripts();
			data.each(function(item)
			{
				item = item.strip().unfilterJSON();
				if(!item.blank())
				{
					if(item.isJSON())
					{
						item = item.strip().evalJSON(true);

						item.each(function(jsonItem)
						{
							if($(jsonItem.id))
							{
								if(jsonItem.replaceId == "1")
									$(jsonItem.id).replace(jsonItem.content);
								else
									$(jsonItem.id).innerHTML = jsonItem.content;
							}
							else
							{
								//"error: id '"+jsonItem.id+ "' does not exist in html doc");
							}
						});
					}
					else
					{
						item = item.replace(/function\s+(\w+)\s*\(([^)]*)\)/g,"$1 = function($2)");
						eval(item);
					}
				}
			});
		}
		catch(e)
		{
			alert(e);
		}
	}

	/*
	 * open new browser window
	 */
	function newWindow(newContent, x, y)
	{
		winContent = window.open(newContent, '_blank',"right=10, top=10,width="+x+",height="+y+", toolbar=no,scrollbars=no, resizable=no");
	}

	/**
	 * show overlay window
	 */
	function showPhotoOverlay(headline)
	{
		var overlaybg = $('overlay_bg');
		var overlay   = $('overlay');
		var ol_title  = $('overlay_title');

		headline = headline == null ? '' : headline;

		if(overlaybg && overlay)
		{
			// set overlay height
			var wSize   = getSize();
			var winW    = wSize[0];
			var winH    = wSize[1];

			var scroll  = getScrollXY();
			var scrollY = scroll[1];

			ol_title.innerHTML = headline;

			overlaybg.style.height = winH + scrollY +'px';
			overlaybg.show();

			if(!overlay.hasClassName('popup'))
			{
				var dim   = Element.getDimensions(overlay);

				offsetX = Math.round((winW/2) - (dim.width/2));
				offsetY = Math.round(mouseY - (dim.height/2));
				offsetY = offsetY >= 0 ? offsetY : 0;

				overlay.style.left = offsetX +'px';
				overlay.style.top  = offsetY +'px';
				overlay.removeClassName('hide');
				overlay.addClassName('popup');
				overlay.show();
			}
		}
	}

	/**
	 * hide overlay window
	 */
	function hidePhotoOverlay()
	{
		var overlaybg = $('overlay_bg');
		var overlay   = $('overlay');

		if(overlaybg && overlay)
		{
			overlay.hide();
			overlay.removeClassName('popup');
			overlay.addClassName('hide');

			overlaybg.hide();
			overlaybg.style.height = '10px';
		}
	}

	/**
	 * add or remove provice
	 *
	 * @param element prov ...... checkbox element
	 */
	function selectProvince(prov)
	{
		// get selected province
		if(prov == null)
		{
			$$('input[name="province_id[]"]').each(function(el) {
				if(el.checked)	{ prov = el; }
			});
		}
		// hide not selected provinces
		$$('input[name="province_id[]"]').each(function(el) {
			if(!el.checked){ $(el.parentNode).hide(); }
		});

		$('extra_province').removeClassName('hide_element');

		if(prov != null && prov.value)
		{
			// if selected add to array
			if(prov.checked)
			{
				selectedProvince.push(prov.value);
				selectedProvince.sort();

				xhr({view:'ShowDistrict', province_id:prov.value, selected:$('selected_district').value});
			}
			// remove from array
			else
			{
				hidePhotoOverlay();
				for(i=0; i < selectedProvince.length; i++)
				{
					if(selectedProvince[i] == prov.value)
					{
						selectedProvince.splice(i, 1);
					}
				}
			}
		}
	}

	/**
	 * show all provinces
	 * reset choosen districts
	 */
	function changeProvince(resetSelection)
	{
		resetSelection = resetSelection == null ? true : resetSelection;

		// show all provinces
		$$('input[name="province_id[]"]').each(function(el) {
			$(el.parentNode).removeClassName('hide_element');
			$(el.parentNode).show();
		});

		if(resetSelection)
		{
			$('selected_district').value = '';
			selectedDistrict = new Array();
		}
		else
		{
			$('all_province').addClassName('hide_element');
		}

	}

	/**
	 * add or remove district
	 *
	 * @param element el ...... checkbox element
	 */
	function selectDistrict(el)
	{
		if(el)
		{
			// if selected add to array
			if(el.checked)
			{
				selectedDistrict.push(parseInt(el.value));
				selectedDistrict.sort();
			}
			// remove from array
			else
			{
				for(var i=0; i < selectedDistrict.length; i++)
				{
					if(selectedDistrict[i] == el.value)
					{
						selectedDistrict.splice(i, 1);
					}
				}
			}
		}
	}

	/**
	 * select or diselect all district boxes
	 *
	 * @param bool select ... switch to select or deselect
	 */
	function selectDistricts(select)
	{
		var districts = $$('input[name="district_id[]"]');
		for(var i=0; i < districts.length; i++)
		{
			districts[i].checked = select;
			selectDistrict(districts[i]);
		}
	}

	/**
	 * save selected districts in search form
	 */
	function saveDistrict()
	{
		var selected_district = $('selected_district');

		if(selected_district)
		{
			selected_district.value = selectedDistrict.join(',');
		}
		hidePhotoOverlay();

		// submit search form
		$('form_search_object').submit();
	}


	/**
	 * update district id if city is choosen
	 * @param field ... input field for auto complete
	 * @param li ...... chosen list item
	 */
	function updateDistrictId(field, li)
	{
		var items = li.id.split('|', 2);

		var districtId = items[0];
		var cityName   = items[1];

		// update district id
		if(districtId)
	   	$$('[name="district_id"]').each(function(el) {el.value = districtId});

	   // update city name
	   var cityField = $('field_city');
	   if(cityName && cityField)
	   	cityField.value = cityName;
	}

	/**
	 * show or hide size search param
	 *
	 * @param element objectType ...... checkbox element
	 */
	function selectObjectType(objectType)
	{
		try
		{
			var box  = $('box_size');
			var from = $('size_from');
			var to   = $('size_to');

			if(objectType.value == 3)
			{
				// save current values
				sizeFrom  = from.value;
				sizeTo    = to.value;

				box.addClassName('hide_element');
				from.value = '';
				to.value   = '';
			}
			else
			{
				box.removeClassName('hide_element');
				from.value = sizeFrom;
				to.value   = sizeTo;
			}
		}
		catch(err) {}
	}

	/**
	 * remove HTML tags
	 * @param hmtl code
	 */
	function stripTags(html)
	{
		if(html)
		{
			replaceBr = true;
			html = replaceBr ? html.replace(/<br\s*[\/]*>/g, ' * ') : hmtl;
			return html.replace(/<\s[^><]*>/g, '');
		}
	}

	/**
	 * update onject fields if object type is changed
	 */
	function onObjectTypeChange()
	{
		var object_type = $('form_object_render').getInputs('radio', 'object_type').find(
			function(r) {
				return r.checked
			}
		);

		var loft = $('loft');
		$('payment_type_1').show();
		$('payment_type_2').show();

		if(object_type.value == 1)
		{
			// show elements
			$('opex').show();
			$('size').show();
			$('year').show();
			$('rooms').show();
			$('level').show();
			$('penthouse').show();
			if(loft) loft.show();
			$('lift').show();
			$('terrace').show();
			$('balcony').show();
			$('garage').show();

			// hide elements
			$('landsize').hide();
		}
		else if(object_type.value == 2)
		{
			// show elements
			$('size').show();
			$('landsize').show();
			$('year').show();
			$('rooms').show();

			// hide elements
			$('opex').hide();
			$('level').hide();
			$('penthouse').hide();
			if(loft) loft.hide();
			$('lift').hide();
			$('terrace').hide();
			$('balcony').hide();
			$('garage').hide();
		}
		else if(object_type.value == 3)
		{
			// show elements
			$('landsize').show();

			// hide elements
			$('opex').hide();
			$('size').hide();
			$('year').hide();
			$('rooms').hide();
			$('level').hide();
			$('penthouse').hide();
			if(loft) loft.hide();
			$('lift').hide();
			$('terrace').hide();
			$('balcony').hide();
			$('garage').hide();
		}
		else if(object_type.value == 4)
		{
			// show elements
			$('size').show();
			$('level').show();
			$('penthouse').show();
			if(loft) loft.show();
			$('lift').show();
			$('terrace').show();
			$('balcony').show();
			$('garage').show();

			// hide elements
			$('opex').hide();
			$('year').hide();
			$('rooms').hide();
			$('landsize').hide();

			// set check box
			var radios = $('form_object_render').getInputs('radio', 'payment_type');
			setCheckedValue(radios, 2);
			$('payment_type_1').hide();
		}
	}

	/**
	 *  set navigation to active and show its sub menu
	 */
	function showMenu(menuname)
	{
		hideMenu('search');
		hideMenu('offer');

		menu    = $('menu_'+ menuname);
		submenu = $('sub_menu_'+ menuname);
		addi    = $('addi_'+ menuname);

		if(menu)    menu.addClassName('active');
		if(submenu) submenu.addClassName('active');
		if(addi)    addi.show();

		setCookie('active_menu', menuname);

		if(menuname == 'offer')
		{
			location.href = serverBaseurl + '/newobject';
		}
	}

	/**
	 *  hide sub menu
	 */
	function hideMenu(menuname) {
		menu    = $('menu_'+ menuname);
		submenu = $('sub_menu_'+ menuname);
		addi    = $('addi_'+ menuname);

		if(menu)    menu.removeClassName('active');
		if(submenu) submenu.removeClassName('active');
		if(addi)    addi.hide();
	}


	// Set-up to use getMouseXY function onMouseMove
	Event.observe(document, 'mousemove', getMouseXY);

	// enable dragging
	Event.observe(document, 'mousemove', moveElement);
	Event.observe(document, 'mousedown', setMouseDown);
	Event.observe(document, 'mouseup', setMouseUp);

