
/**
 * Main application logic.
 * Executed when the DOM is loaded.
 *
 * Depends on:
 *      - searchclient.js
 *      - searchui.js
 *      - common.js
 */
(function(){
    var searchClient = MM.searchClient;
    var isAutoCompleteEnabled = true;
    var c = getMainSearchContainer();
    var frm = getMainSearchContainerForm();
    var fld;
    var sorting = "";
    if(frm){
    	fld = frm.getElements()[0];
    	if(MM.cfg.sortingBeforeSearch){
        	var sortings = frm.getInputs('radio','sorting');
        	for(var i = 0; i < sortings.length; i++){
        		if(sortings[i].checked){
        			sorting = "&sorting=" + sortings[i].value;
        			break;
        		}
        	}
        }
    	else{
    		sorting = "&sorting=" + MM.cfg.defaultSorting;
    	}
    }
    else{
    	sorting = "&sorting=" + MM.cfg.defaultSorting;
    }
    var sugg = null;
   
    
    $$("#searchField").each(function(field){
        field.setAttribute("autocomplete", "off");
    });
    
    if (MM.util.getUrlParam("q") !== "") {
        var term = MM.util.getUrlParam("q");
        var s = MM.util.getUrlParam("sorting");
        if(s !== ""){
        	s = decodeURIComponent(s);
        	sorting = "&sorting=" + s ;
        }
        else{
        	s =  MM.cfg.defaultSorting;
        	sorting = "&sorting=" + s;
        }
        
        setTimeout(function(){
        	if(typeof c === 'undefined' || c === null){
            	c = addSearchContainer();
            	frm = c.select('form')[0];
            	if(frm){
            		fld = frm.getElements()[0];
            	}
            }
            ajaxSearch(term, sorting, fld, c);
            selectRadio(s);
            setTermValue(term);
        },500);
    }
    
    function selectRadio(selectedSorting){
    	if(typeof selectedSorting !== 'undefined' && selectedSorting !== ''){
    		$$('.fw-maincontainerdiv').each(function(item){
    			var frm = item.down('form');
    			if(frm){
    				var radios = frm.getInputs('radio');
    				radios.each(function(radio){
    					var radioValue = radio.value;
    					if(radioValue == selectedSorting){
    						radio.setAttribute('checked','checked');
    					}
    					else{
    						radio.removeAttribute('checked');
    					}
    				});
    			}
        	});
    	}
    }
    
    function setTermValue(term){
    	if(typeof term !== 'undefined' && term !== ''){
    		$$('.fw-maincontainerdiv').each(function(item){
    			var frm = item.down('form');
    			if(frm){
    				var searchField = frm.down('input[type=text]');
        			if(searchField){
        				searchField.value = decodeURIComponent(term);
        			}	
    			}
        	});
    	}
    }
    
    function processBackfillResult(result, c){
        processSearchResult(result, c);
    }
    
    function processRelatedResult(result, c){
        if (result !== null && result.doclist !== null) {
            ui.renderRelatedResults(result.doclist, c);
        }
    }
    
    function processSearchResult(result, c){
    	var meta = MM.util.assembleMetaData(result, c);
      
    	 if (typeof meta.suggestion === 'undefined' || meta.suggestion === null){
    		 if(sugg !== null){
    			 meta.suggestion = sugg;
    		 }
    	 }
        if (result.status == "service_error") {
            // Clear all previous results
            ui.clear(c);
            // Print error message
            ui.renderConnectionErrorMessage(c);
            
        }
        else 
            if (meta.hits > 0) {
                // Render UI
                ui.renderResultInfoText(meta, c);
                ui.renderResultQueryTimeText(meta, c);
                ui.renderPagination(result.pagination, meta, c);
                ui.renderSorting(result.sortings, c);
                ui.renderSearchResults(result.doclist, c);
                ui.renderFacets(result.facets, c);
                if (typeof meta.suggestion !== 'undefined' && meta.suggestion !== null) {
                    ui.renderSuggestion(meta, c);
                }
                var l = createBackLink(c);
                if(l){
                	ui.renderBackLink(l,c);
                }
                
                addLinkEvents(c);
                addFormEvents(c);
            }
            else {
                ui.clear(c);
                ui.renderResultInfoText(meta, c);
                ui.renderResultQueryTimeText(meta, c);
            }
        
        MM.util.showLoad(false, c);
		MM.util.addImagesToggle(c);
    }
    
    function addLinkEvents(c){
    	if (MM.cfg.ajaxEnabled) {
    		var links = $$("#facets li a, #paginationHead a, #paginationFoot a, #sorting a", "#suggestion a");
    		if(links.length === 0){
    			links = c.select('div.left li a, div.fw-paginationHead a, div.fw-paginationFoot a, div.fw-sorting a, span.fw-suggestion a');
    		}
            links.each(function(link){
                link.observe('click', function(event){
                    var qs = /\?.*/.exec(link);
                    if (qs !== null) {
                        qs = MM.util.toUrlParams(qs);
						var f = getMainSearchContainerForm();
						if(f){
							if (link.up(0) && link.up(0).id == 'suggestion') {
								var qStr = qs.substring(qs.indexOf('q=') + 2);
								var field = f.select('#searchField')[0];
								if(!field){
									field = f.down('input[type=text]');
								}
								field.value = decodeURIComponent(qStr);
							}
						}
						ui.clear(c);
						MM.util.showLoad( true, c);
                        searchClient.search(qs, function(result){
                        	processSearchResult(result,c);
                        });
                        searchClient.relatedSearch(qs, function(result){
                        	processRelatedResult(result,c);
                        });
                    }
                    Event.stop(event);
                });
            });
        }
    }
    
    function copyContainer(container){
        if (!container) {
            return null;
        }
        var radios =  container.select('input[type=radio]');
        var checkedIndex = 0;
        for(var i = 0; i < radios.length; i++){
        	var checked = radios[i].checked;
        	if(checked){
        		checkedIndex = i;
        		break;
        	}
        }
        var copy = container.clone(true);
        var copyRadios = copy.select('input[type=radio]');
        if(copyRadios.length > 0){
        	copyRadios[checkedIndex].setAttribute('checked','checked');
        }
        return copy;
    }
    
    function getMainContentContainer() {
    	var mainContentContainer;
    	
    	if (typeof MM.cfg.mainContentContainer === "undefined") {
    		mainContentContainer = $('navMainWrapper');
    	} else {
    		mainContentContainer = MM.cfg.mainContentContainer;
    	}
    	
        return mainContentContainer;
    }
    
   function setSelectedSorting(csource, ctarget){
	   if(csource && ctarget){
		   var sourceFrm =  csource.down('form');
		   var selectedIndex = 0;
		   if(sourceFrm){
			  var radios =  sourceFrm.getInputs('radio');
			  for(var i= 0; i < radios.length;i++){
				  var checked = radios[i].checked;
				  if(checked){
					  selectedIndex = i;
					  break;
				  }
			  }
		   }
		   
		   var targetFrm  = ctarget.down('form');
		   if(targetFrm){
			   var targetRadios = targetFrm.getInputs('radio');
			   if(targetRadios.length > 0){
				   targetRadios[selectedIndex].setAttribute('checked','checked');
			   }
		   }  
	   }
   }
    
    function addSearchContainer(){
        var sc = getSearchContainer();
        var fieldValue = "";
        var f = sc.select('form')[0];
        if(f){
        	var cField = f.getElements()[0];
        	if(cField){
        		fieldValue = cField.value;
        	}
        }
        
        var c = getMainSearchContainer();
        if (!c) {
			c = copyContainer(sc);
			var w = createSearchResultWrapper();
			w.insert({
				top: c
			});
			var m = getMainContentContainer();
			m.insert({
				top: w
			});
			//addFormEvents(c);
		}
		else {
			var otherFieldValue = c.select('form')[0].getElements()[0].value;
			if(fieldValue !== ''){
				c.select('form')[0].getElements()[0].value = fieldValue;
			}
			else if (otherFieldValue === '') {
				c.select('form')[0].getElements()[0].value = fieldValue;
			}
			
			setSelectedSorting(sc,c);
		}
		
        if(sc){
        	var frm = sc.select('form')[0];
        	if(frm){
        		var elements = frm.getElements();
        		var field = elements[0];
        		if(field){
        			field.value = "";
        		}
        	}
        }
        
        return c;
    }
    
    function getMainSearchContainerForm(){
        var w = $('AttentionTeaserWrapper');
        if (w) {
            var c = w.select('div.fw-maincontainerdiv')[0];
            if (c) {
                return c.select('form')[0];
            }
        }
    }
    
    function getMainSearchContainer(){
        var w = $('AttentionTeaserWrapper');
        if (w) {
            var c = w.select('div.fw-maincontainerdiv')[0];
            return c;
        }
    }
    
    function addFormEvents(wrapper){
        var f = wrapper.select('form')[0];
        if (f) {
           f.onsubmit = function(event){
            	ui.clear(wrapper);
            	var elm;
         	   if(event){
         		   elm = (typeof event.target !== 'undefined' && event.target !== null ? event.target : event.currentTarget);
         	   }
         	   else{
         		   elm = this;
         	   }
         	   var field = elm.select('#searchField')[0];
         	   if(!field){
         		   field = elm.down('input[type=text]');
         	   }
                var term = field.value;
                var sorting = "";
                if(MM.cfg.sortingBeforeSearch){
                	var sortings = elm.getInputs('radio','sorting');
                	for(var i = 0; i < sortings.length; i++){
                		if(sortings[i].checked){
                			sorting = "&sorting=" + sortings[i].value;
                			break;
                		}
                	}
                }
                else{
                	sorting = "&sorting=" + MM.cfg.defaultSorting;
                }
                if(isRedirectToDepartment()){
              	  location.href = MM.cfg.renderDepartment + "?q=" + term + sorting;
	              	
	              return false;
                }
                else{
	            	 if (term !== null && term !== "") {
	                     if (MM.cfg.ajaxEnabled) {
	                         ajaxSearch(term, sorting, field,wrapper);
	                     }
	                     else {
	                         window.location = "?q=" + term + sorting;
	                     }
	                 }	
	            	 
	            	 if(event){
	                 	event.preventDefault();	
	                 }
	                 else {
	                 	return false;
	                 }
                }
                
            };
            var field = f.getElements()[0];
            if(field){
	            field.observe('keydown', function(event){
	                if (!isAutoCompleteEnabled) {
	                    isAutoCompleteEnabled = true;
	                    MM.util.enableAutocomplete(field);
	                }
	            });
	            addQueryCompletion(field);
            }
        }
    }
    
    function addQueryCompletion(elm){
        var $J = jQuery.noConflict();
        $J(elm).autocomplete({
            source: function(request, response){
                $J.ajax({
                    type: "GET",
                    dataType: "jsonp",
                    url: MM.cfg.querycompletionUrl + "/complete.do?format=opensearch&q=" + encodeURIComponent(request.term).toLowerCase(),
                    success: function(data){
                        response(data[1]);
                    },
					complete : function( XMLHttpRequest, textStatus ){
                    	//MM.util.showLoad( false );
                	},
					beforeSend: function(XMLHttpRequest){
						//MM.util.showLoad( true );
					}
                });
                
            },
            minLength: 1,
            select: function(event, ui){
            	var f = (typeof event.target.form !== 'undefined' && event.target.form !== null ? event.target.form : $J(event.target).parents('form:first'));
            	
            	if(isRedirectToDepartment()){
            		var sorting = "";
            		if(MM.cfg.sortingBeforeSearch){
        				var sortingValue = $J('input:radio[name=sorting]:checked').val();	
        				sorting = "&sorting=" + sortingValue;
        			}
        			else{
        				sorting = "&sorting=" + MM.cfg.defaultSorting;
        			}
            			
            		var term = ui.item.value;
					location.href = MM.cfg.renderDepartment + "?q=" + term + sorting;
					event.stopPropagation();
            	}
            	else{
            		if(f){
                		var fld = event.target;
                		fld.value = ui.item.value;
                		$J(f).submit();
                	}	
            	}
            },
            open: function(e, ui){
            	var frm = (typeof e.target.form !== 'undefined' && e.target.form !== null ? e.target.form : $J(e.target).parents('form:first'));
            	var fld = e.target;
            	$J(document).bind('keypress',{felement:frm,field:fld}, function(event){
            		if(event.keyCode == 13){
            			if(event.data.felement){
            				$J(event.data.field).autocomplete("close");
            				$J(document).unbind('keypress');
            				if(isRedirectToDepartment()){
            					var sorting = "";
        	            		if(MM.cfg.sortingBeforeSearch){
                    				var sortingValue = $J('input:radio[name=sorting]:checked').val();	
                    				sorting = "&sorting=" + sortingValue;
                    			}
                    			else{
                    				sorting = "&sorting=" + MM.cfg.defaultSorting;
                    			}
        	            			
        	            		var term = ui.item.value;
        						location.href = MM.cfg.renderDepartment + "?q=" + term + sorting;
        						event.stopPropagation();
            				}
            				else{
            					$J(event.data.felement).submit();
            				}
            			}
            		}
            	});
            }
        });
    }
    
    function getSearchContainer(){
        var sc = null;
        var extra = $$('.extraColumn .inner')[0];
        var ad = $$('.adColumn .inner')[0];
        var top = $('topHeaderContents');
		if(extra){
			sc = extra.select('div.fw-maincontainerdiv')[0];
		}
        
        if (typeof sc === 'undefined' || sc === null) {
			if(ad){
				 sc = ad.select('div.fw-maincontainerdiv')[0];
			}
           
        }
        if (typeof sc === 'undefined' || sc === null) {
			if(top){
				sc = top.select('div.fw-maincontainerdiv')[0];
			}
        }
        
        if(typeof sc === 'undefined' || sc === null){
        	sc = createSearchContainer();
        }
        return sc;
    }
    
    function createSearchContainer(){
	    var fw_searchContainer = new Element('div', {
	     'class':'fw-maincontainerdiv'	
    	});
	    var searchHeader = getSearchHeaderElement();
	    fw_searchContainer.insert(searchHeader);
	    if(MM.cfg.sortingBeforeSearch){
	    	var resultInfo = new Element('div',{
	    		'class':'resultInfo'
	    	});
	    	var resultInfoText = new Element('span',{
	    		'id':'resultInfoText'
	    	});
	    	var resultQueryTimeText = new Element('span',{
	    		'id':'resultQueryTimeText'
	    	});
	    	resultInfo.insert(resultInfoText);
	    	resultInfo.insert(resultQueryTimeText);	
	    	fw_searchContainer.insert(resultInfo);
	    }
	    var contentHeader = getContentHeaderElement();
	    fw_searchContainer.insert(contentHeader);
	    var facets = getFacetsElement();
	    fw_searchContainer.insert(facets);
	    var middle = getMiddleElement();
	    fw_searchContainer.insert(middle);
	    var relatedResults = getRelatedResultsElement();
	    fw_searchContainer.insert(relatedResults);
	    var clearer = new Element('div',{
	    	'class':'clearer'
	    });
	    fw_searchContainer.insert(clearer);
	    
	    return fw_searchContainer;
    }
    
    function getContentHeaderElement(){
    	 var contentHeader = new Element('div',{
 	    	'id':'contentHeader'
 	    });
    	var paginationHead = new Element('div',{
    		'id':'paginationHead',
    		'class':'fw-paginationHead'
    	});
    	var sorting = new Element('div',{
    		'id':'sorting',
    		'class':'fw-sorting'
    	});
    	contentHeader.insert(paginationHead);
    	if(!MM.cfg.sortingBeforeSearch){
    		contentHeader.insert(sorting);
    	}
    	
    	return contentHeader;
    }
    
    function getFacetsElement(){
    	 var facets = new Element('div',{
 	    	'id':'facets',
 	    	'class':'left'
 	    });
    	return facets;
    }
    
    function getMiddleElement(){
    	 var middle = new Element('div',{
 	    	'id':'middle',
 	    	'class':'middle'
 	    });
    	 var searchResults = new Element('div',{
    		 'id':'searchResults',
    		 'class':'content'
    	 });
    	 var paginationFoot = new Element('div',{
    		 'id':'paginationFoot',
    		 'class':'fw-paginationFoot'
    	 });
    	 var backFillResults = new Element('div',{
    		 'id':'backfillResults'
    	 });
    	 middle.insert(searchResults);
    	 middle.insert(paginationFoot);
    	 middle.insert(backFillResults);
    	 return middle;
    }
    
    function getRelatedResultsElement(){
    	 var relatedResults = new Element('div',{
 	    	'class':'right',
 	    	'id':'relatedResults'
 	    });
    	return relatedResults;
    }
    
    function getSearchHeaderElement(){
    	 var searchHeader = new Element('div',{
 	    	'class':'searchHeader'
 	    });
    	var h1 = new Element('h1').update('S&ouml;k');
    	searchHeader.insert(h1);
    	var fw_searchForm = getSearchFormElement();
    	searchHeader.insert(fw_searchForm);
    	return searchHeader;
    	 
    }
    
    function getSearchFormElement(){
    	var fw_searchForm = new Element('form',{
    		'id':'fw-searchForm',
    		method:'get',
    		action:'',
    		autocomplete: 'off'
    	});
    	var searchField = new Element('input',{
    		type: 'text',
    		'id':'searchField',
    		name:'q',
    		value:''
    	});
	    
	    if(MM.cfg.sortingBeforeSearch){
	    	var h4 = new Element('h4').update('Sortera efter');
	    	var radio1 = new Element('input',{
	    		type:'radio',
	    		name:'sorting',
	    		id:'sortingDate',
	    		value:'publishdate:DESCENDING',
	    		checked:'checked'
	    	});
	    	var label1 = new Element('label',{
	    		'for':'sortingDate'
	    	}).update('Datum');
	    	var radio2 = new Element('input',{
	    		type:'radio',
	    		name:'sorting',
	    		id:'sortingRelevance',
	    		value:'score:DESCENDING'
	    	});
	    	var label2 = new Element('label',{
	    		'for':'sortingRelevance'
	    	}).update('Relevans');
	    }
	    
    	var searchBtn = new Element('input',{
    		type: 'submit',
    		'id':'searchButton',
    		value: 'S\u00F6k'
    	});
    	var loadIcon = new Element('img',{
    		'id':'loadIcon',
    		alt: 'Laddar...',
    		src: '/img-common/ajax-loader.gif',
    		style: 'display:none;'
    	});
    	var clearer = new Element('div',{
    		'class':'clearer'
    	});
    	var resultInfo = new Element('div',{
    		'class':'resultInfo'
    	});
    	var resultInfoText = new Element('span',{
    		'id':'resultInfoText'
    	});
    	var resultQueryTimeText = new Element('span',{
    		'id':'resultQueryTimeText'
    	});
    	resultInfo.insert(resultInfoText);
    	resultInfo.insert(resultQueryTimeText);
    	var suggestions = new Element('span',{
    		'id':'suggestion',
    		'class':'fw-suggestion'
    	});
    	var errorMessage = new Element('div',{
    		'id':'errorMessage',
    		'class':'fw-errorMessage'
    	});
    	fw_searchForm.insert(searchField);
    	if(MM.cfg.sortingBeforeSearch){
    		fw_searchForm.insert(h4);
    		fw_searchForm.insert(radio1);
    		fw_searchForm.insert(label1);
    		fw_searchForm.insert(radio2);
    		fw_searchForm.insert(label2);
    		
    	}
    	fw_searchForm.insert(searchBtn);
    	fw_searchForm.insert(loadIcon);
    	fw_searchForm.insert(clearer);
    	if(!MM.cfg.sortingBeforeSearch){
    		fw_searchForm.insert(resultInfo);
    	}
    	fw_searchForm.insert(suggestions);
    	fw_searchForm.insert(errorMessage);
    	return fw_searchForm;
    }
    
    function createSearchResultWrapper(){
        var wrapper = $('AttentionTeaserWrapper');
        if (!wrapper) {
            wrapper = new Element('div', {
                'class': 'column clearfix',
                'id': 'AttentionTeaserWrapper'
            });
        }
        return wrapper;
    }
    
    function createBackLink(c){
    	var f = getMainSearchContainerForm();
    	if(f){
    		var field = f.select('#searchField')[0];
    		if(!field){
    			field = f.down('input[type=text]');
    		}
    		if(field){
    			var backLink = new Element('a',{className:'back',href:"#"}).update('Visa alla tr&auml;ffar');
	    		backLink.observe('click',function(){
	    			ui.clear(c);
	    			var sorting = "";
	    			if(MM.cfg.sortingBeforeSearch){
	    	        	var sortings = f.getInputs('radio','sorting');
	    	        	for(var i = 0; i < sortings.length; i++){
	    	        		if(sortings[i].checked){
	    	        			sorting = "&sorting=" + sortings[i].value;
	    	        			break;
	    	        		}
	    	        	}
	    	        }
	    			else{
	    				sorting = "&sorting=" + MM.cfg.defaultSorting;
	    			}
	        		ajaxSearch(field.value, sorting, field, c);
	        	});
	    		return backLink;
    		}
    	}
    }
    
    function ajaxSearch(term, sorting, elm, c){
        isAutoCompleteEnabled = false;
        MM.util.disableAutocomplete(elm);
        MM.util.showLoad(true, c);
        ui.clear(c);
        searchClient.search(MM.util.toSearchParams(term) + sorting, function(result){
        	 var suggestions = result.suggestions;
             if (suggestions !== undefined && suggestions !== null && suggestions.collatedSuggestion !== null) {
                 sugg = suggestions.collatedSuggestion.suggestion;
             }
            if (result.numberOfHits > 0) {
                processSearchResult(result, c);
            }
            else {
                searchClient.backfillSearch(MM.util.toSearchParams(term) + sorting, function(result){
                	processBackfillResult(result, c);
                });
               
            }
        });
        searchClient.relatedSearch(MM.util.toSearchParams(term) + sorting, function(result){
        	processRelatedResult(result,c);
        });
        
    }
	
	function isRedirectToDepartment() {
		return MM.cfg.renderInDepartment && MM.cfg.renderDepartment.length > 0 && location.pathname !== MM.cfg.renderDepartment;
	}
      
    $$('#searchField').each(function(f){
        f.observe('keydown', function(event){
            if (!isAutoCompleteEnabled) {
                isAutoCompleteEnabled = true;
                var elm = Event.element(event);
                MM.util.enableAutocomplete(elm);
            }
        });
    });
    
    $$('#fw-searchForm').each(function(f){
      f.onsubmit =  function(event){
    	  var elm;
      	   if(event){
      		   elm = (typeof event.target !== 'undefined' && event.target !== null ? event.target : event.currentTarget);
      	   }
      	   else{
      		   elm = this;
      	   }
         var field = elm.select("#searchField")[0];
         if(!field){
      	   field = elm.down('input[type=text]');
         }
    	  var term = field.value;
          var sorting = "";
          if(MM.cfg.sortingBeforeSearch){
          		var sortings = elm.getInputs('radio','sorting');
	           	for(var i = 0; i < sortings.length; i++){
	           		if(sortings[i].checked){
	           			sorting = "&sorting=" + sortings[i].value;
	           			break;
	           		}
	           	}
          }
          else{
       	   	sorting = "&sorting=" + MM.cfg.defaultSorting; 
          }
          
          if(isRedirectToDepartment()){
        	  location.href = MM.cfg.renderDepartment + "?q=" + term + sorting;
          }
          else{
              var c = addSearchContainer(term,elm);
              if (term !== null && term !== "") {
                  if (MM.cfg.ajaxEnabled) {
                      ajaxSearch(term,sorting, field, c);
                  }
                  else {
                      window.location = "?q=" + term + sorting;
                  }
              }  
          	}
           if(event){
				// If IE9
				if (window.attachEvent && window.addEventListener && document.createEvent) {
					return false;
				} else {
					event.preventDefault();
				}
           }
           else {
        	   return false;  
           }
          
       };
    });
})();


