// root url..
var wwwbase = '/';

// cool string stuff..
Object.extend(String.prototype, {
	trimLeft: function(chars) {
		var rx = typeof chars == 'string'?
					new RegExp('^[' + chars + ']+'):
					chars && chars.exec?
						chars:
						/^\s+/;

		return this.replace(rx, '');
	},

	trimRight: function(chars) {
		var rx = typeof chars == 'string'?
					new RegExp('[' + chars + ']+$'):
					chars && chars.exec?
						chars:
						/\s+$/;

		return this.replace(rx, '');
	},

	trim: function(chars) {
		return this.trimLeft(chars).trimRight(chars);
	}
});

Event.observe(window,'load', function() {
	// show additional menus..
	if ($('type15')) {
		if ($F('type15') == 15) {
			toggle();
		}
	}

	//if (window.location.toString().indexOf('internetbroker') == -1) {
		// reset search form..
		Form.reset('searchform');

		// load cities..
		loadCities(document.getElementById('cbCountry').value);

		// handle city change event..
		Event.observe('city', 'change', function() {
			onCityChange($F('city'));
		});

		// toggle additional menus..
		if ($('type15')) {
			Event.observe('type15', 'click', function() {
				toggle();
			});
		}
	//}

	// match root url..
	var scripttag = document.getElementsByTagName('script')[0];
	wwwbase = scripttag.src.match(/(.*)public\/js.*/)[1];
});

function loadCities(country_id) {
	if (country_id) {
		new Ajax.Request(wwwbase + 'buy/getcities', {
			method: 'post',
			parameters: 'id=' + country_id,
			onComplete: function(response) {
				var rsp = eval('(' + response.responseText + ')');
				if (rsp.result !== 'false') {
					fillCities('city', rsp);
				}
			}
		});
	}
}

function fillCities(element, data) {
	if (element = $(element)) {
		var selected = $F('cbCityOrRegion'),
			value,
			x;

		//while (element.options.length) {
			//element.remove(0);
		//}
		element.innerHTML = '';

		element.options.add(new Option('-------------------------------', 0));
		for (x = 0; x < data.city.length; ++x) {
			element.options.add(new Option(data.city[x].name, value = data.city[x].the_id + data.city[x].type));
			if (value == selected) {
				element.options[element.options.length - 1].selected = true;
			}
		}

		// select preloaded stuff..
		preloadSelections();
	}
}

// REMOVE ME!
function city_change( what )
{
	var url = wwwbase + 'buy/getplaces';
	if ( what != 0 ) {
		pars = 'id=' + what;
		myAjax = new Ajax.Request( url, { method: 'post', parameters: pars, onComplete: onsendData } );

		url = wwwbase + 'buy/new_quarters';
		pars = 'id=' + what;
		myNewQuartersAjax = new Ajax.Request( url, { method: 'post', parameters: pars, onComplete: onsendNewQuarters } );
	}
	$('listfull').innerHTML = '';
	$('listof').innerHTML = '';
	$('hiddenplace').value = '';

	clear_newquarters();
}

// REMOVE ME!
function adding( what )
{
	var url = wwwbase + 'buy/quarters';
	var pars = 'id=' + what;

	var myAjax = new Ajax.Request( url, { method: 'post', parameters: pars, onComplete: addingQuarters } );
}

function remove( what )
{
	var url = wwwbase + 'buy/quarters';
	var pars = 'id=' + what;

	var myAjax = new Ajax.Request( url, { method: 'post', parameters: pars, onComplete: removeQuarters } );
}


// REMOVE ME!
function loading() {

}

// REMOVE ME!
function sortSelectBox (obj) {
	var options = obj.options;
	var optionsSorted = [];

	for(var i=0; i<options.length; i++)
	{
		optionsSorted.push(new Option(options[i].text, options[i].value, options[i].defaultSelected, options[i].selected));
	}

	if(optionsSorted.length == 0)
		return;

	optionsSorted = optionsSorted.sort(function(a, b) {
		if ((a.text+"") < (b.text+"")) { return -1; }
		if ((a.text+"") > (b.text+"")) { return 1; }
		return 0;
	});

	for(i=0; i<optionsSorted.length; i++)
	{
		options[i] = new Option(optionsSorted[i].text, optionsSorted[i].value, optionsSorted[i].defaultSelected, optionsSorted[i].selected);
	}
}

// REMOVE ME!
function addingQuarters(originalRequest, json) {
	var request = originalRequest.responseText;

	var objectwith = $('listfull');
	var objectto = $('listof');

	eval('var list = '+request);
	if ( list.Result === 'true' )
	{

		for( var i=0; i < list.city.length; i++ )
		{
			addingQuartersTo(list.city[i].id);
		}
	}

//	for ( var a=0; a < objectto.length; a++ )
//	{
//		if ( objectto[a].value == 0 ) {
//			objectto.options[a] = null;
//		}
//	}
//
	sortSelectBox(objectto);
}

// REMOVE ME!
function removeQuarters(originalRequest, json) {
	var request = originalRequest.responseText;

	var objectwith = $('listfull');
	var objectto = $('listof');

	eval('var list = '+request);
	if ( list.Result === 'true' )
	{

		for( var i=0; i < list.city.length; i++ )
		{
			removeQuartersTo(list.city[i].id);
		}
		//addingQuartersTo(list.city);

	}

	if ( objectto.length == 0 ) {
		$('listof').innerHTML = '';
		$('listof').options.add (new Option ("ВСИЧКИ РАЙОНИ", "0"));
	}

}


// REMOVE ME!
function onsendData (originalRequest, json) {
	$('listof').innerHTML = '';
	$('listof').options.add (new Option ("ВСИЧКИ РАЙОНИ", "0"));

	var request = originalRequest.responseText;
	eval('var list = '+request);

	if ( list.Result === 'false' )
	{
		var optgroup = document.createElement("option");
		optgroup.appendChild(document.createTextNode("Няма райони"));
		optgroup.label = "Няма райони";
		optgroup.value = "0";

		$('listfull').innerHTML = '';
		$('listfull').appendChild(optgroup);
		//$('listfull').innerHTML = '<optgroup label="Няма никой" />';
		return ;
	}

	fill_select( 'listfull', list.city );
}

// REMOVE ME!
function onsendNewQuarters (originalRequest, json) {


	request = originalRequest.responseText;
	if (request == '""') return false;
	eval('var list = '+request);
	oDiv = document.getElementById('flashposition');
	sChechbox = '';
	if (list.Result !== 'false') {
		oDiv.style.visibility = 'visible';
		for(j = 0; j < list.new_quarter.length; j++) {
			sChechbox += '<input type="checkbox" onclick="add_remove_quarter(this, ' + list.new_quarter[j].id + ')">&nbsp;&nbsp;' + list.new_quarter[j].name + '</input><br />';
		}
		//alert(sChechbox);
		oDiv.className = 'cFilledNewQuarters';
		oDiv.innerHTML = sChechbox;
	} else {
		//alert('Лошо, Седларов, лошо...');
	}
}

// REMOVE ME!
function add_remove_quarter(oElement, nItemId) {
	if (oElement.checked == false) {
		remove(nItemId);
	} else {
		adding(nItemId);
	}
}

// REMOVE ME!
function fill_select( select_id, data )
{
	var el_select = $(select_id);
	el_select.innerHTML = '';
	for( var i=0; i < data.length; i++ ) {
		el_select.options.add (new Option (data[i].name, data[i].city_id));
	}
}

// REMOVE ME!
function addingQuartersTo(id) { // THIS WORKS !!! Its unbelievable, holla!
	var objectwith = $('listfull');
	var objectto = $('listof');
	var objhidden = $('hiddenplace');

	var i;
	for (i=0; i<objectwith.length;i++ ) {
		if ( objectwith.options[i].value == id ) {
			// remove the all regions label
			if (objectto.options[0].value == 0) objectto.options[0] = null;
			var opt = new Option(objectwith.options[i].text, objectwith.options[i].value); // ADDing
			objectto.options.add (opt);

			objectwith.options[i] = null;
			//objectto.remove(i); // AND remove

			if ( objhidden.value == "" ) {
				objhidden.value = objhidden.value + id;
			} else {
				objhidden.value = objhidden.value + ',' + id;
			}
			return;
		}
	}
}

// REMOVE ME!
function removeQuartersTo(id) { // THIS WORKS !!! Its unbelievable, holla!
	var objectwith = $('listfull');
	var objectto = $('listof');
	var objhidden = $('hiddenplace');

	var i;
	for (i=0; i<objectto.length;i++ ) {
		if ( objectto.options[i].value == id ) {

			var opt = new Option(objectto.options[i].text, objectto.options[i].value); // ADDing
			objectwith.options.add (opt);
			objectto.options[i] = null;
			//objectto.remove(i); // AND remove

			if ( objhidden.value != "" ) {
				var hiddenvalues = objhidden.value.split(',');
			} else {
				var hiddenvalues = new Array();
			}
			var f;
			for ( f=0; f<hiddenvalues.length; f++) {
				if ( hiddenvalues[f] == id ) {
					hiddenvalues.splice(f);
				}
			}

			if ( hiddenvalues.length != 0 ) {
				objhidden.value = hiddenvalues.join(',');
			}
			return;
		}
	}
}

// !@#$?
Ajax.Responders.register({
	onLoading: function() {
		if ($('loadingImage') && Ajax.activeRequestCount > 0) {
			Effect.Appear('loadingImage', { duration: 0.5, queue: 'end' });
		}
	},

	onComplete: function() {
		if ($('loadingImage') && Ajax.activeRequestCount == 0) {
			Effect.Fade('loadingImage', { duration: 0.5, queue: 'end' });
		}
	}
});

function toggle() {
	if ($F('type15') == 15) {	// additional menus crap..
		$('additional_param_1', 'additional_param_2', 'additional_param_3', 'additional_param_4', 'additional_param_5').each(function(el) { Effect.BlindDown(el, { duration: 0.3 }); });
	} else {
		$('additional_param_1', 'additional_param_2', 'additional_param_3', 'additional_param_4', 'additional_param_5').each(function(el) { Effect.BlindUp(el, { duration: 0.3 }); });
	}
}

// REMOVE ME!
function insflash() {
	var ins_here = $('flashposition');
	var id = $F('city');
	var openid = parseInt(id);


	if ( id && openid + 'X' == id ) {
		ins_here.innerHTML = '';
		var html = '<object type="application/x-shockwave-flash" data="' + wwwbase + 'public/files/flashmaps/' + openid + '.swf" width="180" height="142">';
		html += '			<param name="quality" value="high" /> \
							<param name="menu" value="false" /> \
							<param name="movie" value="' + wwwbase + 'public/files/flashmaps/' + openid + '.swf" /> \
					</object>';

		ins_here.innerHTML = html;
	} else {
		ins_here.innerHTML = '';
	}
}

// REMOVE ME!
function clear_newquarters() {
	var ins_here = $('flashposition');
	ins_here.innerHTML = '';
	ins_here.style.visibility = 'hidden';
}

/* New search form hacks */

// brutal!!
function onCityChange(id, after) {
	if (parseInt(id)) {		// hell! '0' string pushes up unneeded ajax req..
		new Ajax.Request(wwwbase + 'buy/new_quarters', {	// main regions for the city..
			method: 'post',
			parameters: ('id=' + id),
			onComplete: function(response) {
				var container = $('quarters');		// the <ul> we append crap to..
				container.innerHTML = '';		// clean up the mess..

				$('hiddenplace').value = '';		// !@#$
				$('selected_container').innerHTML = '';		// !@#$

				var rsp = eval('(' + response.responseText + ')');
				if (rsp.Result && rsp.Result !== 'false') {		// some idiot once thought, that strings like true/false will work..
					rsp.new_quarter.each(function(quarter) {
						// append something like:
						//	<li>
						//		<label for="quarter_31337">
						//			<input type="checkbox" class="checkbox" id="quarter_31337" value="31337" onclick="addOrRemoveQuarter(this, 31337);" />
						//			Quarter_Name
						//		</label>
						//	</li>
						container.appendChild(
							Builder.node('li', {}, [
								Builder.node('label', { 'for': 'quarter_' + quarter.id }, [
									Builder.node('input', { type: 'checkbox', className: 'checkbox', id: 'quarter_' + quarter.id, value: quarter.id, onclick: 'addOrRemoveQuarter(this, ' + quarter.id + ');' }),
									quarter.name
								])
							])
						);
					});

					// do some extra job..
					if (after) {
						after();
					}
				} else {									// cities for the district..
					new Ajax.Request(wwwbase + 'buy/getplaces', {
						method: 'post',
						parameters: ('id=' + id),
						onComplete: function(response) {
							var rsp = eval('(' + response.responseText + ')');
							if (rsp.Result && rsp.Result !== 'false') {		// the same idiot here..
								rsp.city.each(function(city) {
									// append something like:
									//	<li>
									//		<label for="city_31337">
									//			<input type="checkbox" class="checkbox" id="city_31337" value="31337" onclick="addOrRemoveCity(this, 31337);" />
									//			City_Name
									//		</label>
									//	</li>
									container.appendChild(
										Builder.node('li', {}, [
											Builder.node('label', { 'for': 'city_' + city.city_id }, [
												Builder.node('input', { type: 'checkbox', className: 'checkbox', id: 'city_' + city.city_id, value: city.city_id, onclick: 'addOrRemoveCity(this, ' + city.city_id + ');' }),
												city.name
											])
										])
									);
								});

								if (after) {
									after();
								}
							}
						}
					});
				}
			}
		});
	}
}

// more brutal!!
function addOrRemoveQuarter(element, id) {
	if (element.checked) {		// select a quarter - add everything
		new Ajax.Request(wwwbase + 'buy/quarters', {
			method: 'post',
			parameters: ('id=' + id),
			onComplete: function(response) {
				var root_container = $('selected_container');

				var rsp = eval('(' + response.responseText + ')');
				if (rsp.Result !== 'false') {
					var container = Builder.node('div', { className: 'container', id: 'quarter_container_' + id }),
						ul = container.appendChild(document.createElement('ul'));

					ul.appendChild(
						Builder.node('li', {}, [
							Builder.node('strong', {}, element.parentNode.childNodes[1].nodeValue)
						])
					);

					rsp.city.each(function(city) {
						ul.appendChild(
							Builder.node('li', {}, [
								Builder.node('label', { 'for': 'city_' + city.id }, [
									Builder.node('input', { type: 'checkbox', className: 'checkbox', id: 'city_' + city.id, value: city.id, checked: 'checked', onclick: 'updateSelections();' }),
									city.name
								])
							])
						);
					});

					root_container.appendChild(container);

					setTimeout(function() {
						updateSelections();
					}, 0);
				} else {
					//alert('Много лошо, чичо Гошо!!');
				}
			}
		});
	} else {		// deselect a quarter - remove everything
		var container = document.getElementById('quarter_container_' + id);
		if (container) {
			container.parentNode.removeChild(container);
			setTimeout(function() {
				updateSelections();
			}, 0);
		}
	}
}

// really brutal! -- and it works!!
function addOrRemoveCity(element, id) {
	updateSelections();	// force brutal update..
	$('hiddenplace').value = $F('hiddenplace').trim(',').split(',').concat($F('_quarters').trim(',').split(',')).findAll(function(id) { return !!id; }).join(',');	// do something more brutal! :>
}

// not that brutal, but..
function updateSelections() {
	$('_quarters').value = $$('#quarters_container input.checkbox').findAll(function(element) {
		return element.checked;
	}).collect(function(element) {
		//return element.id.substr(8);		// 'quarter_'.length
		return element.id.replace(/^[a-z_]+/i, '');
	}).join(',');

	$('_cities').value = $('hiddenplace').value = $$('#selected_container input.checkbox').findAll(function(element) {
		return element.checked;
	}).collect(function(element) {
		return element.id.substr(5);		// 'city_'.length
	}).join(',');
}

// even more brutal!!
function preloadSelections() {
	if ($F('city')) {
		onCityChange($F('city'), function() {
			var queue = [];

			$F('_quarters').split(',').each(function(quarter) {
				var element = $('quarter_' + quarter);
				if (element) {
					element.checked = true;
					queue.push([quarter, element.parentNode.childNodes[1].nodeValue]);
				} else {
					if (element = $('city_' + quarter)) {
						element.checked = true;
					}
				}
			});

			var root_container = $('selected_container'),
				quarters = '!' + $F('_quarters').split(',').join('!') + '!',
				cities = '!' + $F('_cities').split(',').join('!') + '!';

			queue.each(function(descriptor) {
				new Ajax.Request(wwwbase + 'buy/quarters', {
					method: 'post',
					parameters: ('id=' + descriptor[0]),
					onComplete: function(response) {
						var container = Builder.node('div', { className: 'container', id: 'quarter_container_' + descriptor[0] }),
							ul = container.appendChild(document.createElement('ul')),
							rsp = eval('(' + response.responseText + ')');

						ul.appendChild(
							Builder.node('li', {}, [
								Builder.node('strong', {}, descriptor[1])
							])
						);

						if (rsp.Result !== 'false') {		// regions for the city..
							rsp.city.each(function(city) {
								var params = cities.indexOf('!' + city.id + '!') > -1?
									{ type: 'checkbox', className: 'checkbox', id: 'city_' + city.id, value: city.id, checked: 'checked', onclick: 'updateSelections();' }:
									{ type: 'checkbox', className: 'checkbox', id: 'city_' + city.id, value: city.id,					  onclick: 'updateSelections();' };

								ul.appendChild(
									Builder.node('li', {}, [
										Builder.node('label', { 'for': 'city_' + city.id }, [
											Builder.node('input', params),
											city.name
										])
									])
								);
							});

							root_container.appendChild(container);
						} else {							// cities for the district..
							if (quarters.indexOf('!' + descriptor[0] + '!') > -1) {
								var element = document.getElementById('city_' + descriptor[0]);
								if (element) {
									element.checked = true;
								}
							}
						}
					}
				});
			});
		});
	}
}
