(function ($, undefined) {
    $.extend(_NH, {
        presets: {
            zoomer: {
                "reverseWay": false,
                "duration": 800,
                "interval": 1,
                "blocksX": "1",
                "blocksY": "1",
                "easing": "",
                "way": "lines",
                "anim": "zoomer",
                k: 1.8,
                crds: {
                    bottom: 0,
                    right: 0
                }
            },
            fadeThree: {
                "reverseWay": false,
                "duration": 800,
                "interval": 1,
                "blocksX": "1",
                "blocksY": "1",
                "easing": "",
                "way": "lines",
                "anim": "fadeThree"
            },
            simpleFade: {
                "reverseWay": false,
                "duration": 800,
                "interval": 1,
                "blocksX": "1",
                "blocksY": "1",
                "easing": "",
                "way": "lines",
                "anim": "fade"
            },
            gSlider: {
                "reverseWay": false,
                "duration": 400,
                "interval": 40,
                "blocksX": "1",
                "blocksY": "1",
                "easing": "",
                "way": "lines",
                "anim": "gSlider"
            },
            vSlider: {
                "reverseWay": false,
                "duration": 400,
                "interval": 40,
                "blocksX": "1",
                "blocksY": "1",
                "easing": "",
                "way": "lines",
                "anim": "vSlider"
            },
            slideFromLeft: {
                "reverseWay": false,
                "duration": 800,
                "interval": 1,
                "blocksX": "1",
                "blocksY": "1",
                "easing": "easeOutBack",
                "way": "lines",
                "anim": "slideFromLeft"
            },
            slideFromTop: {
                "reverseWay": false,
                "duration": 800,
                "interval": 1,
                "blocksX": "1",
                "blocksY": "1",
                "easing": "easeOutBack",
                "way": "lines",
                "anim": "slideFromTop"
            },
            diagonalFade: {
                "reverseWay": false,
                "duration": 400,
                "interval": 40,
                "blocksX": 12,
                "blocksY": 6,
                "easing": "easeInQuad",
                "way": "diagonal",
                "anim": "fade"
            },
            diagonalExpand: {
                "reverseWay": false,
                "duration": 400,
                "interval": 40,
                "blocksX": 12,
                "blocksY": 6,
                "easing": "easeInQuad",
                "way": "diagonal",
                "anim": "expand"
            },
            fadeFromCenter: {
                "reverseWay": true,
                "duration": 600,
                "interval": 10,
                "blocksX": "10",
                "blocksY": "6",
                "easing": "",
                "way": "spiral",
                "anim": "fade"
            },
            zabor: {
                "reverseWay": true,
                "duration": 800,
                "interval": 40,
                "blocksX": "15",
                "blocksY": "1",
                "easing": "",
                "way": "lines",
                "anim": "slideRight"
            },
            vertivalLines: {
                "reverseWay": false,
                "duration": 600,
                "interval": 1,
                "blocksX": 12,
                "blocksY": 1,
                "easing": "swing",
                "way": "lines",
                "anim": "vSlideOdd"
            },
            gorizontalLines: {
                "reverseWay": false,
                "duration": 600,
                "interval": 1,
                "blocksX": 1,
                "blocksY": 12,
                "easing": "swing",
                "way": "lines",
                "anim": "gSlideOdd"
            }
        },
        ways: {
            lines: function () {
                var opt = this
                for (var ret = [], i = 0; i < opt.maskC.length; i++)
                ret.push(opt.maskC.eq(i))
                return ret
            },
            spiral: function () {
                var opt = this,
                    ret = [],
                    step = 0,
                    h = opt.blocksY,
                    w = opt.blocksX,
                    x, y, i, lr = function () {
                        for (i = step; i < w - 1 - step; i++)
                        if (ret.length < opt.maskC.length) ret.push(opt.matrix[step][i])
                        else return false
                        rb()
                    },
                    rb = function () {
                        for (i = step; i < h - 1 - step; i++)
                        if (ret.length < opt.maskC.length) ret.push(opt.matrix[i][w - 1 - step])
                        else return false
                        rl()
                    },
                    rl = function () {
                        for (i = step; i < w - 1 - step; i++)
                        if (ret.length < opt.maskC.length) ret.push(opt.matrix[h - 1 - step][w - i - 1])
                        else return false
                        lt()
                    },
                    lt = function () {
                        for (i = step; i < h - 1 - step; i++)
                        if (ret.length < opt.maskC.length) ret.push(opt.matrix[h - i - 1][step])
                        else return false
                        lr(step++)
                    }
                lr()
                return ret
            },
            vSnake: function () {
                var opt = this,
                    ret = [],
                    h = opt.blocksY,
                    w = opt.blocksX,
                    j, i
                for (i = 0; i < w; i++)
                for (j = 0; j < h; j++)
                if (i * .5 == ~~ (i / 2)) ret.push(opt.matrix[j][i])
                else ret.push(opt.matrix[h - 1 - j][i])
                return ret
            },
            gSnake: function () {
                var opt = this,
                    ret = [],
                    h = opt.blocksY,
                    w = opt.blocksX,
                    j, i
                for (i = 0; i < h; i++)
                for (j = 0; j < w; j++)
                if (i * .5 == ~~ (i / 2)) ret.push(opt.matrix[i][j])
                else ret.push(opt.matrix[i][w - 1 - j])
                return ret
            },
            diagonal: function () {
                var opt = this,
                    ret = [],
                    h = opt.blocksY,
                    w = opt.blocksX,
                    i = j = n = 0
                for (i = 0; i < w; i++)
                for (ret[i] = [], j = 0; j <= i; j++)
                if (j < h) ret[i].push(opt.matrix[j][i - j])
                for (i = 1; i < h; i++)
                for (j = 0, ret[n = ret.length] = []; j < h - i; j++)
                ret[n].push(opt.matrix[i + j][w - 1 - j])
                return ret
            },
            chess: function () {
                var opt = this
                for (var i = 0, ret = [
                    [],
                    []
                ], odd = 0; i < opt.maskC.length; i++)
                ret[odd = odd ? 0 : 1].push(opt.maskC.eq(i))
                return ret
            },
            randomly: function () {
                var opt = this
                for (var ret = [], n = i = 0; i < opt.maskC.length; i++)
                ret.push(opt.maskC.eq(i))
                for (i = 0; i < opt.maskC.length; i++)
                ret.push(ret.splice(parseInt(Math.random() * opt.maskC.length - 1), 1)[0])
                return ret
            }
        },

        anims: {
            fadeThree: function (el, last) {
                var _ = this
                $(el).each(function (i) {
                    var th = $(this).show().css({
                        left: -_.width / 4,
                        top: 0,
                        zIndex: 2
                    }),
                        clone = th.clone().appendTo(th.parent()).css({
                            left: _.width / 4,
                            top: _.height / 4,
                            zIndex: 1
                        }),
                        clone2 = th.clone().appendTo(th.parent()).css({
                            left: 0,
                            top: -_.height / 4,
                            zIndex: 1
                        })
                        clone.stop().animate({
                            left: 0,
                            top: 0
                        }, {
                            duration: _.duration,
                            easing: _.easing
                        })
                        clone2.stop().animate({
                            left: 0,
                            top: 0
                        }, {
                            duration: _.duration,
                            easing: _.easing
                        })
                        th.stop().animate({
                            left: 0,
                            top: 0
                        }, {
                            duration: _.duration,
                            easing: _.easing,
                            step: function (now) {
                                var pc = now / _.width,
                                    opa = 1 + pc
                                    clone.css({
                                        opacity: opa * opa
                                    })
                                    clone2.css({
                                        opacity: opa * opa
                                    })
                                    th.css({
                                        opacity: opa * opa * opa
                                    })
                            },
                            complete: function () {
                                if (last) _.afterShow()
                                clone.remove()
                                clone2.remove()
                            }
                        })
                })
            },
            zoomer: function (el, last) {
                var _ = this
                $(el).each(function () {
                    var th = $(this),
                        img = $(new Image()),
                        from = _.direction > 0 ? _.width * _.k : _.width,
                        to = _.direction > 0 ? _.width : _.width * _.k
                        console.log(from + ' ' + to)
                        img.css({
                            position: 'absolute',
                            zIndex: 0,
                            opacity: 0
                        }).css(_.crds).appendTo(_.pic).load(function () {
                            _.pic.find('img').not(img).remove()
                            img.css({
                                width: from,
                                height: 'auto'
                            }).stop().animate({
                                opacity: 1
                            }, {
                                duration: 200
                            }).animate({
                                width: to
                            }, {
                                duration: _.duration,
                                easing: _.easing
                            })
                            setTimeout(function () {
                                if (last) _.afterShow()
                            }, 400)
                        }).attr({
                            src: _.next
                        })
                })
            },
            fade: function (el, last) {
                var opt = this
                $(el).each(function () {
                    $(this).css({
                        opacity: 0
                    }).show().stop().animate({
                        opacity: 1
                    }, {
                        duration: +opt.duration,
                        easing: opt.easing,
                        complete: function () {
                            if (last) opt.afterShow()
                        }
                    })
                })
            },
            expand: function (el, last) {
                var opt = this
                $(el).each(function () {
                    $(this).hide().show(+opt.duration, function () {
                        if (last) opt.afterShow()
                    })
                })
            },
            slideDown: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this).show(),
                        h = th.height()
                        th.css({
                            height: 0
                        }).stop().animate({
                            height: h
                        }, {
                            duration: opt.duration,
                            easing: opt.easing,
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                })
            },
            slideLeft: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this).show(),
                        w = th.width()
                        th.css({
                            width: 0
                        }).stop().animate({
                            width: w
                        }, {
                            duration: opt.duration,
                            easing: opt.easing,
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                })
            },
            slideUp: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this).show(),
                        h = th.height(),
                        l = th.attr('offsetLeft'),
                        t = th.attr('offsetTop')
                        th.css({
                            height: 0,
                            top: t + h
                        }).stop().animate({
                            height: h
                        }, {
                            duration: opt.duration,
                            easing: opt.easing,
                            step: function (now) {
                                var top = t + h - now
                                th.css({
                                    top: top,
                                    backgroundPosition: '-' + l + 'px -' + top + 'px'
                                })
                            },
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                })
            },
            slideRight: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this).show(),
                        w = th.width(),
                        l = th.attr('offsetLeft'),
                        t = th.attr('offsetTop')
                        th.css({
                            width: 0,
                            left: l + w
                        }).stop().animate({
                            width: w
                        }, {
                            duration: opt.duration,
                            easing: opt.easing,
                            step: function (now) {
                                var left = l + w - now
                                th.css({
                                    left: left,
                                    backgroundPosition: '-' + left + 'px -' + t + 'px'
                                })
                            },
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                })
            },
            slideFromTop: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this),
                        t = th.show().css('top'),
                        h = th.height()
                        th.css({
                            top: -h
                        }).stop().animate({
                            top: t
                        }, {
                            duration: +opt.duration,
                            easing: opt.easing,
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                })
            },
            slideFromDown: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this),
                        t = th.show().css('top'),
                        h = th.height()
                        th.css({
                            top: h
                        }).stop().animate({
                            top: t
                        }, {
                            duration: +opt.duration,
                            easing: opt.easing,
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                })
            },
            slideFromLeft: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this),
                        l = th.show().css('left'),
                        w = th.width()
                        th.css({
                            left: -w
                        }).stop().animate({
                            left: l
                        }, {
                            duration: +opt.duration,
                            easing: opt.easing,
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                })
            },
            slideFromRight: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this),
                        l = th.show().css('left'),
                        w = th.width()
                        th.css({
                            left: w
                        }).stop().animate({
                            left: l
                        }, {
                            duration: +opt.duration,
                            easing: opt.easing,
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                })
            },
            gSlider: function (el, last) {
                var opt = this,
                    clone = opt.maskC.clone(),
                    w = clone.width()
                    clone.appendTo(opt.maskC.parent()).css({
                        background: opt.pic.css('backgroundImage')
                    }).show()
                    el.show().css({
                        left: opt.direction > 0 ? -w : w
                    }).stop().animate({
                        left: 0
                    }, {
                        duration: +opt.duration,
                        easing: opt.easing,
                        step: function (now) {
                            if (opt.direction > 0) clone.css('left', now + w)
                            else clone.css('left', now - w)
                        },
                        complete: function () {
                            clone.remove()
                            if (last) opt.afterShow()
                        }
                    })
            },
            vSlider: function (el, last) {
                var opt = this,
                    clone = opt.maskC.clone(),
                    h = clone.height()
                    clone.appendTo(opt.maskC.parent()).css({
                        background: opt.pic.css('backgroundImage')
                    }).show()
                    el.show().css({
                        top: opt.direction > 0 ? -h : h
                    }).stop().animate({
                        top: 0
                    }, {
                        duration: +opt.duration,
                        easing: opt.easing,
                        step: function (now) {
                            if (opt.direction > 0) clone.css('top', now + h)
                            else clone.css('top', now - h)
                        },
                        complete: function () {
                            clone.remove()
                            if (last) opt.afterShow()
                        }
                    })
            },
            vSlideOdd: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this),
                        t = th.show().css('top'),
                        h = th.height(),
                        odd = opt.odd
                        th.css({
                            top: odd ? -h : h
                        }).stop().animate({
                            top: t
                        }, {
                            duration: +opt.duration,
                            easing: opt.easing,
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                        opt.odd = opt.odd ? false : true

                })
            },
            gSlideOdd: function (el, last) {
                var opt = this
                $(el).each(function () {
                    var th = $(this),
                        l = th.show().css('left'),
                        w = th.width(),
                        odd = opt.odd
                        th.css({
                            left: odd ? -w : w
                        }).stop().animate({
                            left: l
                        }, {
                            duration: +opt.duration,
                            easing: opt.easing,
                            complete: function () {
                                if (last) opt.afterShow()
                            }
                        })
                        opt.odd = opt.odd ? false : true

                })
            }
        }
    })
})(jQuery)
