/**
* Site BaseSearch
*
* @author Szijártó Tamás ( szicsu )
* @email  szicsu@jquery.hu
**/

if ( typeof Site != 'object'){
    var Site = {};
}


Site.BaseSearch = function( that ){
	var self = that;
	var oHistory = {};
	
	/**
	* initForm funkcio
	* a formra bindeli a megfelelo eventet
	**/
	this.initForm = function( formObj ){
		formObj = formObj || self.getActiveForm();
                if( formObj.hasClass('inited') ){
                    return true;
                }
		
		formObj.bind('searchSend', function(){
			self.sendSearch();
		});
                formObj.addClass('inited');
		formObj = null;
        } 
	
	/**
	* initInputs funkcio
	* a megfeleo $(':input') -okra bindeli az eventet  
	**/
	this.initInputs = function( formObj ){
		formObj = formObj || self.getActiveForm();
		formObj
            .find('input:text')
                .bind('blur', self.inputEvent )
            .end()
            .find('select:not(.noSearch)')
                .bind('change', self.inputEvent )
            .end()
            .find('input:checkbox')
                .bind('click', self.inputEvent )
            .end()
            .find('input:radio')
                .bind('click', self.inputEvent )
            ;
		formObj = null;	
	}
	
	this.inputEvent = function( eventObj ){
		if( self.initedHistory() && $(this).is('select.jsFilter') ){
			self.addHistory( $(this).attr('name') );
		}

		$(eventObj.target).parents('form').trigger('searchSend');
		eventObj = null;
		
	}
	
	
   
    
	/**
	* getCookie funkcio
	* lekerdezi a beallitott cookikat
	**/
    this.getCookie = function(){
        
		try{
            // return $.evalJSON( $.cookie( this.cookieName ) );
			return false;
        }
        catch( e ){
			return false;
		}	
    }
	
	/**
	* setCookie funkcio
	* beallitja a cookikat
	**/
	this.setCookie = function( value ){
        $.cookie( this.cookieName, value, {path: '/' });
    }
	
	/**
	*  getSearchData funnkcio
	*  a formObjból kiszedi a küldendQ infókat	
	**/
	this.getSearchData = function( formObj ){

		var data = {};
		formObj = formObj || self.getActiveForm();
		formObj = formObj.find(':input').filter(':not(.noSearch)');
        formObj.each(function(){
            field = $(this);

            switch( field.attr('type') ){

                case 'radio':
                case 'checkbox':
					
					if( field.attr('checked') == true ){
						data[ field.attr('name') ] = $.trim( field.val() );
					}
                break;

                default:
					if( $.trim( field.val() ) ){
						data[ field.attr('name') ] = $.trim( field.val() );
					}		
                break;
            }
			
			
        });
		formObj = null ;
        return data;
    }
	
	
	/**
	*  setSearchData funnkcio
	* visszarakja a formba az adatokat
	**/
	this.setSearchData = function( data, formObj, restoredData ){

        formObj = formObj || self.getActiveForm();
        formObj.find(':input').each(function(){

            itemName = this.name;

            if( data[itemName] && !self.hasHistory( itemName ) ){
                if( typeof data[itemName] == 'object' ){
					
		    if( typeof restoredData == 'object' ){
			restoreItem = restoredData[ itemName ];
		    }
		    else{
			restoreItem = false;
		    }
                    Site.Component.Select.newOptions( $(this) ,  data[itemName], restoreItem );
                }
                else{

                    switch ( $(this).attr('type') ) {
                        case 'radio' :
			case 'checkbox':
                                if ( $(this).val() == data[itemName] )  {
                                    $(this).attr('checked' , 'checked');
                                }
                        break;
                        default:
                            $(this).val(  data[itemName] );
                        break;
                    }
                }
            }
        });
		
		formObj = null;
    }
	
	
	/**
	* get funkcio
	* ajax kérés indit
	**/
	this.get = function( rUrl, postData ,callBack){
		
	        self.actRequest = $.ajax({
	            url: rUrl,
	            type: "POST",
				cache: false,
				data: postData,
				async: true,
	            dataType: "json",
	            success: function( data ){
					if( typeof callBack == 'function' ){
						callBack( data );
					}
	            }
	           
	        });
		
		return false;
    }
	
	
	/**
	* sendSearch function
	* a kérést indítja
	**/
	this.sendSearch = function( searchData, formObj ){
	    formObj = formObj || self.getActiveForm();
		searchData = searchData || self.getSearchData( formObj );
		self.lockForm( formObj );		
	
		self.get( 
			self.getSearchActionUrl(), 
			searchData , 
			function( retData ){ 
				self.setSearchData( retData, formObj, searchData );
				self.unLockForm( formObj );
			}
		);
    }
	
	/**
	* lockForm function
	* lockolj az adott formot
	**/
	this.lockForm = function( formObj ){
        formObj = formObj || self.getActiveForm();
        formObj.find(':input').attr('readOnly','readOnly');
		formObj = null;
		return;
    }

	/**
	* unLockForm function
	* unlockolj az adott formot
	**/
    this.unLockForm = function( formObj ){
        formObj = formObj || self.getActiveForm();
        formObj.find(':input').removeAttr( 'readOnly' );
		formObj = null;		
		return;
    }

	/**
	* backupForm funkcio
	* visszaadja formadatait 
	**/
	this.backupForm = function( formObj ){
        formObj = formObj || self.getActiveForm();
		return {
            id: formObj.attr('id'),
            data: self.getSearchData( formObj )
        };
    }
	
	
	/** HISTORY **/
	
	this.addHistory = function( sName ){

		if( ( i = $.inArray( sName, self.getHistory() ) ) == -1 ){
			oHistory[self.getActiveForm().attr('id')].push( sName );
		}
		else{
			self.resetSelectByNames( self.getHistory().slice( i+1, self.getHistory().length ) );
			self.setHistory( self.getHistory().slice( 0, i+1) );
		}
		
	}
	
	this.getHistory = function(){
		
		return oHistory[self.getActiveForm().attr('id')];
	}
	
	this.setHistory = function( aData ){
		oHistory[self.getActiveForm().attr('id')]=aData; 
	}

	this.resetHistory = function(){
		
		return self.setHistory([]);
	}
	
	this.hasHistory = function( sName ){
		return  $.inArray( sName, self.getHistory() ) != -1;
	}
	
	this.initedHistory = function(){
		
		var sId = self.getActiveForm().attr('id');
		
		if( !(sId in oHistory) ){
			oHistory[sId]=[];
			return true;
		}
		return true;
	}
	
	this.resetSelectByNames = function( aName ){
		$.each(aName, function(){
			$("select[name='"+this+"']", self.getActiveForm()).val('');
		});
	}
	
	
 
}