var fdSliderController;

(function() {

        function fdSlider(inp,range,cbmove,cbstop,classname,hide,tween) {
                this._created   = false;
                this._inp       = inp;
                this._hideInput = hide||false;
                this._min       = range[0]||0;
                this._max       = range[1]||0;
                this._range     = this._max - this._min;
                this._tween     = tween;
                this._x;
                this._y;
                this._cbmove    = cbmove||false;
                this._cbstop    = cbstop||false;
                this._wrapper;
                this._bar;
                this._newInput;
                this._handle;
                this._mouseX    = 0;
                this._timer     = null;
                this._classname = classname||'';
                this._events = {
                        onchange: function( e ) {
                                var pos = self.calcFromInput();
                                self._handle.style.top = pos + "px";
                                if(self._cbmove) eval(self._cbmove + "()");
                                return true;
                        },
                        onmouseover: function( e ) {
                                var e=e?e:event;
                                this.className = this.className +' fd-slider-hover';
                                e.stopPropgation?e.stopPropagation():e.cancelBubble=true;
                                return false;
                        },
                        onmouseout: function( e ) {
                                var e=e?e:event;
                                this.className = this.className.replace(/fd\-slider\-hover/g,"");
                                e.stopPropgation?e.stopPropagation():e.cancelBubble=true;
                                return false;
                        },
                        onmousedown: function( e ) {
                                self._timer = null;
                                self._md = true;
                                var e = e?e:event;
                                self._mouseY = e.clientY;
                                self._handleY = parseInt(self._handle.style.top)||0;
                                self._handle.className = self._handle.className +' fd-slider-hover';

                                addEvent(document,'mousemove',self._events.trackmouse, false);
                                addEvent(document,'mouseup',self._events.onmouseup, false);

                                e.stopPropgation?e.stopPropagation():e.cancelBubble=true;
                                return false;
                        },
                        onmouseup: function( e ) {
                                self._handle.className = self._handle.className.replace("fd-slider-hover","");
                                e.stopPropgation?e.stopPropagation():e.cancelBubble=true;
                                removeEvent(document,'mousemove',self._events.trackmouse,false);
                                removeEvent(document,'mouseup',self._events.onmouseup, false);
                                if(self._cbstop) eval(self._cbstop + "()");
                        },
                        trackmouse: function( e ) {

                                var e=e?e:event;
                                var y = self._handleY + (e.clientY-self._mouseY);

                                if(y < 0) y = 0;
                                var max = self._wrapper.offsetHeight - self._handle.offsetHeight;
                                if(y > max) y = max;

                                self._handle.style.top = y + "px";

                                self.updateInput(y);
                                e.stopPropgation?e.stopPropagation():e.cancelBubble=true;
                                return false;
                        },
                        onclick: function( e ) {
                                if(self._md == true) {
                                        self._md = false;
                                        return;
                                }

                                self._timer = null;
                                var posy = 0;

                                if (!e) 
                                	var e = window.event;
                                if (e.pageY) 
                                	posy = e.pageY;
                                else if (e.clientY && document.documentElement) 
                                	posy = e.clientY  + document.documentElement.scrollTop;
                                else if (e.clientY) 
                                	posy = e.clientY  + document.body.scrollTop;

                                posy -= (self._y + Math.round(self._handle.offsetHeight/2));

                                if(posy < 0) 
                                	posy = 0;
                                else if(posy > self._wrapper.offsetHeight - self._handle.offsetHeight) 
                                	posy = self._wrapper.offsetHeight - self._handle.offsetHeight;

                                if(self._tween) self.tweenTo(posy);
                                else self._handle.style.top = Math.ceil(posy) + "px";
                        }
                };
                this.locate = function(){
                        var curleft = 0;
                        var curtop  = 0;
                        var obj = self._wrapper;

                        if (obj && obj.offsetParent) 
                        {
                        	while (obj && obj.offsetParent) 
                        	{
                          	curleft += obj.offsetLeft;
                            obj = obj.offsetParent;
                          };
                        }
                        else if (obj && obj.x)
                        	curleft += obj.x;

                        obj = self._wrapper;

                        if (obj && obj.offsetParent) 
                        {
                        	while (obj && obj.offsetParent) 
                        	{
                          	curtop += obj.offsetTop;
                            obj = obj.offsetParent;
                          };
                        }
                        else if (obj && obj.y)
                        	curtop += obj.y;

                        self._x = curleft;
                        self._y = curtop;
                };

                this.tweenTo = function(y){
                        self._tweenY = parseInt(y);
                        self._tweenB = parseInt(self._handle.style.top);
                        self._tweenC = y - parseInt(self._handle.style.top);
                        self._frame  = 0;

                        if (!self._timer) self._timer = setTimeout(self.tween,20);
                };

                this.tween = function(){
                        self._frame++;
                        var c = self._tweenC;
                        var d = 5;
                        var t = self._frame;
                        var b = self._tweenB;
                        var y = Math.ceil((t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b);

                        self._handle.style.top = y + "px";
                        self.updateInput(y);
                        if(t!=d && !self._md) self._timer = setTimeout(self.tween,10);
                        else {
                                self._handle.style.top = self._tweenY + "px";
                                self._timer = null;
                        				if(self._cbstop) eval(self._cbstop + "()");
                        };
                };

                this.updateInput = function(y) {
                        var max = self._wrapper.offsetHeight - self._handle.offsetHeight;
                        var inc = max / self._range;
                        var val = Math.ceil(self._min + (y / inc));
                        if(val < self._min) val = self._min;
                        else if(val > self._max) val = self._max;
                        self._inp.value = val;
                        if(self._cbmove) eval(self._cbmove + "()");
//                        if(self._cbstop) eval(self._cbstop + "()");
                };

								this.setNewPosition = function(y){
												self._inp.value = y;
												self.recalculate();
								};
								
                this.calcFromInput = function(){
                        var value = parseInt(self._inp.value) || self._min;
                        if(value < self._min) value = self._min;
                        else if(value > self._max) value = self._max;
                        
                        self._inp.value = value;

                        var max = self._wrapper.offsetHeight - self._handle.offsetHeight;
                        var inc = max / self._range;
                        var tot = value - self._min;

                        return Math.ceil(tot * inc);
                };

                this.build = function() {
                        var w = self._inp.parentNode.offsetWidth;
                        var h = self._inp.parentNode.offsetHeight;

                        if(self._hideInput) self._inp.style.display = "none";
                        else addEvent(self._inp,'change',self._events.onchange,false);

                        self._wrapper                   = document.createElement('div');
                        self._wrapper.className         = "fd-slider " + self._classname;

                        self._wrapper.onclick           = self._events.onclick;

                        self._bar                       = document.createElement('div');
                        self._bar.className             = "fd-slider-bar";

                        if(self._bar.unselectable)
                                self._bar.unselectable  = "on"; /* IE */

                        self._handle                    = document.createElement('div');
                        self._handle.className          = "fd-slider-handle";
                        
												var tmp = document.createElement('img');
												tmp.src = "/map/gfx/btn_slider.gif";

                        if(self._handle.unselectable)
                                self._handle.unselectable = "on"; /* IE */

                        self._handle.onmouseover        = self._events.onmouseover;
                        self._handle.onmouseout         = self._events.onmouseout;
                        self._handle.onmousedown        = self._events.onmousedown;

                        self._wrapper.appendChild(self._bar);
                        self._wrapper.appendChild(self._handle);
												self._handle.appendChild(tmp);

                        self._inp.parentNode.insertBefore(self._wrapper, self._inp);

                        self.recalculate();
                };

                this.resetPosition = function() {
                        var max = self._wrapper.offsetHeight - self._handle.offsetHeight;
                        var inc = max / self._range;
                        self._handle.style.top = Math.ceil(self._inp.value * inc) + "px";
                };

                this.recalculate = function() {
                        self.locate();

                        var sW = self._wrapper.offsetWidth;
                        var sH = self._wrapper.offsetHeight;

                        var hW = self._handle.offsetWidth;
                        var hH = self._handle.offsetHeight;
                        var bW = self._bar.offsetWidth;
                        var bH = self._bar.offsetHeight;
	
                        self._bar.style.height = Math.round(sH - hH) + "px";
                        self._bar.style.left = Math.round((sW - bW) / 2) + "px";

                        var pos = self.calcFromInput();
                        self._handle.style.top = pos + "px";
                        if(self._cbmove) eval(self._cbmove + "()");
                };
                var self = this;
                addEvent(window, 'resize', self.recalculate, false);
                self.build();
        };

        fdSliderController = {
                sliders: [],

                _construct: function( e ) {

                        var regExp_1 = /(fd_range_){1}([-]{0,1}[0-9]+){1}(_){1}([-]{0,1}[0-9]+){1}/ig;
                        var regExp_2 = /fd_cbmove_/ig;
                        var regExp_3 = /fd_classname_/ig;
                        var regExp_4 = /fd_hide_input/ig;
                        var regExp_5 = /fd_cbstop_/ig;

                        var inputs    = document.getElementsByTagName("input");
                        var classname = "";
                        var func      = "";
                        var hide      = false;
                        var tween     = true;

                        var cbmove, cbstop, cName, startIndex, range;

                        for(var i = 0, inp; inp = inputs[i]; i++) {
                                if(inp.className && inp.className.search(regExp_1) != -1) {
                                        // range..
                                        cName      = inp.className;
                                        startIndex = cName.search(regExp_1);
                                        cName      = cName.substring(startIndex, cName.length);

                                        range = cName.indexOf(' ') != -1 ? cName.substring(0, cName.indexOf(' ')) : cName.substring(0, cName.length);
                                        range = range.replace(/fd_range_/ig, '');
                                        range = range.split('_');

                                        // callback function
                                        func         = inp.className;
                                        cbmove       = "";
                                        startIndex   = func.search(regExp_2);

                                        if(startIndex != -1) {
                                                func    = func.substring(startIndex, func.length);
                                                func    = func.indexOf(' ') != -1 ? func.substring(0, func.indexOf(' ')) : func;
                                                cbmove  = func.replace(/fd_cbmove_/ig, '');
                                        };

                                        // callback function
                                        func         = inp.className;
                                        cbstop       = "";
                                        startIndex   = func.search(regExp_5);

                                        if(startIndex != -1) {
                                                func    = func.substring(startIndex, func.length);
                                                func    = func.indexOf(' ') != -1 ? func.substring(0, func.indexOf(' ')) : func;
                                                cbstop  = func.replace(/fd_cbstop_/ig, '');
                                        };

                                        // classname
                                        cname      = inp.className;
                                        classname  = "";
                                        startIndex = cname.search(regExp_3);

                                        if(startIndex != -1) {
                                                cname     = cname.substring(startIndex, cname.length);
                                                cname     = cname.indexOf(' ') != -1 ? cname.substring(0, cname.indexOf(' ')) : cname;
                                                classname = cname.replace(/fd_classname_/ig, '');
                                        };

                                        // hide input
                                        hide  = inp.className.search(regExp_4) != -1;

                                        // tween
                                        tween = inp.className.search(/fd_tween/ig) != -1;

                                        fdSliderController.sliders[fdSliderController.sliders.length] = new fdSlider(inp, range, cbmove, cbstop, classname, hide, tween);
                                }
                        }

                },

                _deconstruct: function( e ) {
                        /* TODO: Clean up IE memory leaks */
                }
        }
})();

