﻿var searchBarForm = new Class({
	options: {
		searchButtonID: 'search-submit'
	},
	initialize: function(search, ele, url, options){
		if (!ele){
			return;
		}
		this.setOptions(options);
		this.search = search;
		this.form = ele;
		this.actionURL = url;
		var searchButtonEle = ele.getElementById(this.options.searchButtonID);
		this.searchButtonEle = searchButtonEle;

		searchButtonEle.addEvent('click', function(e){
				new Event(e).stop();
				this.UserClickSubmit();
		}.bind(this));
	},

	UserClickSubmit: function(){
		var requestStr = this.form.toQueryString();
		this.search.newSearch(requestStr);
	}
});
searchBarForm.implement(new Options, new Events);

var searchResultTable = new Class({
	options: {
		
	},
	initialize: function(search, ele, options){
		if (!ele){
			return;
		}
		this.setOptions(options);
		this.search = search;
		this.table = ele;
	},

	fillTable: function(data){
	    
		var head_tds = this.table.getElements('thead td');
        var table_body = this.table.getElement('tbody');
        table_body.empty();
        if(!data)
	    {
	     return ;
	    }
        var records = data.records;
        for(var i=0; i<records.length; i++){
            var record = records[i];
            var tr = new Element('tr',{
                'class': i % 2 == 1 ? 'odd' : 'even',
                'styles':{'cursor':'pointer'},
                'events':{
                    'mouseover': this.onRowMouseOver.bind(this),
                    'mouseout': this.onRowMouseOut.bind(this),
                    'click': this.onRowClick.bind(this)
                }
            }).inject(table_body);
            var isrushorder = false;
            for(var j=0; j<head_tds.length; j++){
                var headname = head_tds[j].get('name');
                var align =  head_tds[j].get('align');
                if(headname != 'CreatedDate' && headname != 'DeputyWineryCountryFlag')
                {
                        var td = new Element('td',{
						'html': record[headname]
					    });
                }
                /********************************Only for UTC time to local time *************/
				else if(headname == 'CreatedDate')													
				{
					var oldTime =  record[headname];
					var oldDate = new Date(oldTime);
					var newDate = new Date(oldTime);
					newDate.setHours((oldDate.getHours() - newDate.getTimezoneOffset()/60),oldDate.getMinutes(),oldDate.getSeconds() ,oldDate.getMilliseconds());
					var newDateString = newDate.toDateString();
					var arry = newDateString.split(' ');
					var stringDate = arry[1]+' '+ arry[2]+', '+arry[3];
					if(Math.ceil(arry[3])>=9999)
					{
					    stringDate = "/";
					}
					var td = new Element('td',{
						'html': stringDate
					});
					
				}
				else if(headname == 'DeputyWineryCountryFlag')													
				{
					var td = new Element('td',{
						'html': ''
					});
					var img = new Element('img',{
						'src': record[headname]
					});
					img.inject(td);
				}
				if(headname == 'IsAllowRushOrder' && !isrushorder)
				{
						isrushorder = true;
						if(record[headname] == "false")
						{
							$('isAllowRushOrder').setStyle("display","none");
							$('rushordersearchlable').setStyle("display","none");
							$('rushordersearchselect').setStyle("display","none");
							continue;
						}
						else if(record["rushorderstatus"] == "allowall" || record["rushorderstatus"] == "allownone")
						{
							$('rushordersearchlable').setStyle("display","none");
							$('rushordersearchselect').setStyle("display","none");
						}
				}
                td.set('align',align);
                td.inject(tr);
            }
        }
	},
	onRowMouseOver: function(evt){
	    if(evt.target && $chk(evt.target.cellIndex) && !evt.target.get("hastip")){
	        evt.target.set("title",evt.target.get("text"));//tips
	        evt.target.set("hastip",true);
	    }
	    if(typeof(evt.target.getParent) != "undefined"){
	        var target = evt.target.getParent();
	            target.addClass('over');
	    }
	},
	
	onRowMouseOut: function(evt){
	    if(typeof(evt.target.getParent) != "undefined"){
	        var target = evt.target.getParent();
	         
	         target.removeClass('over');
	    }
	},
	
	onRowClick: function(evt){
        //this.search.fireEvent('clickRow',evt.target);
         if(typeof(evt.target.getParent) == "undefined"){
            return ;
         }
        var newPage = evt.target.parentNode.getElement('a');
        
        if(newPage&&newPage != "" && this.options.clickRedirect == true)
        {   
            window.location.href = newPage;
        }
	}
});
searchResultTable.implement(new Options, new Events);

var searchSorterItem = new Class({
	options: {
		
	},
	initialize: function(searchSorter, ele, options){
		if (!ele){
			return;
		}
		this.setOptions(options);
		this.searchSorter = searchSorter;
		this.sorterItem = ele;
		this.InitializeEvents();
	},

	InitializeEvents: function(){
	    this.sorterItem.removeEvents('click');
	    this.sorterItem.removeEvents('mouseover');
	    this.sorterItem.removeEvents('mouseout');
        this.sorterItem.addEvent('click', this.onRowHeadClick.bind(this));
        this.sorterItem.addEvent('mouseover', this.onRowHeadMouseOver.bind(this));
        this.sorterItem.addEvent('mouseout', this.onRowHeadMouseOut.bind(this));
	},
	
	
	onRowHeadMouseOver: function(evt){	
	    var table_body = this.searchSorter.search.searchResultTableEle.getElement('tbody');
	    for(var i=0; i < table_body.childNodes.length; i++){
	        try
	        {
	            table_body.childNodes[i].childNodes[this.sorterItem.cellIndex].setStyle('background-color','#cee2ff');
	        }
	        catch(e)
	        {}
	    }
	    this.sorterItem.addClass("theadStyleOver");
	},
	
	onRowHeadMouseOut: function(evt){	
	     var table_body = this.searchSorter.search.searchResultTableEle.getElement('tbody');
	     for(var i=0; i < table_body.childNodes.length; i++){
	        try
	        { 
	           table_body.childNodes[i].childNodes[this.sorterItem.cellIndex].setStyle('background-color','');
	        }
	        catch(e)
	        {}
	     }
	     this.sorterItem.removeClass("theadStyleOver");
	},
	
	
	onRowHeadClick: function(evt){	
	     var arrow = this.searchSorter.arrow;
	     if(this.searchSorter.clickColumnNum == -1){
	        var arrow = new Element('div');
	        arrow.className="";
	        arrow.addClass("uparrow");
	        arrow.inject(this.sorterItem.getChildren()[0],'before');
	        this.searchSorter.arrow = arrow;
	     }else if(this.searchSorter.clickColumnNum != this.sorterItem.cellIndex){
	        arrow.parentNode.removeChild(arrow);
	        arrow.className="";
	        arrow.addClass("uparrow");
	        arrow.inject(this.sorterItem.getChildren()[0],'before');
	     }else if(this.searchSorter.clickColumnNum == this.sorterItem.cellIndex){
	        this.switchClass(arrow,"uparrow","downarrow");
	     }
	     
	     this.searchSorter.clickColumnNum = this.sorterItem.cellIndex;
	     var order = this.searchSorter.ascending ? "asc" : "desc";
	     this.searchSorter.ascending = this.searchSorter.ascending ? false : true;
	     var newQueryStr = this.searchSorter.search.searchBarForm.form.toQueryString();
	     newQueryStr = newQueryStr+"&OrderField="+this.sorterItem.id+"&order="+order;
	     this.searchSorter.search.sortTable(newQueryStr);
	},
	
	switchClass:function(o,cls1,cls2){
	    var tempCls = o.className;
	    o.className = "";
	    tempCls == cls1 ? o.addClass(cls2) : o.addClass(cls1);
	}
});
searchSorterItem.implement(new Options, new Events);

var searchSorter = new Class({
	options: {
		
	},
	initialize: function(search, ele, options){
		if (!ele){
			return;
		}

		this.setOptions(options);
		this.search = search;
		this.sorter = ele;
		this.sortBy = "";
		this.ascending = true;//descending
		this.arrow = null;//arrow div
		this.clickColumnNum = -1;//clicked table column
		this.fillSorter();
	},

	fillSorter: function(data){
		var head_tds = this.sorter.getElements('td');
        for(var j = 0; j < head_tds.length; j++){
            new searchSorterItem(this, head_tds[j]);
        }
	}
});
searchSorter.implement(new Options, new Events);

var searchNavigation = new Class({
	options: {
		
	},
	initialize: function(search, ele, options){
		if (!ele){
			return;
		}

		this.setOptions(options);
		this.search = search;
		this.navigation = ele;
		this.initializeEvents();
		this.initializeValues();
		this.SetNavigationInfor();
		//this.HideNavigation();
	},

	initializeEvents: function(){
		this.numPerPageSelection = this.navigation.getElement('select');
		this.pageFirstEle = this.navigation.getElement('.pFirst');
		this.pagePrevEle = this.navigation.getElement('.pPrev');
		this.pageNextEle = this.navigation.getElement('.pNext');
		this.pageLastEle = this.navigation.getElement('.pLast');
		this.pageReloadEle = this.navigation.getElement('.pReload');
		var pageCtrlContainer = this.navigation .getElement('.pcontrol');
		this.currentPageEle = pageCtrlContainer.getElement('input');
		this.totalPageEle = pageCtrlContainer.getElement('span');
		this.PageStatusEle = this.navigation.getElement('.pPageStat');
		
		this.RemoveEventsForButtons();

		this.numPerPageSelection.addEvent('change', function(e){
				new Event(e).stop();
				this.PageReload();
		}.bind(this));

		this.pageFirstEle.addEvent('click', function(e){
				new Event(e).stop();
				this.PageFirst();
		}.bind(this));
		this.pagePrevEle.addEvent('click', function(e){
				new Event(e).stop();
				this.PagePrev();
		}.bind(this));
		this.pageNextEle.addEvent('click', function(e){
				new Event(e).stop();
				this.PageNext();
		}.bind(this));
		this.pageLastEle.addEvent('click', function(e){
				new Event(e).stop();
				this.PageLast();
		}.bind(this));
		this.pageReloadEle.addEvent('click', function(e){
				new Event(e).stop();
				this.PageReload();
		}.bind(this));

		this.currentPageEle.addEvent('keydown', function(e){
			if(e.code==13)
			{
				new Event(e).stop();
				this.PageReload();
			}
		}.bind(this));

	},

	initializeValues: function(){
		this.numPerPage = (this.numPerPageSelection.getSelected())[0].get('value');
		this.currentPage = 1;
		this.displayItemFrom = 0;
		this.totalPage = 1;
		this.displayItemTo = 0;
		this.totalItems = 0;
	},

	HideNavigation: function(){
		this.navigation.setStyle('visibility','hidden');
	},

	ShowNavigation: function(){
		this.navigation.setStyle('visibility','visible');
	},

	getPageReqStr: function(){
		return "pagesize="+this.numPerPage+"&page="+this.currentPage;
	},

	reset: function(){
		this.initializeValues();
	},

	PageFirst: function(){
		if(this.currentPage == 1) return;
		this.currentPage = 1;

		this.CorrectCurrentPage();
		this.PageReload();
	},

	PagePrev: function(){
		if(this.currentPage == 1) return;

		this.currentPage = this.currentPage - 1;
		this.CorrectCurrentPage();
		this.PageReload();
	},

	PageNext: function(){
		if(this.currentPage == this.totalPage) return;
		this.currentPage = this.currentPage + 1;
		this.CorrectCurrentPage();
		this.PageReload();
	},

	PageLast: function(){
		if(this.currentPage == this.totalPage) return;
		this.currentPage = this.totalPage;

		this.CorrectCurrentPage();
		this.PageReload();
	},

	setPageCtrlButtons: function(){
		if(this.totalPage == 1){
			this.PageLeftDisable();
			this.PageRightDisable();
		}else{
			if(this.currentPage == this.totalPage){
				this.PageLeftEnable();
				this.PageRightDisable();
			}else if(this.currentPage == 1){
				this.PageLeftDisable();
				this.PageRightEnable();
			}else{
				this.PageLeftEnable();
				this.PageRightEnable();
			}
		}
	},

	PageLeftDisable: function(){
		this.pageFirstEle.removeClass('Enabled');
		this.pageFirstEle.addClass('Disabled');
		this.pagePrevEle.removeClass('Enabled');
		this.pagePrevEle.addClass('Disabled');
	},

	PageLeftEnable: function(){
		this.pageFirstEle.removeClass('Disabled');
		this.pageFirstEle.addClass('Enabled');
		this.pagePrevEle.removeClass('Disabled');
		this.pagePrevEle.addClass('Enabled');
	},

	PageRightDisable: function(){
		this.pageNextEle.removeClass('Enabled');
		this.pageNextEle.addClass('Disabled');
		this.pageLastEle.removeClass('Enabled');
		this.pageLastEle.addClass('Disabled');
	},

	PageRightEnable: function(){
		this.pageNextEle.removeClass('Disabled');
		this.pageNextEle.addClass('Enabled');
		this.pageLastEle.removeClass('Disabled');
		this.pageLastEle.addClass('Enabled');
	},

	CorrectCurrentPage: function(){
		this.currentPageEle.set('value', this.currentPage);
		this.setPageCtrlButtons();
	},

	getCurrentInputs: function(){
		this.numPerPage = (this.numPerPageSelection.getSelected())[0].get('value');

		var currentPage = this.currentPageEle.get('value');
		currentPage = parseInt(currentPage);
		if(isNaN(currentPage)){
			return;
		}		

		if(currentPage < 1){
			this.currentPage = 1;
			this.CorrectCurrentPage();
		}else if(currentPage > this.totalPage){
			this.currentPage = this.totalPage;
			this.CorrectCurrentPage();
		}else{
			this.currentPage = currentPage;
		}
	},

	PageReload: function(){
		this.getCurrentInputs();
		this.search.search();
	},

	ShowLoading: function(){
	    this.ShowMask(this.search);
		this.pageReloadEle.removeClass('Enabled');
		this.pageReloadEle.addClass('loading');
		this.PageStatusEle.set('text','Searching, please wait ...');
	},
	
	ShowMask:function(search){
	    if(search.maskDiv){
	        search.maskDiv.setStyles({
	            "width":search.searchResultTableEle.getStyle("width"),
	            /*"height":search.searchResultTableEle.getStyle("height").toInt()-
	                    search.searchResultTableEle.getElement('thead').getStyle("height").toInt()-
	                    search.searchResultTableEle.getElement('tfoot').getStyle("height").toInt(),*/
	            "display":"block"
	        });
	   }
	},
	
	HideMask:function(search){
	if(search.maskDiv)
	    search.maskDiv.setStyle('display','none');
	},

	HideLoading: function(){
		this.pageReloadEle.removeClass('loading');
		this.pageReloadEle.addClass('Enabled');
		this.HideMask(this.search);
		//this.PageStatusEle.set('text','Loaded');
	},

	DataLoaded: function(data){
	    if(data)
	    {
	      this.currentPage = data.currentPage;
		  this.totalPage = data.pageTotal;
		  this.totalItems = data.total;
		  this.numPerPage = data.pageSize;

	    }
		this.displayItemFrom = (this.currentPage - 1) * this.numPerPage+1;
		this.displayItemTo = this.currentPage * this.numPerPage;
		if(this.displayItemFrom < 0 ){
			this.displayItemFrom = 0;
		}
		if(this.displayItemTo > this.totalItems ){
			this.displayItemTo = this.totalItems;
		}
		this.HideLoading();
		this.SetNavigationInfor();
	},

	SetNavigationInfor: function(){
		this.ShowNavigation();
		this.totalPageEle.set('text',this.totalPage);
		this.CorrectCurrentPage();
		this.PageStatusEle.set('text','Displaying '+this.displayItemFrom+' to '+this.displayItemTo+' of '+this.totalItems+' items');
	},
	RemoveEventsForButtons : function()
	{
		this.numPerPageSelection.removeEvents();
		this.pageFirstEle.removeEvents();
		this.pagePrevEle.removeEvents();
		this.pageNextEle.removeEvents();
		this.pageLastEle.removeEvents();
		this.pageReloadEle.removeEvents();
	}
});
searchNavigation.implement(new Options, new Events);

var searchWidget = new Class({
	options: {
		searchBarFormID: 'search-bar-form',
		searchResultTableID: 'search-result-table',
		maskDivCls: '.maskDiv',
		searchSubmitButtonID: 'search-submit',
		searchType:'',
		pageSize:'10',
		currentPage:'1',
		
		//true, click tr redirect to specail page; false, prevent redirect
		clickRedirect: true
	},
	initialize: function(ele, url, options){
		if (!ele){
			return;
		}
		this.setOptions(options);
		this.element = ele;
		var searchBarFormEle = ele.getElement('.search-panel');
        this.searchBarForm = new searchBarForm(this, searchBarFormEle, url, {searchButtonID: this.options.searchSubmitButtonID});

		var searchResultTableEle = ele.getElementById(this.options.searchResultTableID);
		this.searchResultTableEle = searchResultTableEle;
		this.searchResultTable = new searchResultTable(this, searchResultTableEle, this.options);
		
        this.maskDiv = ele.getElement(this.options.maskDivCls);
        
		var searchNavigationEle = searchResultTableEle.getElement('tfoot');
		this.searchNavigation = new searchNavigation(this, searchNavigationEle);

		var searchSorterEle = searchResultTableEle.getElement('thead');
		this.searchSorter = new searchSorter(this, searchSorterEle);

		this.currentSearchReqStr = "";
		this.search();
	},

	newSearch: function(requestStr){
		//Store current query
		this.currentSearchReqStr = requestStr;
		
		//reset navigation
		this.searchNavigation.reset();

		this.search();
	},
	
	//for sorting table when click head row
	sortTable: function(requestStr){
	    //Store current query
		this.currentSearchReqStr = requestStr;
		this.search();
	},

	search: function(){
		//Show loading
		this.searchNavigation.ShowLoading();
		//Get page, items number per page
		var pageReqStr = this.searchNavigation.getPageReqStr();
		var requestStr = this.currentSearchReqStr;

		var reqURL = this.searchBarForm.actionURL+'?';
 		if(pageReqStr != "" && this.options.currentPage == "1"){
			reqURL = reqURL+pageReqStr;
		}
		else if(pageReqStr != "" && this.options.currentPage != "1")
		{
			reqURL = reqURL+"pagesize="+this.options.pageSize+"&page="+this.options.currentPage;
		}
		this.options.currentPage = "1";
		if(requestStr != ""){
			reqURL = reqURL+'&'+requestStr;
		}
		else 
		{
		 reqURL = reqURL+"&Active=1";
		}
		 
		
		if(this.options.searchType != ""){
			reqURL = reqURL+'&searchType='+this.options.searchType;
		}
		var jsonRequest = new Request.JSON({
			url: reqURL,
			onComplete: function(data){
				this.getSearchResult(data);
				var deletelink=$$('.deletePending');
				if(deletelink!=null)
				{
				    deletelink.each(function(element,index){
	                 element.addEvent('click',function(e){
	                    deleteclick(element);
	               })
	             })
	            }
			}.bind(this)
			
		}).get();
	},
  
	getSearchResult: function(data){
		//Set navigation current page, pages, items number per page, total items number
		this.searchNavigation.DataLoaded(data);
		//Put data into table
		this.searchResultTable.fillTable(data);

		//hide loading
	}
});
searchWidget.implement(new Options, new Events);
