var QTAjaxSearch = new Class(
{
    version : "1.0", 
    options : {
    def_search_str : 'jo',
    bsearch : false,
    results : null, 
	close : null, 
	search : null, 
	noresults : null, 
        advsearch : null, 
	advsearchlink : null, 
	page : null, 
	page_of : null, 
	uribase : null, 
        limit : null, 
	perpage : null, 
	paheNumsLimit : 8, 
	keyevents : true, 
	hidedivs : null, 
        includelink : null, 
	viewall : null, 
	estimated : null, 
	showestimated : true, 
	AllowScrollEffect : false, 
	showpagination : true 
    },                             
    initialize : function (options) 
    {    
        this.setOptions(options);
        this.timer = null;
        this.rows = ["qtsearch_odd", "qtsearch_even"];
        this.inputBox = $("qtsearch_search_str").setProperty("autocomplete", "off"); 
        var pos = this.inputBox.getCoordinates();
        var left = pos.left + pos.width - $("qtsearch_results").getSize().size.x;
        if (left < 0) {
            left = pos.left;
        }
        
        this.results = $("qtsearch_results").setStyles({
            //** position : "absolute", top : pos.top + pos.height, left : left
        }).inject('qtajaxsearch-resultsWrapper');   //document.body
        this.fx = (new (Fx.Style)(this.results, "opacity")).set(0);
        this.current = 0;
        this.type = "";
        var perpage = this.options.perpage;
        var searchOpts = $$("#qtajaxsearch .search_options input[type=radio]");
        searchOpts.each(function (input) 
            {
                
                input.addEvent("click", function () 
                {
                    if(this.type != input.value){                    
                    $$("#qtajaxsearch .search_options input[type=radio]").each(function (input2){
                    	  input2.getParent('label').removeClass("selected");                   	
                    });   
                    this.type = input.value;
                    input.getParent('label').addClass("selected");
                    if(this.bsearch){
                    	this.inputBox.fireEvent('keyup',"go");                                                       
                    }
                    }
                }
                .bind(this));
            }, this);
           
        if(this.type == ''){
         searchOpts[0].fireEvent('click',searchOpts[0]);
        }
        this.addEvents();
        this.keyEvents();
        
        if(this.options.def_search_str != ''){
        this.inputBox.value = this.options.def_search_str;
        this.inputBox.fireEvent('keyup',"go"); 
        this.bsearch = true;
        }
    
    },
    addEvents : function () 
    {
        this.inputBox.addEvents(
        {
            click : function () 
            {           	
                if (this.inputBox.getValue() == this.options.search) {
                    this.inputBox.value = "";
                    
                }
            }
            .bind(this),
            blur : function () 
            {
                if (this.inputBox.getValue() == "") {
                    this.inputBox.value = this.options.search;
                }
            }
            .bind(this),
            keydown : function (e) 
            {            	
                e = new Event(e);
                $clear(this.timer);
                
                if (e.key == "enter") {
                    e.stop();
                }
            },
            keyup : function (ev) 
            {       
            	e = {};         
                if(ev != 'go'){
                 e = new Event(ev);               
                }                
                if ((ev != 'go') && (e.code == 0 || e.code == 17 || e.code == 18 || e.code == 224 || e.alt || e.control || e.meta)) {
                    return false;
                }
                if ((ev != 'go') && (e.alt || e.control || e.meta || e.key == "esc" || e.key == "up" || e.key == "down" || e.key == "left" || e.key == "right")) {
                    return true;
                }
                if (e.key == "enter") {
                    e.stop();
                }
                if (e.key == "enter" && this.selectedEl != - 1) 
                {
                    if (this.selectedEl || this.selectedEl == 0) {
                        location.href = this.els[this.selectedEl].getFirst("a");
                    }
                    return false;
                }
                $clear(this.timer);               
                var uri = this.options.uribase + "index.php";
                if (this.inputBox.value == "") 
                {
                    var splitDivs = this.options.hidedivs.split(" ");
                    this.results.empty().removeClass("qtsearch_results").setStyle("visibility", "hidden");
                    if (splitDivs.length > 0 && splitDivs != "") {
                        splitDivs.each(function (div) 
                        {
                            $(div).setStyle("visibility", "visible");
                        });
                    }
                }
                else 
                {
                        var request = new Ajax(uri, 
                        {
                            method : "get", 
			    delay : 200, 
			    data : 
                            {
				option : "com_qt_ajax_search", 
                                type : this.type, 
				keyword : this.inputBox.value, 
				data : 'html',
				r : $time()
                            },
                            onRequest : function () 
                            {
                                $('qtajaxsearch_closebox').setStyles({ display: 'none'});
                                this.inputBox.addClass("loading");
                            }
                            .bind(this),
                            onComplete : function (returns, b, c) 
                            {
                                $('qtajaxsearch_closebox').setStyles({ display: 'inline'});
                                var results = (new Element("div")).setHTML(returns);
                                var tmp = $("qtajaxsearch_tmp");
                                results.getChildren().each(function (div) 
                                {
                                    if (div.getProperty("class") == "qt_searh_results") 
                                    {
                                            tmp.setHTML(div.innerHTML);                                   
                                    }
                                });
                                this.results.empty().removeClass("qtsearch_results").setStyle("visibility", 
                                "visible");
                                this.selectedEl = - 1;
                                this.PContainer = null;
                                this.arrowDiv = null;
                                this.page = [];
                                this.current = 0;
                                this.els = [];
				this.outputTable();
                                tmp.empty().setStyle("visibility", "visible");
                                this.inputBox.removeClass("loading");
                                var pos = this.inputBox.getCoordinates();                                
                                //alert(documentpos);
                                var left = pos.left + pos.width - $("qtsearch_results").getSize().size.x + 3; //((document.body).getSize().size.x) - ($("qtsearch_results").getSize().size.x) - 200 ;
                                if (left < 0) {
                                    left = pos.left;
                                }
                                this.results.setStyles({
                                    //** top : pos.top + pos.height + 20, left : left
                                });
                                this.fx.start(1);
                                this.fireEvent("loaded");
                            }
                            .bind(this)
                        });
                        this.timer = request.request.delay(500, request);
                }
            }
            .bind(this)
        });
    },
    keyEvents : function () 
    {
        var bounds = 
        {
            keyup : function (e) 
            {
                e = new Event(e);
                if (e.key == "left" || e.key == "right" || e.key == "up" || e.key == "down" || e.key == "enter" || e.key == "esc") 
                {
                    e.stop();
                    if (e.key == "left" && this.arrowleft) {
                        this.arrowleft.fireEvent("click");
                    }
                    else if (e.key == "right" && this.arrowright) {
                        this.arrowright.fireEvent("click");
                    }
                    else if (e.key == "esc" && this.close) {
                        this.close.fireEvent("click", e);
                    }
                    else if (e.key == "down") 
                    {
                        var store = this.selectedEl;
                        if (this.selectedEl == - 1) {
                            this.selectedEl = this.options.perpage * this.current;
                        }
                        else if (this.selectedEl + 1 < this.els.length) {
                            this.selectedEl++;
                        }
                        else {
                            return;
                        }
                        if (store != - 1) {
                            this.els[store].fireEvent("mouseleave");
                        }
                        if ((this.selectedEl  / this.options.perpage).toInt() > this.current) {
                            this.arrowright.fireEvent("click", true);
                        }
                        if (this.selectedEl || this.selectedEl == 0) {
                            this.els[this.selectedEl].fireEvent("mouseenter");
                        }
                    }
                    else if (e.key == "up") 
                    {
                        var store = this.selectedEl;
                        if (this.selectedEl == - 1) {
                            this.selectedEl = this.options.perpage * this.current;
                        }
                        else if (this.selectedEl - 1 >= 0) {
                            this.selectedEl--;
                        }
                        else {
                            return;
                        }
                        if (store != - 1) {
                            this.els[store].fireEvent("mouseleave");
                        }
                        if ((this.selectedEl  / this.options.perpage).toInt() < this.current) {
                            this.arrowleft.fireEvent("click", true);
                        }
                        if (this.selectedEl || this.selectedEl == 0) {
                            this.els[this.selectedEl].fireEvent("mouseenter");
                        }
                    }
                    else if (e.key == "enter") 
                    {
                        if (this.selectedEl || this.selectedEl == 0) {
                            window.location = this.els[this.selectedEl].getElement("a");
                        }
                    }
                }
            }
            .bind(this)
        };
        if (this.options.keyevents) 
        {
            this.addEvent("loaded", function () 
            {
                document.addEvent("keyup", bounds.keyup);
            });
            this.addEvent("unloaded", function () 
            {
                document.removeEvent("keyup", bounds.keyup);
            });
        }
    },
    outputTable : function () 
    {
        var self = this;
        var wrapper1 = (new Element("div", {
            'class' : "qtsearch_wrapper1"
        })).inject(this.results);

        var wrapper2 = (new Element("div", {
            'class' : "qtsearch_wrapper2"
        })).inject(wrapper1);

        var wrapper3 = (new Element("div", {
            'class' : "qtsearch_wrapper3"
        })).inject(wrapper2);

        var wrapper4 = (new Element("div", {
            'class' : "qtsearch_wrapper4"
        })).inject(wrapper3);

        var header = (new Element("div", {
            'class' : "qtsearch_header png"
        })).setHTML("<br>").injectInside(wrapper4); //this.options.results

        this.close = (new Element("a", {
            id : "qtsearch_link", 'class' : "png"
        })).setProperty("href", "#").setHTML(this.options.close);//.injectBefore(header);
        
        var splitDivs = this.options.hidedivs.split(" ");
        
        $('qtajaxsearch_closebox').setStyles({ display: 'inline'});
        
        /*var overlay = (new Element("div", {
            class : "QT_overlayBG",id:"QT_overlay"
        })).injectInside(document.body); //this.options.results       
         */               
        
        $('qtajaxsearch_closebox').removeEvents('click').addEvent("click", function (e) 
        {   
            (new Event(e)).stop();
                      
            this.fireEvent("unloaded");            
            
            $('qtajaxsearch_closebox').setStyles({ display: 'none'});
            
            this.bsearch = false;
                                         
            //$('QT_overlay').setStyles({ display: 'none'});
            
            this.inputBox.value = this.options.search;
            
            var self = this;
            
            this.fx.start(0).chain(function () 
            {
                self.results.empty().removeClass("qtsearch_results");
            });
            
            if (splitDivs.length > 0 && splitDivs != "") {
                splitDivs.each(function (div) 
                {
                    $(div).setStyle("visibility", "visible");
                });
            } 
            //this.arrowDiv = null;
            //this.current = 0;
            //$('QT_overlay').remove();
            return false;
        }
        .bind(this));   
        if (splitDivs.length > 0 && splitDivs != "") {
            splitDivs.each(function (div) 
            {
                $(div).setStyle("visibility", "hidden");
            });
        }
        this.results.addClass("qtsearch_results");
        var searchedRestuls = $$("#qtajaxsearch_tmp .qt_s_result");
	
        if (searchedRestuls.length > 0) 
        {
            this.bsearch = true;	
            var container = (new Element("div", {
                'class' : "container-wrapper"
            })).inject(wrapper4);
            var scroller = (new Element("div", {
                'class' : "container-scroller"
            })).inject(container);
            searchedRestuls.each(function (res, i) 
            {
                var dataHtml = res.innerHTML;
                                var el = new Element("div", {
                                    'class' : this.rows[i % 2] + " png"
                                });
				el.innerHTML = dataHtml;
                                this.els.push(el);
                                el.addEvents(
                                {
                                    mouseenter : function () 
                                    {
                                        this.addClass(self.rows[i % 2] + "-hover");
                                        self.selectedEl = i;
                                    },
                                    mouseleave : function () 
                                    {
                                        this.removeClass(self.rows[i % 2] + "-hover");
                                        if (self.selectedEl == i) {
                                            self.selectedEl = - 1;
                                        }
                                    }
                                });
                                var innerWrapper1 = (new Element("div", {
                                    'class' : "qtsearch_result_wrapper1 png"
                                })).inject(scroller);
                                var innerWrapper2 = (new Element("div", {
                                    'class' : "qtsearch_result_wrapper2 png"
                                })).inject(innerWrapper1);
                                var innerWrapper3 = (new Element("div", {
                                    'class' : "qtsearch_result_wrapper3 png"
                                })).inject(innerWrapper2);
                                var innerWrapper4 = (new Element("div", {
                                    'class' : "qtsearch_result_wrapper4 png"
                                })).inject(innerWrapper3);
                                el.inject(innerWrapper4);                        
                                 
            }, this);
            var splitting = scroller.getChildren();
            var max = Math.max(this.options.perpage, splitting.length);
            var min = this.options.perpage;//Math.min(this.options.perpage, splitting.length);
            var perpage = this.options.perpage;
            this.pages = 0;
            this.page = [];
            Math.abs(max  / min).times(function (i) 
            {
                if (splitting[i]) 
                {
                    this.page.push((new Element("div", {
                        'class' : "page "+((this.options.AllowScrollEffect) ? "" : "inactive" )+" page-" + i
                    })).inject(scroller).setStyle("width", scroller.getStyle("width")));
                    this.pages++;
                }
                for (j = 0, l = perpage; j < l; j++) {
                    if (splitting[i * perpage + j]) {
                        splitting[i * perpage + j].inject(this.page[i]);
                    }
                }
            }
            .bind(this));
            this.page[0].removeClass('inactive'); 
            //** scroller.setStyle("width", container.getStyle("width").toInt() * Math.round(max  / min) + 1000);
        }
        if (!searchedRestuls.length) 
        {
            var el = new Element("div", {
                'class' : this.rows[0]
            });
            var name = (new Element("h3")).setHTML(this.options.noresults).injectInside(el);
            var lnk = (new Element("a")).setProperty("href", this.options.advsearchlink).injectAfter(name);
            var name = (new Element("span")).setHTML(this.options.advsearch).injectInside(lnk);
            el.inject(wrapper4);
        }
        else 
        {
                  	
                var limit = $$("#qtajaxsearch input[name=limit]")[0];
                this.bottombar = new Element("div", {
                    'class' : "qtsearch_row_btm png"
                });
                /*
                var lnk2 = (new Element("a")).setProperty("href", "#").injectInside(this.bottombar);
                var name = (new Element("span")).setHTML(this.options.viewall).injectInside(lnk2);
                lnk2.addEvent("click", function (e) 
                {
                    (new Event(e)).stop();
                    limit.value = "";
                    var serch_q = $("qtsearch_search_str").value;
                    switch(this.type){
                    case 'event':
                    	(new Element("input",{type: 'hidden',name: 'areas[]',value:'elevents'})).injectInside($('qtajaxsearch'));
                    	(new Element("input",{type: 'hidden',name: 'areas[]',value:'elvenues'})).injectInside($('qtajaxsearch'));
                    	(new Element("input",{type: 'hidden',name: 'areas[]',value:'elcategories'})).injectInside($('qtajaxsearch'));
                    break;
                    case 'user':
                     location.href =  this.options.uribase+'index.php?option=com_community&view=search&q='+serch_q;
                     return false;
                   break;
                    case 'content':
                    	(new Element("input",{type: 'hidden',name: 'areas[]',value:'content'})).injectInside($('qtajaxsearch'));
                    break;
                    case 'blog':
                    	location.href = this.options.uribase+'index.php?option=com_myblog&task=search&Itemid=9999&keyword='+serch_q;
                    	return false;
                    break;
                    case 'faq':
                    	(new Element("input",{type: 'hidden',name: 'areas[]',value:'quickfaq'})).injectInside($('qtajaxsearch'));
                    break;
                    case 'sobi2':
                    	location.href = this.options.uribase+'index.php?option=com_sobi2&sobi2Task=search&sobi2Search='+serch_q;
                    return false;
                    break;
                    }                                  
                    $("qtajaxsearch").submit();                                      
                }.bind(this));
                */
                this.bottombar.inject(wrapper4);
                
                if(this.pages > 1){                
		this.pagingInit(container);                                                       
                }			
	    
        }
    },
    pagingInit: function (container){
        
       this.PContainer = container;
         
       //alert(this.arrowDiv)
       if($defined(this.arrowDiv) && this.arrowDiv){
        var arrowDiv = this.arrowDiv;
        arrowDiv.setHTML("");
       }else{             
              
       var arrowDiv = (new Element("div", {
         'class' : "container-arrows"
       })).inject(this.bottombar, "top");      
       //alert(this.arrowDiv)
                  
        this.arrowDiv = arrowDiv;           
        }  
                    
        var pagesData = new Array;
        var pagesNums = this.pages; 
        var showAll = false; 
         if(this.options.paheNumsLimit + 3 >= pagesNums){
          this.options.paheNumsLimit = pagesNums;
          var showAll = true;
        }
      
        this.CurrP = this.current + 1; 
        this.FirstP = 1;
        this.LastP = pagesNums;
        this.PrevP = this.current;
        this.NextP = this.current + 2;
        var StartFor = (pagesNums <= this.options.paheNumsLimit) ? 1 : this.CurrP;
        var LimitFor = this.CurrP + this.options.paheNumsLimit;
        var EndFor = pagesNums;
        if(this.LastP - this.CurrP + 1 <= this.options.paheNumsLimit && showAll == false){        
        StartFor = this.LastP - this.options.paheNumsLimit + 1;        
        EndFor = this.LastP;
        LimitFor = this.LastP + 1;
        pagesNums = this.LastP - this.CurrP + 1;
       }
         
        (new Element("div", {
             'class' : (this.CurrP == 1 ? "arrow-left-disabled" : "arrow-left" ),
             id: "page-go-" + this.PrevP
         })).inject(arrowDiv).addEvent("click", function () 
                {
                	if(this.CurrP != this.PrevP){
			this.pageCh(this.PrevP - 1);
                }
		}
         .bind(this));
              

        var i = 0;
            if(this.options.showpagination){         
                for (j = StartFor; j <= EndFor;j++) {
                    if (j < LimitFor) {
                        pagesData[i++] = j;
                    }
                   continue; 
                }
            }
            
            if(pagesNums > pagesData.length){
            pagesData[i++] = '';
            pagesData[i++] = pagesNums-1;
            pagesData[i++] = pagesNums;
            }
            
           pagesData.each(function (pn){
             (new Element("div", {
                        'class' : (this.CurrP == pn || pn == '' ? "page-nv-disabled" : "page-nv" ),
                        id: "page-go-"+pn
                    })).setHTML(pn).inject(arrowDiv).addEvent("click", function () 
                	{
                	
                	if(this.CurrP != pn){
                	//alert(pn)              	
 			this.pageCh(pn-1);
               	}
			}
                	.bind(this)); 
           }.bind(this));   
         
       (new Element("div", {
            'class' : (pagesNums == this.CurrP ? "arrow-right-disabled" : "arrow-right" ),
            id: "page-go-" + this.NextP
          })).inject(arrowDiv).addEvent("click", function () 
                {
                	if(this.CurrP != this.NextP){
			this.pageCh(this.NextP - 1);				                               	
                }
		}
         .bind(this));
        if(!this.scroller){
        this.scroller = new (Fx.Scroll)(container, {
            wait : false
        });       
        }  
                      
    },
    refreshPaging: function(){     
     this.pagingInit(this.PContainer);
    },
    pageCh: function(pageN){    
    if(pageN != this.current && $defined(this.page[pageN])){
     //alert('p-'+pageN+'c'+this.current)
     var CurrCach = this.current
     this.current = pageN;
     this.refreshPaging();
     
     
     if(this.options.AllowScrollEffect){
      this.scroller.toElement(this.page[pageN]);
     }else{
     this.page[pageN].removeClass('inactive');       
     this.page[CurrCach].addClass('inactive');        
     
     }
     
      
         
     //alert(this.page[pageN].hasClass('page')) 
     }
    }                                         
});

QTAjaxSearch.implement(new Options, new Events);

