﻿
// ----------------------------------------------------------------------------------------
//  Parameters:
//      name:       Used to generate the id of divs and HTML controls (other words will be 
//                  added to create unique id's).
//      headline:   Text shown at top of control.   
//      unit:       Could be "kr." or some other unit of measurement. Will always be shown 
//                  after the anount/number. Usually $ is shown before the amount, so in 
//                  this case new functionality must be added to position the unit of 
//                  measurement.
// ----------------------------------------------------------------------------------------
function ControlSlider(name, headline, unit)
{
    this.headline = headline;
    this.name = name;
    this.maxRange = null;
    this.maxIsInfinite = false; // if true when slider is to far right the price max to be searched is infinite (in reality just a very high number).
    this.outerDivId = "Slider_" + name + "Div";      // Name of div that surrounds the control.
    this.userManipulated = false; // user has used slider at some point.
    this.resetLinkDivId = "Slider_" + name + "_Reset";
    this.resetLinkId = "Slider_" + name + "_ResetLink";
    this.headlineDivId = "Slider_" + name + "_Headline";
    this.unit = unit;
    var self = this;

    this.Render = function()
    {
        var temp = "<div id='" + this.outerDivId + "' class='ControlDiv ControlDivSlider'>";

        temp += "<div id='" + this.headlineDivId + "' class='ControlHeadline'>";
        temp += "<div class='FilterControlHeadlineText'>" + this.headline /* + "</div>";*/
        temp += "<div id='" + this.resetLinkDivId + "' class='ControlHeadlineReset'><a id='" + this.resetLinkId + "' href='javascript:void 0'>nulstil</a></div>";
        temp += "<div class='breaker'></div>"
        temp += "</div></div>";

        temp += "<div class='ControlContent'>";
        temp += "<div id='slider' class='SliderDiv'></div>";

        temp += "<div style='margin-top: 4px'>";
        temp += "<div id='slider_" + this.name + "_min' class='SliderMin' style='float:left;'></div>";
        temp += "<div id='slider_" + this.name + "_max' class='SliderMax' style='float:right;'></div>";
        temp += "</div>";
        temp += "<div class='breaker'></div>";
        temp += "</div>";

        temp += "</div>";

        // Write HTML to page. 
        document.write(temp);

        $(function()
        {

            // Slider
            $('#slider').slider({
                range: true,
                min: 0,
                max: 9999,
                values: [0, 9999],
                slide: function(event, ui)
                {
                    $("#slider_" + self.name + "_min").html(ui.values[0] + ' ' + self.unit);

                    if ((self.maxIsInfinite == true) && (ui.values[1] == self.maxRange))
                    {
                        self.min = ui.values[0];
                        self.max = 99999;
                        $("#slider_" + self.name + "_max").html('maksimum');
                    }
                    else
                    {
                        self.min = ui.values[0];
                        self.max = ui.values[1];
                        $("#slider_" + self.name + "_max").html(ui.values[1] + ' ' + self.unit);
                    }
                },
                stop: function(event, ui)
                {
                    if ((self.maxIsInfinite == true) && (ui.values[1] == self.maxRange))
                    {
                        self.min = ui.values[0];
                        self.max = 99999;
                    }
                    else
                    {
                        self.min = ui.values[0];
                        self.max = ui.values[1];
                    }
                    self.OnSlideStop();
                }
            });

            $("#slider_" + self.name + "_min").html(self.min + self.unit);
            $("#slider_" + self.name + "_max").html(self.max + self.unit);
            $("#slider_" + self.name + "_min").html('');
            $("#slider_" + self.name + "_max").html('');

            //hover states on the static widgets
            $('#dialog_link, ul#icons li').hover(
				function() { $(this).addClass('ui-state-hover'); },
				function() { $(this).removeClass('ui-state-hover'); }
			);

            $jq("#" + self.resetLinkId).bind("click", self.OnResetLinkClick);

        });
    }
    this.Render();

    this.OnResetLinkClick = function()
    {
        self.userManipulated = false;
        $jq("#" + self.resetLinkDivId).hide();

        // Reset slider range and position.
        self.min = 0;
        self.max = self.maxRange;

        // clear price texts
        $("#slider_" + self.name + "_min").html(' ');
        $("#slider_" + self.name + "_max").html(' ');

        fc.CriteriaChange_MinMaxPrice(self.name, self.min, self.max, true);
        return false;
    }

    // ------------------------------------------------------------------------------
    //  Search controller will receive all relevant events from this 
    //  control.
    // ------------------------------------------------------------------------------     
    this.RegisterAsTrigger = function(searchController)
    {
        fc.RegisterTrigger(this.name, searchController);
    }

    this.OnSlideStop = function()
    {
        self.userManipulated = true;
        $jq("#" + self.resetLinkDivId).show();
        //fc.CriteriaChange_MinMaxPriceRange(self.name, minrange, maxrange, false);
        fc.CriteriaChange_MinMaxPrice(self.name, self.min, self.max, true);

    }

    // ------------------------------------------------------------------------------
    //  Subscribe to specific event from searchcontroller.
    // ------------------------------------------------------------------------------ 
    this.SubscribeEvent = function(searchController, eventName, callback)
    {
        fc.SubscribeEvent(this, searchController, eventName, callback);
    }

    this.SubscribeEvents = function(searchController)
    {
        fc.SubscribeEvent(self, searchController, "SearchResult", self.OnSearchResult);
    }

    this.SetMinMaxRange = function(minrange, maxrange)
    {

    }

    this.SetMinMax = function(min, max)
    {

    }

    this.OnSearchResult = function(data, _this, persistedSearch)
    {
        var keys = new Array();
        var values = new Array();
        var tempArray;
        var temp;
        var min;
        var max;
        var num; // num results in this price range.
        var lowestMinWithResults = null;
        var highestMaxWithResults = null;
        var lowestMin = null;
        var highestMax = null;

        var lowest = 99999;
        var highest = 0;

        for (idx in data.response.docs)
        {
            lowest = Math.min(data.response.docs[idx].sp, lowest);
            highest = Math.max(data.response.docs[idx].sp, highest);
        }

        if (highest == 0)
        {
            $("#slider").slider("disable");

            $("#slider_" + self.name + "_min").html("");
            $("#slider_" + self.name + "_max").html("");
            return;
        }
        else
        {
            if (self.userManipulated == false)
            {
                $('#slider').slider("values", 0, lowest);
                $('#slider').slider("values", 1, highest);
                $('#slider').slider("option", "min", lowest);
                $('#slider').slider("option", "max", highest);
                $('#slider').slider("enable");
                self.min = lowest;
                self.max = highest;

                $("#slider_" + self.name + "_min").html(self.min + " " + self.unit);
                $("#slider_" + self.name + "_max").html(self.max + " " + self.unit);
            }
            if ((self.maxRange == null) || (self.maxRange < highestMax))
            {
                self.maxRange = highestMax;
            }
        }
    }
}