window.vmf = function(){
    // Private function for getting the jQuery object using the element ID.
    var jId = function(id){
        return $("#" + id);
    };
    var staticJsInc = function(url){
        document.write('<script src="', url, '" type="text/javascript"><\/script>');
    }
    var onloadJs = [];
    return {
        loadJs: function(url, async, callback){
            if(($.inArray(url, onloadJs) < 0))
                (async) ? $.getScript(url, callback) : staticJsInc(url);
        },
        loadCss: function(url){ 
            var link = document.createElement("link");
            link.setAttribute("rel","stylesheet");
            link.setAttribute("type","text/css");
            link.setAttribute("href", url);
            document.getElementsByTagName("head")[0].appendChild(link);
        },
        // The DOM Module
        dom: function(){
            return {
                onload: function(func){
                    $(document).ready(func);
                },
                unload: function(func){
                    $(window).unload(func);
                },
                id: function(id){
                    return document.getElementById(id);
                },
                getHtml: function(id){
                    return jId(id).html();
                },
                setHtml: function(id, val, pos){
                    switch (pos) {
                        case "before":
                            jId(id).prepend(val);
                            break;
                        case "after":
                            jId(id).append(val);
                            break;
                        default:
                            jId(id).html(val);
                    }
                },
                addHandler: function(elems, event, handler){
                    (elems instanceof jQuery ? elems : jQuery(elems)).bind(event, handler);
                },
                removeHandler: function(elems, event, handler){
                    (elems instanceof jQuery ? elems : jQuery(elems)).unbind(event, handler);
                },
                get: function(selector){
                    return $(selector);
                },
                serialize: function(elemArry){
                    return jQuery(elemArry).serialize();
                },
                trigger: function(elems, event){
                    (elems instanceof jQuery ? elems : jQuery(elems)).trigger(event);
                }
            };
        }(),
        // The cookie module
        cookie: function(){
            return{
                read: function(name){
                    var nameEQ = name + "=";
                    var ca = document.cookie.split(';');
                    for (var i = 0; i < ca.length; i++) {
                        var c = ca[i];
                        while (c.charAt(0) == ' ') 
                            c = c.substring(1, c.length);
                        if (c.indexOf(nameEQ) == 0) 
                            return c.substring(nameEQ.length, c.length);
                    }
                    return null;
                },
                write: function(name, value, days){
                    var expires = "";
                    if (days) {
                        var date = new Date();
                        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                        expires = "; expires=" + date.toGMTString();
                    }
                    else 
                        expires = "";
                    document.cookie = name + "=" + value + expires + "; path=/";
                },
                clear: function(name){
                    vmf.cookie.write(name, "", -1);
                }  
            };
        }(),
        // The JSON module
        json: function(){
            return{
                txtToObj: function(txt){
                    try {
                        return $.evalJSON(txt);
                    } 
                    catch (ex) {
                        return null;
                    }
                },
                objToTxt: function(obj){
                    return $.toJSON(obj);
                }  
            };
        }(),
        // The Array module
        array: function(){
            return{
                contains: function(val, arry){
                    return ($.inArray(val, arry) > -1);
                },
                txtToAry: function(txt){
                    return txt.split(",");
                },
                aryToTxt: function(arry){
                    return arry.join(",");
                },
                objToAry: function(obj){
                    return $.makeArray(obj);
                }  
            };
        }(),
        // The String module
        string: function(){
            return{
                setCharAt: function(str, i, c){
                    if (i >= str.length) 
                        return str;
                    else {
                        var n = str.substring(0, i);
                        n += c;
                        n += str.substring(i + 1, str.length);
                        return n;
                    }
                },
                trim: function(str){
                    return $.trim(str);
                }
            };
        }(),
        // The namespace module
        ns: function(){
            return{
                use: function(nspace){
                    var ary = nspace.split(".");
                    var obj = window;
                    for(var i in ary){
                        if(!obj[ary[i]]){
                            obj[ary[i]] = {};
                            obj = obj[ary[i]];   
                        }else
                            obj = obj[ary[i]];
                    }
                }  
            };
        }(),
        // The Ajax module
        ajax: function(){
            return{
                connect: function(o){
                    $.ajax(o);
                },
                get: function(url, data, onSuccess, onFailure, onComplete, timeoutInMs){
                    var o = {
                        type: "GET",
                        url: url,
                        data: data,
                        success: onSuccess,
                        error: onFailure,
                        complete: onComplete
                    };
                    if (timeoutInMs) 
                        o.timeout = timeoutInMs;
                    jQuery.ajax(o);
                },
                post: function(url, data, onSuccess, onFailure, onComplete, timeoutInMs){
                    var o = {
                        type: "POST",
                        url: url,
                        data: data,
                        success: onSuccess,
                        error: onFailure,
                        complete: onComplete
                    };
                    if (timeoutInMs) 
                        o.timeout = timeoutInMs;
                    jQuery.ajax(o);
                }
            };
        }(),
        // The form
        form: function(){
            return{
                serialize: function(id, elems){
                    var formObj = vmf.dom.id(id) || document.forms[id];
                    if (!formObj) 
                        return null;
                    if (elems) {
                        var elemAry = [];
                        for (var i in elems) {
                            elemAry.push(formObj[elems[i]]);
                        }
                        return jQuery(elemAry).serialize();
                    }
                    else 
                        return jQuery(formObj).serialize();
                },
                getRadioBtn: function(id, field){
                    var formObj = vmf.dom.id(id) || document.forms[id];
                    if (!formObj) 
                        return null;
                    return jQuery("input[@name='" + field + "']:checked").val();
                },
                getCbk: function(id, field){
                    var formObj = vmf.dom.id(id) || document.forms[id];
                    if (!formObj) 
                        return false;
                    return formObj[field].checked;
                },
                setCbk: function(id, field, val){
                    val = val || true;
                    var formObj = vmf.dom.id(id) || document.forms[id];
                    if (formObj)
                        formObj[field].checked = val;
                }
            };
        }(),
        // The URL module
        url: function(){
            return{
                getParam: function(name){
                    var url = window.location.toString();
                    var start = url.indexOf("?");
                    if (start < 0) 
                        return null;
                    var params = url.substring(start + 1, url.length).split("&");
                    for (var i in params) {
                        var tuple = params[i].split("=");
                        if (tuple[0] == name) 
                            return tuple[1];
                    }
                    return null;
                },
                hasAnchor: function(name){
                    var url = window.location.toString();
                    var start = url.indexOf("#");
                    if (start < 0) 
                        return false;
                    else 
                        return (url.substring(start + 1, url.length) == name);
                },
                redirect: function(pObj){
                    if (!pObj.url) 
                        return;
                    switch (pObj.target) {
                        case "new":
                            window.open(pObj.url);
                            break;
                        default:
                            document.location = pObj.url;
                    }
                }
            };
        }(),
        // The animation module
        animate: function(){
            return{
                show: function(elems, speed, callback){
                    (elems instanceof jQuery ? elems : jQuery(elems)).show(speed, callback);
                },
                hide: function(elems, speed, callback){
                    (elems instanceof jQuery ? elems : jQuery(elems)).hide(speed, callback);
                },
                toggle: function(elems){
                    (elems instanceof jQuery ? elems : jQuery(elems)).toggle();
                },
                slideDown: function(elems, speed, callback){
                    (elems instanceof jQuery ? elems : jQuery(elems)).slideDown(speed, callback);
				},
	            slideUp: function(elems, speed, callback){
                    (elems instanceof jQuery ? elems : jQuery(elems)).slideUp(speed, callback);
				},
                slideToggle: function(elems, speed, callback){
                    (elems instanceof jQuery ? elems : jQuery(elems)).slideToggle(speed, callback);
				},
                fadeIn : function(elems, speed, callback){
                    (elems instanceof jQuery ? elems : jQuery(elems)).fadeIn(speed, callback);
                },
                fadeOut: function(elems, speed, callback){
                    (elems instanceof jQuery ? elems : jQuery(elems)).fadeOut(speed, callback);
                },
                fadeTo: function(elems, speed, opacity, callback){
                    (elems instanceof jQuery ? elems : jQuery(elems)).fadeTo(speed, opacity, callback);
                }	
            };
        }()
    };
}();
