/**
 * @author Vladimir Buhuru
 */

 
TOOLS = {};
TOOLS.String = {};
TOOLS.Func = {};
TOOLS.DOM = {};
TOOLS.Event = {};

/**
 * .makeRepeat -- create an anonymous function witch calls func throw setTimeout
 * 
 * @param: func    - function to repeat
 * @param: times   - times to repeat
 * @param: delay   - delay betwen calls in milliseconds
 * 
 * @return: function
 **/

 //# var foo = function(m){ alert (m); };
 //# var periodicFoo = TOOLS.Func.makeRepeat(foo , 3 , 2000);
 //# periodicFoo("User friendly message"); -- will call foo() 3 times with a delay of 2 seconds between each time


TOOLS.Func.makeRepeat = function (func , times, delay){
    return function() {
    if(times-- > 0) {
      fn.apply(null, arguments);
      var args = Array.prototype.slice.call(arguments);
      var self = arguments.callee;
      setTimeout(function(){self.apply(null,args)}, delay);
    }
  };
}

/**
 * .makeWrap -- wrap an func with anonymous function with predefined list of arguments
 * 
 * @param: arguments - predefined list of arguments with function to wrap 
 * 
 * @return: function
 */

//# var foo = function (m){ alert (m); };
//# var wrapedFoo = TOOLS.Func.makeWrap(foo, "Title: ");
//# wrapedFoo("attention message");  -- will alert "Title: attention message"

TOOLS.Func.makeWrap = function (){
    var args = Array.prototype.slice.call(arguments);
    var func = args.shift();
    return function() {
       return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
    };
}

/**
 * .format  -- replace %1 -- %n with string arguments follow up formated string
 * 
 *  @param: string  - formated string
 *  @param: -- optional String arguments
 *  
 *  @return String
 */

//# TOOLS.String.format("%1 eat the %2" , "Cat" , "Dog") -- will return  Cat eat the Dog;

TOOLS.String.format = function (string){
    var args = arguments;
    var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
    return String(string).replace(pattern, function(match, index) {
        return args[index];
        });
}




TOOLS.DOM.$className = 
/*
    Developed by Robert Nyman, http://www.robertnyman.com
    Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/  
 function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = [],
                elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
                current,
                returnElements = [],
                match;
            for(var k=0, kl=classes.length; k<kl; k+=1){
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for(var l=0, ll=elements.length; l<ll; l+=1){
                current = elements[l];
                match = false;
                for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
                    match = classesToCheck[m].test(current.className);
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };

		
TOOLS.DOM.addClassName = function (elm , sNewClassName){
	return elm.className = elm.className  + " " + sNewClassName;
	
}

TOOLS.DOM.removeClassName = function (elm , sBadClassName){
	var oldClassName = elm.className;
	var reg = new RegExp(sBadClassName);
	return elm.className = oldClassName.replace(reg, "");
}


TOOLS.Event.winOnLoad  = function (handler){
    if (window.addEventListener) {
      window.addEventListener('DOMContentLoaded', handler, false);
     // window.addEventListener('load', handler, false);
    } else if (window.attachEvent){
		window.attachEvent('onload', handler);
	} else{
		window.onload = handler;
	}
      
}