﻿function Namespace(name, separator){
    var ns = name.split(separator || '.'), p = window, i;
    for (i = 0; i < ns.length; i++) {
        p = p[ns[i]] = p[ns[i]] || {};
    }
}
function Extend(object, source){
    for(var k in source) if(typeof object[k] == "undefined") object[k] = source[k];
}

Namespace("GenClick.Utils.Array");
Extend(GenClick.Utils.Array, {
    each: function(array, fn, bind){
        bind = bind || window;
        for(var i = 0, l = array.length; i < l; i++){
            fn.call(bind, array[i], i, array);
        }
    }
});
Namespace("GenClick.Document.Ready");
Extend(GenClick.Document.Ready, {
    queue: [],
    isReady: false,
    ready: function(){
        var each = GenClick.Utils.Array.each;
        each(GenClick.Document.Ready.queue, function(array){
            var fn = array[0];
            var args = array[1];
            fn.apply(window, args);
        });
    },
    addQueue: function(fn, args){
        queue.push([fn, args])
    }
});
(function(){
    if(document.body && document.body.lastChild){
        GenClick.Document.Ready.isReady = true;
        GenClick.Document.Ready.ready();
    } else {
        setTimeout(arguments.callee, 5);
    }
})();

Namespace("GenClick.Element");
addEvent = function(ev, fn, args, el){
    el = el || window;
    ev = (ev+'');
    args = args || [];
    if(ev.substr(0,2) == 'on') ev = ev.substr(2);
    if(GenClick.Document.Ready && ev.toLowerCase() == "domready"){
        if(GenClick.Document.Ready.isReady) fn.apply(el, args);
        else GenClick.Document.Ready.addQueue(fn, args);
        return;
    }
	if(el.addEventListener){
		el.addEventListener(ev, function(ev){
			if((fn.call(el, ev, args)) === false) ev.preventDefault();
		}, true);
	} else if(el.attachEvent){
	    //console.log(e);
		el.attachEvent('on'+ev, function(){
			return fn.call(el, event, args);
		});
	}
}
Extend(GenClick.Element, {
    get: function(id){
        return document.getElementById(id);
    },
    getClasses: function(className){
        var klasses = [], each = GenClick.Utils.Array.each;
        each( (className||"").split(" "), function(cls){
            if(cls) klasses.push(cls);
        });
        return klasses;
    },
    addClass: function(el, cls){
        var classes = GenClick.Element.getClasses(el.className);
        classes.push(cls);
        el.className = classes.join(" ");
    },
    removeClass: function(el, cls){
        var classes = GenClick.Element.getClasses(el.className);
        var endCls = [], each = GenClick.Utils.Array.each;
        each(classes, function(c){
            if(c == cls) return;
            endCls.push(c);
        });
        el.className = endCls.join(" ");
    },
    hasClass: function(el, cls){
        var classes = GenClick.Element.getClasses(el.className);
        for(var i = 0, l = classes.length; i < l; i++){
            if(classes[i] == cls) return true;
        }
        return false;
    },
    toggleClass: function(el, cls){
        if(GenClick.Element.hasClass(el, cls)) GenClick.Element.removeClass(el, cls);
        else GenClick.Element.addClass(el, cls);
    },
    addEvent: function(el, ev, fn, args){
		addEvent(ev, fn, args, el);
	}
});
Namespace("GenClick.Element.Form");

Extend(GenClick.Element.Form, {
    Validate: function(form, options){
        var valid = true;
        var errors = [];
        var each = GenClick.Utils.Array.each;
        var $ = GenClick.Element.get;
        if(options.required && options.required.fields){
            each(options.required.fields, function(id){
                if(!$(id).value){
                    if(options.required.error) options.required.error(id);
                    valid = false;
                    errors.push(id);
                } else {
                    if(options.required.success) options.required.success(id);
                }
            });
        }
        if(options.regex){
            each(options.regex, function(o){
                each(o.fields, function(id){
                    if(!o.regex.test( $(id).value )) {
                        if(o.error) o.error(id, o.regex);
                        valid = false;
                        errors.push(id);
                    } else {
                        if(o.success) o.success(id, o.regex);
                    }
                });
            });
        }
        
        if(!valid) $(errors[0]).focus();
        return valid;
    }
});
