if (gmm2c == null)
	var gmm2c = {};
if (gmm2c.widget == null)
	gmm2c.widget = {};
	
/* constuctor of dropdown */
gmm2c.widget.autoComplete = function(sInputId,  iMaxNum,urlOrFunction,unSelArr)  {
   /* id of input box , url to send request and max number of messages */
        this.input = gmm2c.core.util.$(sInputId);
        this.maxNum = iMaxNum || 8; /* 8 is the default max number */
		this.unSelArr=unSelArr||['search by category','search suggestions','search by brand'];
		
		if(typeof urlOrFunction=='string')
        	this.url = urlOrFunction;
		else if (typeof urlOrFunction=='function')
			 this.callback = urlOrFunction;
		else
			 this.callback=searchWordDwr.getSearchWords;

        this.dataUl = gmm2c.core.util.$("autoSearchResult");
		this.currentSelectedIndex=-1;
        this._init();


}

gmm2c.widget.autoComplete.prototype = {
    /* send request for product list with AJAX */

    /* set div's style  */
    _setUlStyle : function(oUl, oInput) {
        var left = 0;
        var top = parseInt(oInput.clientHeight);
        var obj = oInput;
        var offSet = $j(oInput).offset();
		

            left += offSet.left;
            top += offSet.top;


        oUl.style.cssText = 'position:absolute;'
                  + 'left:' + (left + oInput.clientLeft) + 'px;'
				  + 'top:' + (top + oInput.clientTop * 2+6) + 'px;'
				  + 'width:' +(oInput.clientWidth+11) + 'px;'
				  + 'display:none';

        oUl.className = 'dropDownBox';


    },
	_checkIfSelected: function(unSelArr,str){
		for(var i=0;i<unSelArr.length;i++){
			if(str==unSelArr[i])
			return false;
		}
		return true;	
	},
	_itemCLickHandler: function(oInput,dataUl){
	
		return function(eve){
			eve=eve||window.event;
			var target=eve.target||eve.srcElement;
			if(target.tagName=='LI'){
				gmm2c.widget.autoComplete.isSend =false;
				oInput.value=target.innerHTML.replace(/<[^>]+>/g,"");//add
				dataUl.style.display='none';
			}
		};
	},
	_itemOverHandler: function(obj){
		return function(eve){
			var items=obj.dataUl.getElementsByTagName('li');
			
			eve=eve||window.event;
			var target=eve.target||eve.srcElement;
			if(target.tagName=='LI'){
				if(obj.currentSelectedIndex!=-1&&items[obj.currentSelectedIndex].className!="search-category")
					items[obj.currentSelectedIndex].className="search-txt";
				if(obj._checkIfSelected(obj.unSelArr,target.innerHTML.replace(/<[^>]+>/g,"")))
			    	target.className='popSearchItemOver';
		    
			}
		};
	
	},
	_itemOutHandler: function(obj,unSelArr){
		return function(eve){
		
			eve=eve||window.event;
			var target=eve.target||eve.srcElement;
		
		    if(target.tagName=='LI'){
				if(obj._checkIfSelected(unSelArr,target.innerHTML.replace(/<[^>]+>/g,"")))
		     		target.className='search-txt';
				else
			 		target.className='search-category';
			}
		};
	},
	_setItemEventHandlers: function(){

		this.dataUl.onclick=this._itemCLickHandler(this.input,this.dataUl);
	    this.dataUl.onmouseover=this._itemOverHandler(this);
		this.dataUl.onmouseout=this._itemOutHandler(this, this.unSelArr);
		
	},
	_selectItemByKeyboard: function(obj,dataUlItems,unSelArr){//add
	
	
		return function(eve){
			eve=eve||window.event;
			
			gmm2c.widget.autoComplete.isSend =true;	
			for(var i=0,len=dataUlItems.length;i<len;i++){
				if(dataUlItems[i].className=='popSearchItemOver'){
					obj.currentSelectedIndex=i;
					break;
				}
			}
	
			if(obj.currentSelectedIndex!=-1&&dataUlItems[obj.currentSelectedIndex]){
				
				if(obj._checkIfSelected(obj.unSelArr,dataUlItems[obj.currentSelectedIndex])&&dataUlItems[obj.currentSelectedIndex].className!='search-category')
		           dataUlItems[obj.currentSelectedIndex].className='search-txt';
			    else
				   dataUlItems[obj.currentSelectedIndex].className='search-category';
								
			}
		
			if(eve.keyCode==38){
				if(obj.currentSelectedIndex>0)
					obj.currentSelectedIndex-=1;
			}else if(eve.keyCode==40){		
					if(obj.currentSelectedIndex<dataUlItems.length-1)
						obj.currentSelectedIndex=obj.currentSelectedIndex+1;
			}else if(eve.keyCode==13){
				var theLink=dataUlItems[obj.currentSelectedIndex].getElementsByTagName('a')[0];
				if(theLink)
					window.location.href=theLink.href;
				else
					obj.input.value=dataUlItems[obj.currentSelectedIndex].innerHTML.replace(/<[^>]+>/g,"");
		
				obj.currentSelectedIndex=-1;
		
				obj.dataUl.style.display='none';
				gmm2c.widget.autoComplete.isSend =false;
				if(eve.preventDefault)
					eve.preventDefault();
				else
					return false;
			}
		
			if(obj.currentSelectedIndex!=-1){
				if(obj._checkIfSelected(unSelArr,dataUlItems[obj.currentSelectedIndex]&&dataUlItems[obj.currentSelectedIndex].innerHTML.replace(/<[^>]+>/g,"")))
				    dataUlItems[obj.currentSelectedIndex].className='popSearchItemOver';
				else if(eve.keyCode==38&&obj.currentSelectedIndex>0)
					dataUlItems[obj.currentSelectedIndex-1].className='popSearchItemOver';
				else if(eve.keyCode==40)
					dataUlItems[obj.currentSelectedIndex+1].className='popSearchItemOver';	
			}
		
		}
	},
	_bindHandlerForKeyboardMove: function(){//add
	
		var dataUlItems=this.dataUl.getElementsByTagName('li');
		document.onkeydown=this._selectItemByKeyboard(this,dataUlItems,this.unSelArr);
	},

  
    /* bind data from server with div */
    _setDataForUl : function(dataArray) {
		
    if (dataArray.constructor == Array && dataArray.length > 0) {

        this.dataUl.innerHTML = "";
		this._setUlStyle(this.dataUl,this.input);
		this.currentSelectedIndex=-1;
        this.dataUl.style.display = 'block';//show data ul
		this._bindHandlerForKeyboardMove.apply(this);//add
		
        for (var i = 0, len = Math.min(this.maxNum, dataArray.length); i < len; i++) {
            var newLi = document.createElement('li');
			if(!this._checkIfSelected(this.unSelArr,dataArray[i])){
			newLi.className='search-category'; 
			}
			else
			newLi.className='search-txt'; 
			
            newLi.style.cssText = 'text-align:left;';
			
		var itemData=this._dealWithData(dataArray[i],this.input.value,this.unSelArr);
	   (typeof itemData=='string')?newLi.innerHTML=itemData:newLi.appendChild(itemData);
        
		
            this.dataUl.appendChild(newLi);
        }



    }
	else
	{
	this.dataUl.style.display='none';
	}

},
	_dealWithData: function(sItemStr,sInputText,unSelArr){

	var index=sItemStr.indexOf('+');
   if(this._checkIfSelected(unSelArr,sItemStr)){
	var reg=new RegExp('('+sInputText+')',"i");
    sItemStr=sItemStr.replace(reg,'<strong>$1</strong>');
	}
	
	
	if(index!=-1){
	var link=document.createElement('a');
	var newIndex=sItemStr.indexOf('+');
	link.innerHTML=sItemStr.slice(0,newIndex);
	sItemStr=sItemStr.replace(/<[^>]+>/g,"");
	link.href=sItemStr.slice(index+1);
	return link;
}
	else
	return sItemStr;

},


    /* send url with querystring and deal with return value */
	_sendStr : function(sKeyWord, sUrl) {
    var list;
    var obj = this;
	
	 if(gmm2c.core.util.trim(sKeyWord)!="" && gmm2c.widget.autoComplete.isSend ){
	 if(typeof this.url !="undefined"){
 
    $.ajax({
        type: 'get',
        url: sUrl + '?keyWord=' + sKeyWord,
        success: function(data) {
            list = eval('(' + data + ')');
            obj._setDataForUl.call(obj, list);

        }


    });
	}
	else{
	this.callback(sKeyWord,function(data) {
    	obj._setDataForUl.call(obj, data);

        });
	}
	
	}
	else
	{
	this.dataUl.style.display='none';
	}
	
	
    return list;
},
   
    /* set event handlers for document and input elements */
    _setHandler : function(obj) {
        var eventType;
        document.all ? eventType = 'propertychange' : eventType = 'input';

        gmm2c.core.util.addEventHandler(obj.input, eventType, function() {
	    	
            obj._sendStr.call(obj, obj.input.value, obj.url);

        });
		document.onkeydown=function(){gmm2c.widget.autoComplete.isSend =true;}


        gmm2c.core.util.addEventHandler(document.documentElement, 'click', function() {
            gmm2c.widget.autoComplete.hideAllDropDownMessage();
			obj.currentSelectedIndex=-1;
        });


    },
	_setResizeHandler:function(obj,oUl,oInput){
		gmm2c.core.util.addEventHandler(window,'resize',function(){
			obj._setUlStyle(oUl,oInput);
		
		});
	},
	_init : function() {
            this._setHandler(this);
            this._setUlStyle(this.dataUl,this.input);
			this._setItemEventHandlers.apply(this);
			this._setResizeHandler(this,this.dataUl,this.input)

	}

}

 /* hide all dropdown message box */
gmm2c.widget.autoComplete.hideAllDropDownMessage = function() {
       var boxesArr = gmm2c.core.util.getElementsByClassName('dropDownBox', document.body);
       for (var i = 0, len = boxesArr.length; i < len; i++) {
           boxesArr[i].style.display = 'none';
       }


   }
gmm2c.widget.autoComplete.isSend = true;

