var brandsKeyupTimeout = null;
var brandsOriginalValue = null;
var shopsKeyupTimeout = null;
var shopsOriginalValue = null;

var minInputLength = 2;
var inputDelay = 200;

try {
  document.execCommand("BackgroundImageCache", false, true);
} catch(err) {}

function objectWA(str) {
	document.write(str);
}

function sprintf()
{
   if (!arguments || arguments.length < 1 || !RegExp)
   {
      return;
   }
   var str = arguments[0];
   var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
   var a = b = [], numSubstitutions = 0, numMatches = 0;
   while (a = re.exec(str))
   {
      var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
      var pPrecision = a[5], pType = a[6], rightPart = a[7];

      numMatches++;
      if (pType == '%')
      {
         subst = '%';
      }
      else
      {
         numSubstitutions++;
         if (numSubstitutions >= arguments.length)
         {
					return false;
         }
         var param = arguments[numSubstitutions];
         var pad = '';
                if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1);
           else if (pPad) pad = pPad;
         var justifyRight = true;
                if (pJustify && pJustify === "-") justifyRight = false;
         var minLength = -1;
                if (pMinLength) minLength = parseInt(pMinLength);
         var precision = -1;
                if (pPrecision && pType == 'f')
                   precision = parseInt(pPrecision.substring(1));
         var subst = param;
         switch (pType)
         {
         case 'b':
            subst = parseInt(param).toString(2);
            break;
         case 'c':
            subst = String.fromCharCode(parseInt(param));
            break;
         case 'd':
            subst = parseInt(param) ? parseInt(param) : 0;
            break;
         case 'u':
            subst = Math.abs(param);
            break;
         case 'f':
            subst = (precision > -1)
             ? Math.round(parseFloat(param) * Math.pow(10, precision))
              / Math.pow(10, precision)
             : parseFloat(param);
            break;
         case 'o':
            subst = parseInt(param).toString(8);
            break;
         case 's':
            subst = param;
            break;
         case 'x':
            subst = ('' + parseInt(param).toString(16)).toLowerCase();
            break;
         case 'X':
            subst = ('' + parseInt(param).toString(16)).toUpperCase();
            break;
         }
         var padLeft = minLength - subst.toString().length;
         if (padLeft > 0)
         {
            var arrTmp = new Array(padLeft+1);
            var padding = arrTmp.join(pad?pad:" ");
         }
         else
         {
            var padding = "";
         }
      }
      str = leftpart + padding + subst + rightPart;
   }
   return str;
}

function T_(str) {
	if (lang[str])
  	return lang[str];
	else
		return str;
}

function setAjaxLoadingIndicator(show) {
	var loadingIndicator = $('ajaxLoadingIndicator');
	if (show) {
		loadingIndicator.style.display = 'block';
	} else {
		loadingIndicator.style.display = 'none';
	}
}

function shopsFailure() {
	var output = '';

	output = '<div class="errorMessage">'+T_('Leider ist ein Fehler bei der Anfrage aufgetreten. Bitte versuchen Sie es später erneut.')+'</div>';
	$('camStreetsContainer').innerHTML = output;
	setAjaxLoadingIndicator(false);
	$('camStreetsContainer').style.display = 'block';
	new Fx.Scroll(window).toElement($('contentHeader'));
}

function buildShopsPane(response) {
	var output = '';
	eval('var shopData = '+response);
	if (shopData.streets) {
		shopData.streets.forEach(function(el){
			output += '<div class="streetName">' + el.name + '</div>';
			el.shops.forEach(function(el){
				output += '<div class="shopInfo">';
				if (el.image && el.parking == '0') {
					output += '<div class="shopThumbImage"><a href="index.php?a=shop&amp;i='+el.id+'&amp;d=stadtplan_suche" class="readMoreLink"><img src="'+el.image+'" width="100" height="75" alt="'+el.name+'" /></a></div>';
				} else if (el.image && el.parking == '1') {
					output += '<div class="shopParkingImage">';
					if (el.premium == '1')
						output += '<a href="index.php?a=shop&amp;i='+el.id+'&amp;d=stadtplan_suche" class="readMoreLink"><img src="'+el.image+'" width="31" height="38" alt="'+el.name+'" /></a>';
					else
          	output += '<img src="'+el.image+'" width="31" height="38" alt="'+el.name+'" />';
					output += '</div>';
				}
				output += '<div class="' + (el.parking == '0' ? 'shopInfoPremium' : (el.parking == '1' ? 'shopInfoParking' : '')) + '">';
				if (el.category) {
					output += '<span class="shopCategory"> - '+el.category+' -</span>';
				}
				output += '<h3>' + el.name + '</h3>';
				output += el.info + '<br />' + el.openingHours + '<br />';
				if (el.specialDayHours != '') {
					output += el.specialDayHours;
				}
				if (el.link != '') {
					output += '<a href="index.php?a=shop&amp;i='+el.id+'&amp;d=stadtplan_suche" class="readMoreLink">'+T_('Mehr lesen...')+'</a>';
				}
				output += '</div></div>';
			});
		});
	} else if (shopData == '0'){
		output = '<div class="errorMessage">'+T_('Leider konnten in diesem Ausschnitt keine Geschäfte gefunden werden.')+'</div>';
	} else {
		output = '<div class="errorMessage">'+T_('Leider ist ein Fehler bei der Anfrage aufgetreten. Bitte versuchen Sie es später erneut.')+'</div>';
	}
	$('camStreetsContainer').innerHTML = output;
	setAjaxLoadingIndicator(false);
	$('camStreetsContainer').style.display = 'block';
	new Fx.Scroll(window).toElement($('contentHeader'));
  //new Fx.Scroll(window).toElement($('camStreetsNotice'));
}

function clickOnMap(position)
{
	$('camStreetsContainer').style.display = 'none';
	camSetModeShowPerimeter(true);
  //camSetModeShowPoint(true);
	setAjaxLoadingIndicator(true);
	var proc = 'proc=getShopsByPerimeter';
	var queryString = proc+'&x1='+position.pointNW.x+'&y1='+position.pointNW.y+'&x2='+position.pointSE.x+'&y2='+position.pointSE.y;

  new Ajax('rpc.php', {method: 'post', data: queryString, onComplete: buildShopsPane, onFailure: shopsFailure}).request();
}

function startMap() {
	camInit(aSettings);
	$('camStreetsNotice').style.display = 'block';
	$('camStreetsContainer').style.display = 'block';
}

function startMapFixPos() {
	camInit(aSettings);
	camSetMapPosIntoView(xCoord, yCoord);
}

function brandsFailure(response) {
	output = '<div class="errorMessage">'+T_('Leider ist ein Fehler bei der Anfrage aufgetreten. Bitte versuchen Sie es später erneut.')+'</div>';
	$('content').innerHTML = output;
}

function buildBrandsPane(response) {
	var output = '';
	eval('var brandsData = '+response);

	input = $('brandInput').value.clean();
	input = input.replace(/</g, '&lt;')
	$('contentHeader').innerHTML = '<h2>'+T_('Marken')+'</h2>';
	$('contentFooter').innerHTML = '';
	if (brandsData == '0') {
		output += sprintf(T_('Zu Ihrer Eingabe "%s" wurden folgende Marken gefunden:<br /><br />Klicken Sie einfach auf den Markennamen, um alle Geschäfte zu sehen, die diese Marke führen.'), input)+'<br /><br />';
		output += T_('Leider wurden keine Marken gefunden.');
	} else if (brandsData == 'false') {
		output = '<div class="errorMessage">'+T_('Leider ist ein Fehler bei der Anfrage aufgetreten. Bitte versuchen Sie es später erneut.')+'</div>';
	} else {
		output += sprintf(T_('Zu Ihrer Eingabe "%s" wurden folgende Marken gefunden:<br /><br />Klicken Sie einfach auf den Markennamen, um alle Geschäfte zu sehen, die diese Marke führen.'), input)+'<br /><br /><ul>';
		brandsData.forEach(function(el){
			output += '<li><a href="index.php?a=marken&b=' + el.id + '">' + el.name + '</a></li>';
		});
		output += '</ul>';
	}

	$('content').innerHTML = output;
}

function brandsKeydown(event) {
	if (event.key == 'enter') {
		event.stop();
		var cleanInput = event.target.value.clean();
		if (cleanInput.length >= minInputLength) {
			window.clearTimeout(brandsKeyupTimeout);
			brandsSubmitSearch();
		}
	}
}

function brandsKeyup(event) {
	if ((event.code >= 48 && event.code <= 57) || (event.code >= 65 && event.code <= 90) || event.code == 8 || event.code == 13 || event.code == 32 || event.code == 46) {
		window.clearTimeout(brandsKeyupTimeout);
		var cleanInput = event.target.value.clean();
		if (cleanInput.length >= minInputLength)
			brandsKeyupTimeout = window.setTimeout("brandsSubmitSearch()", inputDelay);
	}
}

function brandsSubmitSearch() {
	var proc = 'proc=getBrands';
	var queryString = proc+'&brand=' + encodeURIComponent($('brandInput').value.clean());
  new Ajax('rpc.php', {method: 'post', data: queryString, onComplete: buildBrandsPane, onFailure: brandsFailure}).request();
}

function brandsClick(event) {
	if (event.target.value == brandsOriginalValue)
		event.target.value = '';
}

function brandsBlur(event) {
	if (event.target.value == '')
		event.target.value = brandsOriginalValue;
}

function shopsSearchFailure(response) {
	output = '<div class="errorMessage">'+T_('Leider ist ein Fehler bei der Anfrage aufgetreten. Bitte versuchen Sie es später erneut.')+'</div>';
	$('content').innerHTML = output;
}

function buildShopsSearchPane(response) {
	var output = '';
	eval('var shopData = '+response);

	input = $('shopInput').value.clean();
	input = input.replace(/</g, '&lt;')
	output = sprintf(T_('Zu Ihrer Eingabe "%s" wurden folgende Geschäfte gefunden:'), input)+'<br /><br />';
	$('contentHeader').innerHTML = '<h2>'+T_('Shopsuche')+'</h2>';
	$('contentFooter').innerHTML = '';
	if (shopData.streets) {
		shopData.streets.forEach(function(el){
			output += '<div class="streetName">' + el.name + '</div>';
			el.shops.forEach(function(el){
				output += '<div class="shopInfo">';
				if (el.image) {
					output += '<div class="shopThumbImage"><a href="index.php?a=shop&amp;i='+el.id+'"><img src="'+el.image+'" width="100" height="75" alt="'+el.name+'" /></a></div>';
				}
				output += '<div class="' + (el.premium == '1' ? 'shopInfoPremium' : '') + '">';
				if (el.category) {
					output += '<span class="shopCategory"> - '+el.category+' -</span>';
				}
				output += '<h3>' + el.name + '</h3>';
				output += el.info + '<br />' + el.openingHours + '<br />';
				if (el.specialDayHours != '') {
					output += el.specialDayHours;
				}
				if (el.link != '') {
					output += '<a href="index.php?a=shop&amp;i='+el.id+'" class="readMoreLink">'+T_('Mehr lesen...')+'</a>';
				}
				output += '</div></div>';
			});
		});
	} else if (shopData == '0'){
		output = '<div class="errorMessage">'+T_('Leider konnten keine Geschäfte mit diesem Namen gefunden werden.')+'</div>';
	} else {
		output = '<div class="errorMessage">'+T_('Leider ist ein Fehler bei der Anfrage aufgetreten. Bitte versuchen Sie es später erneut.')+'</div>';
	}
	$('content').innerHTML = output;
}

function shopsKeydown(event) {
	if (event.key == 'enter') {
		event.stop();
		var cleanInput = event.target.value.clean();
		if (cleanInput.length >= 3) {
			window.clearTimeout(brandsKeyupTimeout);
			shopsSubmitSearch();
		}
	}
}

function shopsKeyup(event) {
	if ((event.code >= 48 && event.code <= 57) || (event.code >= 65 && event.code <= 90) || event.code == 8 || event.code == 13 || event.code == 32 || event.code == 46) {
		window.clearTimeout(shopsKeyupTimeout);
		var cleanInput = event.target.value.clean();
		if (cleanInput.length >= 3)
			shopsKeyupTimeout = window.setTimeout("shopsSubmitSearch()", inputDelay);
	}
}

function shopsSubmitSearch() {
	var proc = 'proc=getShopsByName';
	var queryString = proc+'&name=' + encodeURIComponent($('shopInput').value.clean());
  new Ajax('rpc.php', {method: 'post', data: queryString, onComplete: buildShopsSearchPane, onFailure: shopsSearchFailure}).request();
}

function shopsClick(event) {
	if (event.target.value == shopsOriginalValue)
		event.target.value = '';
}

function shopsBlur(event) {
	if (event.target.value == '')
		event.target.value = shopsOriginalValue;
}

function searchInit() {
	brandsOriginalValue = $('brandInput').value;
	shopsOriginalValue = $('shopInput').value;
	$('brandInput').onkeydown = brandsKeydown.bindWithEvent($('brandInput'));
	$('brandInput').onkeyup = brandsKeyup.bindWithEvent($('brandInput'));
	$('brandInput').onclick = brandsClick.bindWithEvent($('brandInput'));
	$('brandInput').onblur = brandsBlur.bindWithEvent($('brandInput'));

	$('shopInput').onkeydown = shopsKeydown.bindWithEvent($('shopInput'));
	$('shopInput').onkeyup = shopsKeyup.bindWithEvent($('shopInput'));
	$('shopInput').onclick = shopsClick.bindWithEvent($('shopInput'));
	$('shopInput').onblur = shopsBlur.bindWithEvent($('shopInput'));
}

window.addEvent('domready', function(){
	searchInit();
});
