
/*  
    Wyszukiwarka miejscowosci.
    Klasa miejscSercher.
    
    Wymaga:
    - input text
    - input hidden for address_city_id
    - div items list
    
    @przygotowal eskaj
*/


    function miejscSercher(inputPartId, inputProvId, outputCityId, outputTerytId, outputDivListId, outputDivViewChoisenId)
    {
        this.inputPartId = inputPartId ? inputPartId : null;
        this.outputCityId = outputCityId ? outputCityId : null;
        this.outputDivViewChoisenId = outputDivViewChoisenId ? outputDivViewChoisenId : null;
        this.outputTerytId = outputTerytId ? outputTerytId : null;
        this.inputProvId = inputProvId ? inputProvId : null;
        this.outputDivListId = outputDivListId ? outputDivListId : null;
    	
        this.jsonUrl = ajaxUrl + 'ajax/get_miejscowosci';
        this.limit = 0;
        
        this.flagEmptyList = $('#'+this.outputDivListId).html()?false:true;
        
        this.timeoutObjShow = null;
        this.timeoutObjHide = null;
        this.timeoutObjChange = null;
        this.showDuration = 2000;
        this.showLock = false;
        this.listVisible = false;
        this.actualData = false;
        this.outputListLocation = 'right';
        /* funkcje wywołane po wyborze miasta */
        this.onClickFunction = null;
    }
    
    miejscSercher.prototype.setLimit = function(limit)
    {
        this.limit=limit;
    }
    
    miejscSercher.prototype.outputDivListPrepare = function()
    {
        var thiss = this;
        
        // przygotowanie pozycji i stylow listy wynikow
        //dlugoscInputa = $('#'+this.inputPartId).css('width');
        dlugoscInputa = $('#'+this.inputPartId).width();
        dlugoscInputa = parseInt(dlugoscInputa);
        //wysokoscInputa = $('#'+this.inputPartId).css('height');
        wysokoscInputa = $('#'+this.inputPartId).height();
        wysokoscInputa = parseInt(wysokoscInputa) + parseInt($('#'+this.inputPartId).css('padding-top')) +  + parseInt($('#'+this.inputPartId).css('padding-bottom'));

        pos = $('#'+this.inputPartId).offset();
        $('#'+this.outputDivListId).css('display','none');
        $('#'+this.outputDivListId).css('position','absolute');
        $('#'+this.outputDivListId).css('overflow','auto');
        
        if(this.outputListLocation =='right')
        {
        	$('#'+this.outputDivListId).css('top',String(pos.top)+'px');
        	$('#'+this.outputDivListId).css('left',String(pos.left+dlugoscInputa+4)+'px');
        }
        if(this.outputListLocation =='bottom')
        {
//        	$('#'+this.outputDivListId).css('top',String(pos.top+wysokoscInputa+3)+'px');
//        	$('#'+this.outputDivListId).css('left',String(pos.left)+'px');
//        	$('#'+this.outputDivListId).css('margin-left','10px');
        	$('#'+this.outputDivListId).css('margin-top',(wysokoscInputa+4) + 'px');
        }

    }

    miejscSercher.prototype.setDivListToBottom = function()
    {
        var thiss = this;
        this.outputListLocation = 'bottom';
    }
	miejscSercher.prototype.setDivListToRight = function()
    {
        var thiss = this;
        this.outputListLocation = 'right';
    }


    miejscSercher.prototype.init = function(objName, fullTeryt, loadDataOnClick, showPowiatTxt)
    {
        this.fullTeryt = fullTeryt?true:false;
        this.objName = objName;
        this.showPowiatTxt = showPowiatTxt;
        this.loadDataOnClick = loadDataOnClick;
        var thiss = this;
        //Inicjalizacja domyślnej listy miejscowosci
//        if(!$('#'+thiss.outputDivListId).html()) this.updateList();
        
        //thiss.outputDivListPrepare();
        
        // keyup event
        $('#'+thiss.inputPartId).keyup(function(e){
	        
	        var CaretPos = 0;	// IE Support
			if (document.selection) {
//				this.focus();
				var Sel = document.selection.createRange();
				Sel.moveStart ('character', -this.value.length);
				CaretPos = Sel.text.length;
			}
			// Firefox support
			else if (this.selectionStart || this.selectionStart == '0')
				CaretPos = this.selectionStart;
			var before = (CaretPos <= this.value.indexOf(',') ? 1 : 0);
//			$('#cityView').html(this.value + ' ' + CaretPos + ' => ' + before);
			if (!before && this.value.indexOf(',') > -1) {
				$('#'+thiss.outputDivListId).html('<span class="silverfont">Wpisz nazwę dzielnicy lub ulicę</span>');
                thiss.showList();

				return;
			}
			
//console.log(CaretPos);
            thiss.actualData = false;
            thiss.resetOutputFields();
            // pokazanie listy po chwili
            if(thiss.timeoutObjShow) clearTimeout(thiss.timeoutObjShow);
            thiss.timeoutObjShow = setTimeout(function(){ 
                thiss.updateList(true);
                
            }, '400');
            
        });
        $('#'+thiss.inputPartId).click(function(){
	        if (this.firstClicked) {
		        if (this.value.indexOf(',') > -1) {
			        $('#'+thiss.outputDivListId).html('<span class="silverfont">Wpisz oddzielone średnikami nazwy dzielnic lub ulic</span>');
			        thiss.showList();
	        	}
	        	return;
        	}
	        $(this).val('');
	        $(this).addClass('act');
	        this.firstClicked = true;
        });
 /*       
        // click event
        $('#'+thiss.inputPartId).click(function(){
            
            if(thiss.listVisible) 
            {
                thiss.hideList();
                return;
            }
            
            if(thiss.loadDataOnClick)
            {
                // pokazanie listy po chwili
                if(thiss.timeoutObjShow) clearTimeout(thiss.timeoutObjShow);
                    thiss.updateList(true);
                /*
                thiss.timeoutObjShow = setTimeout(function(){ 
                    thiss.updateList(true);
                }, '50');
                * /
            }
            else
                thiss.showList();         
        })
   */     
        // inputPart get focus event
        $('#'+thiss.inputPartId).focus(function(){
                thiss.clearTimeout();
                thiss.showLock = true;
        });
        
        // inputPart lost fous event
        $('#'+thiss.inputPartId).blur(function(){
                thiss.hideList();
                thiss.showLock = false;
        });
        
    }
    
    miejscSercher.prototype.clearTimeout = function()
    {
        var thiss = this;
        if(thiss.timeoutObjHide) clearTimeout(thiss.timeoutObjHide);
    }
    
    miejscSercher.prototype.setTimeout = function(timeout)
    {
        var thiss = this;
        to = timeout>0?timeout:thiss.showDuration;
        thiss.timeoutObjHide = setTimeout(function(){thiss.hideList();}, to);
    }
    
    miejscSercher.prototype.showList = function(timeout)
    {
        var thiss = this;
        thiss.outputDivListPrepare();
        
        if(!thiss.flagEmptyList)
        {
            // ustawienie czasu zycia listy
            if(thiss.timeoutObjHide) clearTimeout(thiss.timeoutObjHide);
            
            to = timeout>0?timeout:thiss.showDuration;
            
            if(!thiss.showLock)
                if(!(timeout < 0)) 
                    if(to) 
                        thiss.setTimeout(to);
            if (!thiss.listVisible)
            	$('#'+thiss.outputDivListId).fadeIn('fast');
            else
            	$('#'+thiss.outputDivListId).show();
            thiss.listVisible = true;
        }
    }
    
    miejscSercher.prototype.select  = function(txt, txtView, acId, terId, provId) 
    {
        var thiss = this;
        if(!acId) acId = '';
        $('#'+thiss.outputCityId).val(acId);
        $('#'+thiss.outputTerytId).val(terId);
        if($('#'+thiss.inputPartId).val() != txt) thiss.actualData = false;
        var old = $('#'+thiss.inputPartId).val();
        var newval = txt;
        if (old.indexOf(',') > -1)
	        newval = txt + old.substring(old.indexOf(','));
        else 
        	newval = txt + ',';
        $('#'+thiss.inputPartId).val(newval);
        $('#'+thiss.outputDivViewChoisenId).html(txtView);
//        $('#'+thiss.inputProvId).selectOptions(String(provId));
        thiss.hideList();
        thiss.runEventChangeOnOutputFields();
        if(thiss.onClickFunction != null){
            eval(thiss.onClickFunction);
        }
        
    }
    
    miejscSercher.prototype.runEventChangeOnOutputFields = function()
    {
        var thiss = this;
        // czyszczenie po chwili
        if(thiss.timeoutObjChange) clearTimeout(thiss.timeoutObjChange);
        thiss.timeoutObjChange = setTimeout(function(){ 
            $('#'+thiss.outputTerytId).change();
            $('#'+thiss.outputCityId).change();
        }, '800');
        
        
    }
    
    
    miejscSercher.prototype.hideList  = function() 
    {
        var thiss = this;
        this.listVisible = false;
        $('#'+thiss.outputDivListId).fadeOut('fast');
    }
    
    miejscSercher.prototype.resetOutputFields = function() 
    {
        var thiss = this;
        $('#'+thiss.outputTerytId).val('');
        $('#'+thiss.outputCityId).val('');
       // $('#'+thiss.outputDivViewChoisenId).html('?'); //chwilowo zakomentowany znak zapytania, bo pączek stwierdził że tak jest lepiej
        thiss.runEventChangeOnOutputFields();
    }
    
    miejscSercher.prototype.reset = function() 
    {
        var thiss = this;
        
        thiss.resetOutputFields();
        thiss.hideList();
        $('#'+thiss.inputPartId).val('');
        $('#'+thiss.outputDivListId).html('');
        
        //thiss.updateList();
    }
    
    miejscSercher.prototype.updateList = function(show)
    {
        var thiss = this;
        var miejscPart = $('#'+thiss.inputPartId).val();
        if (miejscPart.indexOf(',') > -1)
        	miejscPart = miejscPart.substring(0, miejscPart.indexOf(','));
        
		if(this.actualData) 
		{
			thiss.showList();
			return;
		}

        
        $.ajax({
			url: thiss.jsonUrl,
			type: 'GET',
            data: "city="+encodeURI(miejscPart)+($('#'+thiss.inputProvId).val()?'&provinceId='+$('#'+thiss.inputProvId).val():'')+(thiss.fullTeryt?'&full=1':'')+(this.limit>0?'&limit='+this.limit:''),
			success: function(result) {
//				result = eval(result);
//				console.dir(result);
//				if(result.length>3)
  //              {
					var resultInsert = '';
	            	Data = json_parse(result);
					for(J = 0 ; J < Data.length ; J++){						
						resultInsert += 
                        '<div onclick="'+thiss.objName+'.select(\''+Data[J].nazwa+'\',\''+'('+Data[J].rodzaj+', '+Data[J].wojewodztwo+(thiss.showPowiatTxt?', '+Data[J].powiat:'')+')\','+Data[J].address_city_id+','+Data[J].teryt_miejscowosc_id+','+Data[J].address_province_id+');" class="searchRolldownItem" onmouseover="'+thiss.objName+'.clearTimeout();" >'+Data[J].nazwa+' <span class="silverfont">('+Data[J].rodzaj+', '+Data[J].wojewodztwo+(thiss.showPowiatTxt?', '+Data[J].powiat:'')+')</span></div>';
					}
                    
                    if(!resultInsert) thiss.flagEmptyList = true;
                    else
                    { 
                    	thiss.flagEmptyList = false;
                    	thiss.actualData = true;
                    }
					$('#'+thiss.outputDivListId).html(resultInsert);
                    if(show) thiss.showList();
	//			}
			}
		});
    
    }
