/*mcTep mctep77@gmail.com 26.10.2009*/
function fjScrollingList(jQueryExpr, settings){
    var settings = settings == undefined ? {} : settings;
    var defaultSettings = {
        id: "",
        style: {},
        speed: 5,
        timeout: 100,
        event: "mousedown", //mouseover
        verticalScroll: true,
        horizontalScroll: false,
        containerStyle: {},
        ajaxUpload: false,
        ajaxFunction: function(){
            //			var img = getContainer().children("ul").children("li:last").children("img");
            //			if (!ajaxProcess) {
            //				ajaxProcess	= true;
            //				JsHttpRequest.query(
            //					"?ajax&lastId="+img.attr("id"),
            //					{},
            //					function(result, error) {
            //						getImage(result, error)
            //					},
            //					false
            //				);
            //			}
        },
        mode: "",
        zoom: false
    };
    
    function getImage(result, error){
        if (result != undefined) {
            getContainer().width(getContainer().width() + 500);
            getContainer().children("ul").append("<li><img src=\"" + result.src + "\" id=\"" + result.id + "\"/></li>");
            getContainer().width(getContainer().children("ul").width() + 60);
        }
        ajaxProcess = false;
    }
    
    var self = this;
    self.move = false;
    var mouse;
    
    //self.JsHttpRequest = new JsHttpRequest();
    var ajaxProcess = false;
    this.setId = function(id){
        if (id != undefined) 
            self.id = id;
        return self;
    }
    
    this.setSpeed = function(speed){
        if (speed != undefined) 
            self.speed = speed;
        return self;
    }
    
    this.setTimeout = function(timeout){
        if (timeout != undefined) 
            self.timeout = timeout;
        return self;
    }
    
    this.setStyle = function(style){
        if (style != undefined) {
            self.style = style;
            self.jqObject.find(".scrolling-list").css(style);
        }
        return self;
    }
    
    this.setEvent = function(event){
        if (event != undefined) {
            self.event = event;
            if (self.event == "mousedown") {

                               /*downDiv.mousemove(function() {
                                   clearTimeout(downTimeout);
                               });
                               upDiv.mousemove(function() {
                                   clearTimeout(upTimeout);
                               });
                               leftDiv.mousemove(function() {
                                   clearTimeout(leftTimeout);
                               });
                               rightDiv.mousemove(function() {
                                   clearTimeout(rightTimeout);
                               });*/

                downDiv.bind("mousedown", moveDown);
                downDiv.mouseup(function(){
                    clearTimeout(downTimeout);
                });
				downDiv.mouseout(function(){
                    clearTimeout(downTimeout);
                });
				
                upDiv.bind("mousedown", moveUp);
                upDiv.mouseup(function(){
                    clearTimeout(upTimeout);
                });
                upDiv.mouseout(function(){
                    clearTimeout(upTimeout);
                });
							
                leftDiv.bind("mousedown", moveLeft);
                leftDiv.mouseup(function(){
                    clearTimeout(leftTimeout);
                });
                leftDiv.mouseout(function(){
                    clearTimeout(leftTimeout);
                });
                
                rightDiv.bind("mousedown", moveRight);
                rightDiv.mouseup(function(){
                    clearTimeout(rightTimeout);
                });
				rightDiv.mouseout(function(){
                    clearTimeout(rightTimeout);
                });
            }
            
            if (self.event == "mouseover") {
                downDiv.bind("mouseover", moveDown);
                downDiv.mouseout(function(){
                    clearTimeout(downTimeout);
                });
                
                upDiv.bind("mouseover", moveUp);
                upDiv.mouseout(function(){
                    clearTimeout(upTimeout);
                });
                
                leftDiv.bind("mouseover", moveLeft);
                leftDiv.mouseout(function(){
                    clearTimeout(leftTimeout);
                });
                
                rightDiv.bind("mouseover", moveRight);
                rightDiv.mouseout(function(){
                    clearTimeout(rightTimeout);
                });
            }
            
            downDiv.mouseover(function(){
                var container = getContainer();
                var top = container.css("top");
                top = top.length >= 3 ? top.substr(0, top.length - 2) : top;
                top = top * 1;
                if (top > (-1 * (container.height() - jqObject.height()))) {
                    downImg.attr("src", "/static/themes/prioskol/images/arrow.down.hover.gif");
                }
            });
            
            downDiv.mouseout(function(){
                downImg.attr("src", "/static/themes/prioskol/images/arrow.down.gif");
            });
            
            upDiv.mouseover(function(){
                var container = getContainer();
                var top = container.css("top");
                top = top.length >= 3 ? top.substr(0, top.length - 2) : top;
                top = top * 1;
                if (top < 0) {
                    upImg.attr("src", "/static/themes/prioskol/images/arrow.up.hover.gif");
                }
            });
            
            upDiv.mouseout(function(){
                upImg.attr("src", "/static/themes/prioskol/images/arrow.up.gif");
            });
            
            leftDiv.mouseover(function(){
                var container = getContainer();
                var left = container.css("left");
                left = left.length >= 3 ? left.substr(0, left.length - 2) : left;
                left = left * 1;
                if (left < 0) {
                    leftImg.attr("src", "/static/themes/prioskol/images/arrow.left.hover.gif");
                }
            });
            
            leftDiv.mouseout(function(){
                leftImg.attr("src", "/static/themes/prioskol/images/arrow.left.gif");
            });
            
            rightDiv.mouseover(function(){
                var container = getContainer();
                var left = container.css("left");
                left = left.length >= 3 ? left.substr(0, left.length - 2) : left;
                left = left * 1;
                if ((left) > (-1 * (container.width() - jqObject.width()))) {
                    rightImg.attr("src", "/static/themes/prioskol/images/arrow.right.hover.gif");
                }
            });
            
            rightDiv.mouseout(function(){
                rightImg.attr("src", "/static/themes/prioskol/images/arrow.right.gif");
            });
        }
        return self;
    }
    
    this.setHorizontalScroll = function(horizontalScroll){
        if (horizontalScroll != undefined) {
            self.horizontalScroll = horizontalScroll;
            if (self.horizontalScroll) {
                leftDiv.removeClass("hidden");
                rightDiv.removeClass("hidden");
            } else {
                leftDiv.addClass("hidden");
                rightDiv.addClass("hidden");
            }
        }
        return self;
    }
    
    this.setVerticalScroll = function(verticalScroll){
        if (verticalScroll != undefined) {
            self.verticalScroll = verticalScroll;
            if (self.verticalScroll) {
                upDiv.removeClass("hidden");
                downDiv.removeClass("hidden");
            } else {
                upDiv.addClass("hidden");
                downDiv.addClass("hidden");
            }
        }
        return self;
    }
    
    this.setContainerStyle = function(containerStyle){
        if (containerStyle != undefined) {
            self.containerStyle = containerStyle;
            getContainer().css(containerStyle);
        }
        return self;
    }
    
    this.setAjaxUpload = function(ajaxUpload){
        if (ajaxUpload != undefined) {
            self.ajaxUpload = ajaxUpload;
        }
        return self;
    }
    
    this.setAjaxFunction = function(ajaxFunction){
        if (ajaxFunction != undefined) {
            self.ajaxFunction = ajaxFunction;
        }
        return self;
    }
    
    this.setMode = function(mode){
        if (mode != undefined) {
            self.mode = mode;
            if (self.mode == "extra") {
                $(document.window).mousemove(function(e){
                    var left = jqObject.offset().left;
                    var width = jqObject.width();
                    var leftBorder = left + width / 2 - 30 - e.pageX;
                    var rightBorder = left + width / 2 + 30 - e.pageX;
                    mouse = e;
                    if (!self.move) {
                        if (leftBorder > 0) {
                            moveLeft();
                        }
                        if (rightBorder < 0) {
                            moveRight();
                        }
                    }
                    if ((leftBorder < 0) && (rightBorder > 0)) {
                        self.move = false;
                        clearTimeout(leftTimeout);
                        clearTimeout(rightTimeout);
                    }
                    
                    //screen page client
                });
            }
        }
        return self;
    }
    
    function upZoom(){
        self.zoomFunc(zoomImg, zoomEnd - 1);
    }
    function downZoom(){
        self.zoomFunc(zoomImg, zoomEnd + 1);
    }
    var zoomImg;
    var zoomEnd;
    var zoomTimeout;
    this.zoomFunc = function(obj, zoomPx){
        zoomImg = obj;
        zoomEnd = zoomPx;
        if (obj.width() < 100) {
            obj.width(90 + (11 - zoomPx));
            obj.height(90 + (11 - zoomPx));
            clearTimeout(zoomTimeout);
            zoomTimeout = setTimeout(upZoom, 50);
        }
        if (obj.width() < 100) {
            obj.width(100 - (9 + zoomPx));
            obj.height(100 - (9 + zoomPx));
            clearTimeout(zoomTimeout);
            zoomTimeout = setTimeout(downZoom, 50);
        }
        if (zoomPx == 0) {
            clearTimeout(zoomTimeout);
        }
    }
    
    this.setZoom = function(zoom){
        if (zoom != undefined) {
            self.zoom = zoom;
            if (self.zoom) {
                var images = getContainer().find("img");
                for (var i = 0; i < images.length; i++) {
                    images.eq(i).mouseover(function(){
                        $(this).stop();
                        $(this).animate({
                            width: "100px",
                            height: "100px",
                            marginTop: "0px"
                        }, "slow");
                    });
                    images.eq(i).mouseout(function(){
                        $(this).stop();
                        $(this).animate({
                            width: "90px",
                            height: "90px",
                            marginTop: "13px"
                        }, "slow");
                    });
                }
            }
        }
        return self;
    }
    
    this.getId = function(){
        return self.id;
    }
    
    var jqObject = $($(jQueryExpr)[0]);
    self.jqObject = jqObject;
    var width = jqObject.children("ul").width();
    //width = jqObject.children("ul").children("li").length * 100;
    
    if (settings.horizontalScroll) 
        width = jqObject.children("ul").children("li").length * 185;
    if (settings.verticalScroll)
		width = settings.style.width; 
    jqObject.children("*").wrap("<div class=\"scrolling-list-container\"></div>");
    jqObject.children("*").wrap("<div class=\"scrolling-list\"></div>");
    getContainer().width(width);
    var upDiv = $(document.createElement("div"));
    upDiv.addClass("scrolling-list-up");
    var downDiv = $(document.createElement("div"));
    downDiv.addClass("scrolling-list-down");
    var upImg = $(document.createElement("img"));
    upImg.attr({
        src: "/static/themes/prioskol/images/arrow.up.gif",
        alt: "вверх"
    });
    upDiv.append(upImg);
    var downImg = $(document.createElement("img"));
    downImg.attr({
        src: "/static/themes/prioskol/images/arrow.down.gif",
        alt: "вниз"
    });
    downDiv.append(downImg);
    upDiv.addClass("hidden");
    downDiv.addClass("hidden");
    jqObject.append(upDiv);
    jqObject.append(downDiv);
    
    var leftDiv = $(document.createElement("div"));
    leftDiv.addClass("scrolling-list-left");
    var rightDiv = $(document.createElement("div"));
    rightDiv.addClass("scrolling-list-right");
    var relLeftDiv = $(document.createElement("div"));
    relLeftDiv.addClass("scrolling-list-left-relative");
    var relRightDiv = $(document.createElement("div"));
    relRightDiv.addClass("scrolling-list-right-relative");
    var leftImg = $(document.createElement("img"));
    leftImg.attr({
        src: "/static/themes/prioskol/images/arrow.left.gif",
        alt: "влево"
    });
    relLeftDiv.append(leftImg);
    leftDiv.append(relLeftDiv);
    var rightImg = $(document.createElement("img"));
    rightImg.attr({
        src: "/static/themes/prioskol/images/arrow.right.gif",
        alt: "вправо"
    });
    relRightDiv.append(rightImg);
    rightDiv.append(relRightDiv);
    leftDiv.addClass("hidden");
    rightDiv.addClass("hidden");
    jqObject.append(leftDiv);
    jqObject.append(rightDiv);
    
    applySettings(defaultSettings, settings);
    
    var upTimeout;
    function moveUp(){
        var container = getContainer();
        var top = container.css("top");
        top = top.length >= 3 ? top.substr(0, top.length - 2) : top;
        top = top * 1;
        if (top < 0) {
            container.css("top", (top + self.speed) + "px");
        } else 
            if (top >= 0) {
                container.css("top", "0px");
                upImg.attr("src", "/static/themes/prioskol/images/arrow.up.gif");
            }
        upTimeout = setTimeout(moveUp, self.timeout);
    }
    
    var downTimeout;
    function moveDown(){
        var container = getContainer();
        var top = container.css("top");
        top = top.length >= 3 ? top.substr(0, top.length - 2) : top;
        if (top > (-1 * (container.height() - jqObject.height()))) {
            container.css("top", (top - self.speed) + "px");
        } else 
            if ((top <= (-1 * (container.height() - jqObject.height()))) && (jqObject.height() < container.height())) {
                container.css("top", (-1 * (container.height() - jqObject.height())) + "px");
                downImg.attr("src", "/static/themes/prioskol/images/arrow.down.gif");
            }
        downTimeout = setTimeout(moveDown, self.timeout);
    }
    
    var leftTimeout;
    function moveLeft(e){
        var left = jqObject.offset().left;
        var width = jqObject.width();
        //var pos = left + width / 2 - 30 - mouse.pageX;
        var pos = 200;
        //pos = pos > 200 ? 200 : pos;
        self.move = true;
        var container = getContainer();
        var left = container.css("left");
        left = left.length >= 3 ? left.substr(0, left.length - 2) : left;
        left = left * 1;
        if (left < 0) {
            container.css("left", left + pos / 45 + "px");
        } else 
            if (left >= 0) {
                ///container.children("ul").prepend(container.find("li:last"));
                container.css("left", "0px");
            }
        leftTimeout = setTimeout(moveLeft, 1);
    }
    
    var rightTimeout;
    function moveRight(e){
        var left1 = jqObject.offset().left;
        var width = jqObject.width();
        //var pos = left1 + width / 2 + 30 - mouse.pageX;
        //pos = pos < -300 ? -300 : pos;
        var pos = -200;
        self.move = true;
        var container = getContainer();
        var left = container.css("left");
        left = left.length >= 3 ? left.substr(0, left.length - 2) : left;
        var bord = (-1 * (container.width() - jqObject.width()));
        if (left > bord) {
            container.css("left", (left * 1 + 1 * pos / 45) + "px");
        } else 
            if (left <= (bord)) {
				//$(".inn").text(bord);
                container.css("left", bord + "px");
            ///container.children("ul").append(container.find("li:first"));
            }
        rightTimeout = setTimeout(moveRight, 1);
    }
    
    function applySettings(defaultSettings, settings){
        for (i in defaultSettings) {
            if (settings[i] != undefined) {
                self["set" + ucfirst(i)](settings[i]);
            } else {
                self["set" + ucfirst(i)](defaultSettings[i]);
            }
        }
    }
    
    function getContainer(){
        return jqObject.find(".scrolling-list-container");
    }
}

function ucfirst(str){
    str += "";
    var res = str.charAt(0).toUpperCase();
    return res + str.substr(1);
}

