/* init function */
if (!Array.prototype.map) {
  Array.prototype.map = function(fun /*, thisp*/) {
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array(len);
    var thisp = arguments[1];
    for (var i = 0; i < len; i++) {
      if (i in this)
        res[i] = fun.call(thisp, this[i], i, this);
    }

    return res;
  };
}
    
(function() {
    var scripts = function() {

        /* scripts.checks (Object)
         * ==================
         * different checks that can be made to determine whether or not a script can be loaded
         *
         * namespace(String): loads the script if the specified namespare is not there
         */
        var checks = function() {
            var namespace = function(namespace) {
                return function() {
                    if(typeof window[namespace] === 'undefined') {
                        return true;
                    }

                    return false;
                };
            };

            return {
                namespace: namespace
            };
        }();

        /* script (String,String -> script)
         * =================
         * creates a script object
         *
         * src(String):         url of script being loaded
         * check(function):     check that determines whether script has already loaded or not
         * load(function):      loads the script
         *
         */

        var script = function(src,check) {
            return {
                src: src,
                check: check,
                load: function() {
                    document.write('<s'+'cript src="'+this.src+'"></s'+'cript>');

                    return this;
                }
            };
        };

        /* add any required scripts here
         */

        var required = [
            script("http://pagetorrent.com/css/dac/global/js/jquery-1.4.min.js", checks.namespace("jQuery")),
            script(function(){
                        var jsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
                        return  jsHost + "google-analytics.com/ga.js";
                   }(), checks.namespace("_gat"))
        ];

        return {
            required: required
        };
    }();

    /* script loading done here */
    for(var i in scripts.required) {
        if(scripts.required[i].check()) {
            scripts.required[i].load(scripts.required[i].src);
        }
    }

})();

var dac = function() {

    var isEmptyObject = function(o) {
        for(var i in o) {
            if(o.hasOwnProperty(i)) {
                return false;
            }
        }

        return true;
    };

    var analytics = function() {

        /* dac.analytics.ga (Object);
         * =========================================================
         * Handles Google Analytics abstractions
         *
         * tracker(Object): All GA trackers indexed by their ID key
         * set(function):   Instantiates a GA tracker object
         */

        var ga = function() {

            var tracker =  {};

                var set = function(ua) {
                        try {
                            tracker[ua] = _gat._getTracker(ua);
                            tracker[ua]._trackPageview();
                        } catch(err) {}

                        return tracker[ua];
                    };

                return {
                    set:        set,
                    tracker:    tracker
                };
            }();   

        /* dac.analytics.ct (Object)
         * =========================================================
         * Handles he Clicktracks abstractions
         *
         * isLoaded (boolean):   CT script file has been loaded or not
         * setVar (function):    sets a CT custom variable
         * setVars (function):   sets CT custom variables
         */


        var ct = function() { 
                    var isLoaded =  false;

                    var set = function(ua,server) {
                            var script,
                                server = !server ? '' : server;

                            if(!isLoaded) {
                                document.write('<s'+'cript src="'+document.location.protocol+'//stats'+server+'.clicktracks.com/cgi-bin/ctasp-server.cgi?i='+ua+'"></script>');
                                isLoaded = true;
                            }


                            return this;
                        };

                    var setVar = function(name, val) {
                            window['CT_X_'+name] = val;

                            return this;
                        };

                    var setVars = function(map) {
                            var key;

                            for(key in map) {
                                if(map.hasOwnProperty(key)) {
                                    this.setVar(key, map[key]);
                                }
                            }

                            return this;
                        };

                    return {
                        set:        set,
                        setVar:     setVar,
                        setVars:    setVars
                    };
                }();  
        
        return {
            ga:         ga,
            ct:         ct
        };
    }();

    var util = function() {
        var cookie = function() {
            var cookies = {};

            var cookie = function(name, value, options) {
                var options = options || {};
            };

            var set = function(name,value,options) {
                var options = options || {};

                if(!options.expires) {
                    options.expires = new Date();
                    options.expires.setDate(options.expires.getDate()+1);
                }

                document.cookie = [name+'='+value, 'expires='+options.expires, 'path=/'].join('; ');
                
                if(!isEmptyObject(cookies)) {
                    cookies[name] = value;
                }
                
                return this;
            };

            var get = function(name) {

                if(isEmptyObject(cookies)) {
                    var cookieList = document.cookie.split('; '),
                        keyVal;
                    
                    for(var i=0;i<cookieList.length;i++) {
                        keyVal = cookieList[i].split('=');
                        cookies[keyVal[0]] = keyVal[1];
                    }
                }


                return cookies[name];
            };

            return {
                get: get,
                set: set
            }
        }();


        var validation = function() {

            var form = {};

            var makeForm = function() {
                    var checks = [];

                    var addCheck = function(field, consequence, check) {

                            if(typeof consequence === 'string') {
                                consequence = alertMsg(consequence);
                            }

                            checks.push({field: field, consequence: consequence, check: check});

                            return this;
                        };

                    var validate = function() {
                            var passed = true;

                            for(var i in checks) {
                                if(!checks[i].check(jQuery('[name='+checks[i].field+']'))) {
                                    passed = false;
                                    if(!(checks[i].consequence())) {
                                        break;
                                    }
                                }
                            }

                            return passed;
                        };

                    return {
                        addCheck:   addCheck,
                        validate:   validate
                    };
                };

            var addForm = function(formToAdd) {
                    form[formToAdd] = makeForm();
                    jQuery(formToAdd).submit(form[formToAdd].validate);

                    return form[formToAdd];
                };

            return {
                addForm:    addForm
            };

        }();

        var randomizeList = function(list,identify) {
            var identify = identify || function(element) {return jQuery(element).attr('id');};
            var randomizedList = document.createDocumentFragment();
            var getList, jList;
            var listOrder = [];
            var selectedElement;

            if(list.selector) {
                getList = function() {
                    return jQuery(list.selector);
                };
            } else {
                getList = function() {
                    return jQuery(list);
                };
            }
            jList = getList();
            list.wrapAll('<div id="dac-randomizeList" />');
            jQuery('#dac-randomizeList').css('display', 'none');

            while(jList.length) {
                selectedElement = jList[Math.floor(Math.random()*jList.length)];
                randomizedList.appendChild(selectedElement);
                listOrder.push(identify(selectedElement));
                jList = getList();
            }

            jQuery('#dac-randomizeList')
                .append(randomizedList)
                .children()
                    .unwrap();

            document.writeln(listOrder);
            document.writeln(listOrder.join('.dac.,'));
        };

        return {
            cookie: cookie,
            validation: validation,
            randomizeList: randomizeList
        };

    }();

    /* form validation checks */

    var isEmail = function(field) {
            return jQuery(field).attr('value').match(/.+@.+/);
        };
   
    var isFilled = function(field) {
            return jQuery.trim(jQuery(field).attr('value')) !== '';
        };

    var isSelected = function(field) {
            return jQuery('option:selected', field).attr('value') !== '';
        };

    /* form validation fail actions */

    var alertMsg = function(msg) {
            return function() {
                alert(msg);
                return false;
            };
        };

    return {
        analytics:  analytics,
        util:       util,

        /* form validation checks */
        isEmail:    isEmail,
        isFilled:   isFilled,
        isSelected: isSelected,

        /* form validation fail actions */
        alertMsg:   alertMsg,

    };
}();
