﻿// .bind() from Prototype lib

function $A(iterable) {
    if (!iterable) return [];
    if (iterable.toArray) return iterable.toArray();
    var length = iterable.length || 0, results = new Array(length);
    while (length--) results[length] = iterable[length];
    return results;
}

Function.prototype.bind = function() {
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
        return __method.apply(object, args.concat($A(arguments)));
    }
};

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(elt /*, from*/) {
        var len = this.length >>> 0;

        var from = Number(arguments[1]) || 0;
        from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
        if (from < 0)
            from += len;

        for (; from < len; from++) {
            if (from in this && this[from] === elt)
                return from;
        }
        return -1;
    };
}

function capitalize(strSentence) {
    return strSentence.toLowerCase().replace(/\b[a-z]/g, convertToUpper);

    function convertToUpper() {
        return arguments[0].toUpperCase();
    }
}


// execute param and if true = then show, else hide
jQuery.fn.showhide = function(pf) {
   
    return this.each(function(i, n) {
        var res = $.isFunction(pf) ? pf.bind(this)() : pf;

        res ? $(this).show() : $(this).hide();
    });
}

jQuery.fn.valif = function(cond, setv) {
    return cond === true ? this.val(setv) : this;
}

// name - attr name
// choise - array of varients, to toggle with
jQuery.fn.toggleAttr = function(name, choise) {

    if (choise.length == 0) return this;

    return this.each(function(i, n) {
        var value = $(n).attr(name);

        function next() {
            var ind = choise.indexOf(value);
            if (ind == -1) return;
            if (choise[ind + 1] !== undefined) {
                return choise[ind + 1];
            } else {
                if (ind != 0) { return choise[0]; } else { return choise[ind]; }
            }
        }

        $(n).attr(name, next());
    });
}

jQuery.fn.slide = function(pf) {

    return this.each(function(i, n) {
        var res = $.isFunction(pf) ? pf.bind(this)() : pf;

        res ? $(this).slideDown('slow') : $(this).slideUp('slow');
    });
}

// short hover
jQuery.fn.hoverClass = function(klass, inquery) {
    // if inquery, than you wish on hover of element, put over to several elements inside
    return this.hover(
        function() {
            var who = $(this);
            
            if (inquery) { who = $(this).find(inquery) }

            who.addClass(klass);
        },
        function() {
            var who = $(this);

            if (inquery) { who = $(this).find(inquery) }
            
            who.removeClass(klass);
        }
    );
}

jQuery.fn.addClassIf = function(cond, setv){
    return cond === true ? this.addClass(setv) : this;
}

jQuery.fn.hoverConnectClass = function(klass, klassesConnect) {
    return this.hover(
        function() {
            var d = $(this);
            
            // returns klasses that exist with '-' connected
            var connected =
                $.grep(klassesConnect, function(n, i) { return d.hasClass(n); })
                       .join('-');

            d.addClass((connected ? connected + '-' : '') + klass);
        },
        function() {

            var d = $(this);

            // returns klasses that exist with '-' connected
            var connected =
                $.grep(klassesConnect, function(n, i) { return d.hasClass(n); })
                       .join('-');

            d.removeClass((connected ? connected + '-' : '') + klass);
        }
    );
}

jQuery.fn.isinput = function() {

    var inputs = $.grep(this, function(n, i) {
        if ($(n).is('input, .control')) return true;
    });

    return inputs.length != 0;
}

function first(obj) {
    for (i in obj) {
        return i;
    }
}
