dojo.registerModulePath("widgets", "../widgets");
// dependancies
dojo.require("dojo.store.JsonRest");
dojo.require("widgets.AutoSuggest");

// init function
function init() {
    
    // create JSON REST store
    window.api              = new dojo.store.JsonRest({target:"/api/"});
    
    // get inputs
    window.keywordInput     = dojo.byId("Search_Keywords");
    //window.regionSelect     = dojo.byId("SearchPanel_RegionList");
    //window.solutionSelect   = dojo.byId("SearchPanel_SolutionList");
    window.formatRadios     = dojo.query("input").filter(function(item) {
                                return item.name === "formatSelect";
                              });
    window.langRadios       = dojo.query("input").filter(function(item) {
                                return item.name === "langSelect";
                              });
		window.regionRadios     = dojo.query("input").filter(function(item) {
                                return item.name === "regionSelect";
                              });
	  window.solutionRadios  	= dojo.query("input").filter(function(item) {
                                return item.name === "solutionSelect";
                              });
    window.resultsPerPageSelect  = dojo.byId("resultsPerPage");
    window.sortSelect       = dojo.byId("sortResults");
    window.currentSort      = null;
    
    // bind events
    
    // on input or focus query api and update autosuggest widget
    dojo.connect(keywordInput, "onkeyup", autosuggest);
    dojo.connect(keywordInput, "focus", autosuggest);
    dojo.connect(keywordInput, "blur", hideAutosuggest);
    
    // on region / solution update potential results 
    //dojo.connect(regionSelect, "onclick", updatePotentialResults);
    //dojo.connect(solutionSelect, "onclick", updatePotentialResults);
    
    // result filters
    dojo.forEach(formatRadios, function(input, i){
        dojo.connect(input, "onclick", filterResults);
    });
    
    dojo.forEach(langRadios, function(input, i){
        dojo.connect(input, "onclick", filterResults);
    });

		dojo.forEach(regionRadios, function(input, i){
        dojo.connect(input, "onclick", filterResults);
    });

		dojo.forEach(solutionRadios, function(input, i){
        dojo.connect(input, "onclick", filterResults);
    });
    
    // repaginate on changing results per page
    dojo.connect(resultsPerPageSelect, "onclick", paginate);
    
    // sort 
    dojo.connect(sortSelect, "onchange", sort);
    
    // update potential results 
    // updatePotentialResults();
    
    // paginate
    filterResults();
    
    // disable filters
    disableFilters();
    
    // hide filter button if js is present
    dojo.style(dojo.byId("filterExtra"), "display", "none");
    
}

function autosuggest() {
    // if 3 or more characters have been input
    if(dojo.attr(this, "value").length > 2) {
        // query the api
        api.get("downloads/search/" + this.value).then(function(data) {
            // create new widget, append and show the container
            var autosuggest = new widgets.AutoSuggest({ items: data });
            autosuggest.placeAt("autosuggestContainer", "only");
            dojo.style("autosuggestContainer", "display", "block");
        });
    } else {
        // hide the autosuggest
        hideAutosuggest();
    }
}

function hideAutosuggest() {
    setTimeout(function() {
        dojo.style("autosuggestContainer", "display", "none");
    }, 100);
}

/*function updatePotentialResults() {
    
    var regions         = jQuery("#SearchPanel_RegionList").val(),
        solutions       = jQuery("#SearchPanel_SolutionList").val(),
     		query_string    = "downloads",
        container       = dojo.byId("potentialResults");
    
    if(regions != "") {
        query_string += "/region/" + regions;
    }    
    
    if(solutions != "") {
        query_string += "/solution/" + solutions;
    } 
    
    api.get( query_string ).then(function(data) {
        container.innerHTML = data.length;
    });
}*/

function filterResults() {
    
    var format_id   = null,
    		lang_id     = null,
				region_id		= null,
				solution_id	= null;
    
    // get selected format & lang ids
    dojo.forEach(window.formatRadios, function(input, i){
        if(input.checked) {
            format_id = input.value;
        }
    });
    
    dojo.forEach(langRadios, function(input, i){
        if(input.checked) {
            lang_id = input.value;
        }
    });

		dojo.forEach(regionRadios, function(input, i){
        if(input.checked) {
            region_id = input.value;
        }
    });

		dojo.forEach(solutionRadios, function(input, i){
        if(input.checked) {
            solution_id = input.value;
        }
    });
    
    // loop through rows
    dojo.forEach(dojo.query(".itemRow"), function(tr, i) {

        show = "true";
        
        // if 
        if(format_id != "all" && tr.getAttribute("data-format") != format_id) {
            show = "false";
        }
        
        if(lang_id != "all" && tr.getAttribute("data-lang") != lang_id) {
            show = "false";
        }

 				if(region_id != "all" && tr.getAttribute("data-region") != region_id) {
            show = "false";
        }

				if(solution_id != "all" && tr.getAttribute("data-solution") != solution_id) {
            show = "false";
        }
        
        // set show attribute
        tr.setAttribute("data-show", show);
        
    });
    
    paginate();
    
}

function paginate() {
    
    // hide all rows
    dojo.forEach(dojo.query(".itemRow"), function(tr, i){
        dojo.style(tr, "display", "none"); 
    });
    
    // setup vars
    var items                   = dojo.query(".itemRow").filter(function(item){
                                return item.getAttribute("data-show") === "true";
                            });
    window.page             = 1;
    window.resultsPerPage   = (window.resultsPerPageSelect.value == "all") ? items.length : window.resultsPerPageSelect.value;
                   
    var pages           = Math.ceil(items.length / window.resultsPerPage);
    var paginationList  = dojo.byId("paginationList");
    paginationList.innerHTML = "";
    
    // create pagination links
    for(var i = 1; i <= pages; i++ ) {
        dojo.create("li", { innerHTML: '<a title="' + i + '" id="pagination-' + i + '">' + i + '</a>'}, paginationList, "last");
        
        dojo.connect(dojo.byId("pagination-" + i), "onclick", function(){
            window.page = this.innerHTML;
            showPage();
        });
    }
    
    // prev and next links
    dojo.create("li", { innerHTML: '<a title="Prev" id="pagination-prev">Prev</a>'}, paginationList, "first");
    dojo.connect(dojo.byId("pagination-prev"), "onclick", function(){
        window.page = (window.page - 1 > 0) ? window.page - 1 : window.page;
        showPage();
    });
    
    dojo.create("li", { innerHTML: '<a title="Next" id="pagination-next">Next</a>'}, paginationList, "last");
    dojo.connect(dojo.byId("pagination-next"), "onclick", function(){
        window.page = (window.page + 1 < pages + 1) ? window.page + 1 : window.page;
        showPage();
    });
    
    if(!items.length) {
        dojo.style(dojo.byId("noResults"), "display", "table-row");
    } else {
        dojo.style(dojo.byId("noResults"), "display", "none");
    }
    
    
    dojo.byId("totalResult").innerHTML = items.length;
    showPage();
    
}

function showPage() {
    
    var max = window.page * window.resultsPerPage;
    var min = max - window.resultsPerPage;
    
    var items = dojo.query(".itemRow").filter(function(item){
                return item.getAttribute("data-show") === "true";
            });
    
    dojo.forEach(items, function(tr, i) {
        
        if(i >= min && i < max ) {
            dojo.style(tr, "display", "table-row");
        } else {
            dojo.style(tr, "display", "none");
        }
                
    });
    
    dojo.byId("minResult").innerHTML = min + 1;
    dojo.byId("maxResult").innerHTML = (max < dojo.byId("totalResult").innerHTML) ? max : dojo.byId("totalResult").innerHTML;
    
}

function disableFilters() {
    var items = dojo.query(".itemRow");
    
    dojo.forEach(window.langRadios, function(input, i){
        input.disabled = true; 
    });
    
    dojo.forEach(window.formatRadios, function(input, i){
        input.disabled = true; 
    });

		dojo.forEach(window.regionRadios, function(input, i){
        input.disabled = true; 
    });

		dojo.forEach(window.solutionRadios, function(input, i){
        input.disabled = true; 
    });
    
    dojo.forEach(items, function(tr, i) {
        
        dojo.forEach(window.langRadios, function(input, i){
            
            if(input.value === tr.getAttribute("data-lang") || input.value == "all") {
                input.disabled = false;
            }
            
        });
        
        dojo.forEach(window.formatRadios, function(input, i){
            
            if(input.value === tr.getAttribute("data-format") || input.value == "all") {
                input.disabled = false;
            }
            
        });

				dojo.forEach(window.regionRadios, function(input, i){
            
            if(input.value === tr.getAttribute("data-region") || input.value == "all") {
                input.disabled = false;
            }
            
        });

				dojo.forEach(window.solutionRadios, function(input, i){
            
            if(input.value === tr.getAttribute("data-solution") || input.value == "all") {
                input.disabled = false;
            }
            
        });

    });
    
}

/**
* quicksort algorithm
* 
*/
function sort() {
    
    if(window.sortSelect.value != window.currentSort) {
    
        var order = (window.sortSelect.value == "age-asc" || window.sortSelect.value == "name-asc") 
              ? "asc"
              : "desc"; 
                        
        var col = (window.sortSelect.value == "age-asc" || window.sortSelect.value == "age-desc") 
              ? "data-age"
              : "data-name";
              
        var container = dojo.byId("downloadResultsContainer");
        
        var stack = [dojo.query(".itemRow")];
        var sorted = [];
     
        while (stack.length) {
     
            var temp    = stack.pop(), 
                tl      = temp.length;
     
            if (tl == 1) {
                sorted.push(temp[0]);
                continue;
            }
            var pivot   = temp[0];
            var left    = [], 
                right   = [];
     
            for (var i = 1; i < tl; i++) {
                
                if(order == "asc") {
                    if ( dojo.trim( temp[i].getAttribute(col).toLowerCase() ) < dojo.trim( pivot.getAttribute(col).toLowerCase() ) ) {
                        left.push(temp[i]);
                    } else {
                        right.push(temp[i]);
                    }
                } else {
                    if ( dojo.trim( temp[i].getAttribute(col).toLowerCase() ) > dojo.trim( pivot.getAttribute(col).toLowerCase() ) ) {
                        left.push(temp[i]);
                    } else {
                        right.push(temp[i]);
                    }
                }
            }
     
            left.push(pivot);
     
            if (right.length)
                stack.push(right);
            if (left.length)
                stack.push(left);
     
        }
        
        // make DOM changes
        dojo.forEach(sorted.reverse(), function(tr, i){
            if(tr != undefined) {
                dojo.place(tr, container, "first");
            }
        });
        
        window.currentSort = window.sortSelect.value;
    
    }
    
}

// onload run the init function
dojo.addOnLoad(init);
