
var Util = function(){
    ////////////////////////////
    /* POPUP WINDOWS AND TABS */
    ////////////////////////////
    function _getDefaultWindowString(width, height){
        var featureString = _getWindowString(false, false, false, false, true, false, true, width, height);
        return featureString;
    }
    function _getWindowString(showStatusbar, showToolbar, showLocation, showMenubar, showTitlebar, showScrollbar, isResizable, width, height){
        var status = 0,
            toolbar = 0,
            location = 0,
            menubar = 0,
            titlebar = 0,
            scrollbars = 0,
            resizable = 0;
        if (showStatusbar === true)
            status = 1;
        if (showToolbar === true) 
            toolbar = 1;
        if (showLocation === true)
            location = 1;
        if (showMenubar === true)
            menubar = 1;
        if (showScrollbar === true)
            scrollbars = 1;
        if (isResizable === true)
            resizable = 1;
        if (showTitlebar === true)
            titlebar = 1;
        var featureString = "";
        featureString += "status=" + status + ",";
        featureString += "toolbar=" + toolbar + ",";
        featureString += "menubar=" + menubar + ",";
        featureString += "titlebar=" + titlebar + ",";
        featureString += "resizable=" + resizable + ",";
        featureString += "width=" + width + ",";
        featureString += "height=" + height;
        return featureString;
    }
    function openWindow(htmlPage, width, height, extraParams, isNewWindow) {
        if (!htmlPage || typeof htmlPage != "string" || htmlPage === ""){
            log("openWindow: bad htmlPage = " + htmlPage);
            return null;
        }
        if (isNewWindow == null || typeof isNewWindow != "boolean"){
            log("bad isNewWindow = " + isNewWindow);
            return null;
        }
        if (!width || ! height || typeof width != "number" || typeof height != "number"){
            log("bad width or height = (" + width + " , " + height + ")");
            return;
        }
        if (extraParams != null && typeof extraParams != "object"){
            log("bad extraParams = " + extraParams);
            return;
        }
        //get window string
        var windowString = _getDefaultWindowString(width, height);
        
        //get url
        var url = getServerUrl() + htmlPage;
        
        //build param json
        if (extraParams){
            var paramJSON = JSON.stringify(extraParams);
            url += "?&extraParams=" + paramJSON;
        }
        
        //open window
        if (isNewWindow === true){
           return window.open(url, "_blank", windowString, false);
        }else{
           return window.open(url, "_self", windowString, false);
        }
    }
    function openTab(url){
        if (!url || typeof url != "string" || url === ""){
            log("openTab: bad url = " + url);
            return;
        }
        window.open(url, '_newtab');
    }
    /////////////////
    /* FLASH STUFF */
    /////////////////
    function getFlashEmbedHtml(flashUrl, width, height){
        if (!flashUrl || typeof flashUrl != "string" || flashUrl == ""){
            log("bad flashUrl");
            return;
        }
        if (!width || ! height || typeof width != "number" || typeof height != "number"){
            log("bad width or height = (" + width + " , " + height + ")");
            return;
        }
        
        var widthXml = "width=\'" + width + "\' "; 
        var heightXml = "height=\'" + height + "\' ";
        var idXml = "id=\'flashContent\' ";
        //start object
        var objectHtml = "<object classid=\'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\' name=\'flashplayer\' "; 
        objectHtml += widthXml + heightXml + idXml + ">"; 
        
        //param
        objectHtml += "<param name=\'movie\' value=\'" + flashUrl + "\' />";
        
        //embed
        objectHtml += "<embed src=\'" + flashUrl + "\' " + idXml + widthXml + heightXml + "></embed>"
        //end object
        objectHtml += "</object>";
        
        //make url friendly
        objectHtml = escape(objectHtml);
        return objectHtml;
    }
    //////////////////////////////////
    /* URLS AND RESOURCE MANAGEMENT */
    //////////////////////////////////
    function getUrlParam(paramName){
        if (!paramName || typeof paramName != "string" || paramName == ""){
            log("bad paramName");
            return "";
        }
    
        var paramKey = paramName.toLowerCase();
        log("key = " + paramKey);
        var url = window.location.href;
        if (url.indexOf("?") < 0){
            log("bad queryString");
            return "";
        }
        var queryString = url.substr(url.indexOf("?"));
        log("queryString = " + queryString);
        
        var paramArray = queryString.split("&");
        if (!paramArray || paramArray.length < 2){
            log("could not decompose queryString");
            return "";
        }
        //
        var x = 1;
        for (x = 1; x < paramArray.length; x++){
            //look at current parameter
            var currParam = paramArray[x];
            log("currParam = " + currParam);
            
            //split at =
            var currParamArray = currParam.split("=");
            if (currParamArray == null || currParamArray.length < 2){
                log("queryString missing \'=\'");
                return "";
            }
            
            //see if key matches
            var currKey = currParamArray[0].toLowerCase();
            log("currKey = " + currKey);
            if (currKey.indexOf(paramKey) < 0)
                break;
            
            log("returnValue = " + currParamArray[1]);
            //we found it
            return currParamArray[1];
        }
        return "";
    }
    function getServerUrl(){
        return 'http://slothproductions.org/';
    }
    function getResourcePath(resourceName){
        if (!resourceName || typeof resourceName != "string" || resourceName == ""){
            log("bad resource name = " + resourceName);
            return;
        }
        
        var ret = getServerUrl() + resourceName;
        ret += "?&t=" + new Date().getTime();
        return ret;
    }
    function getResource(path, handler){
        if (!path || typeof path != "string" || path == "")
            log("bad path = " + path);
        if (!handler || typeof handler != "function")
            log("bad handler = " + handler);
            
        var request = new XMLHttpRequest();
        request.open('GET', path);
        request.onreadystatechange = function() {
            if (request.readyState == 4){
                var responseText = request.responseText;
                if (responseText != null && typeof responseText == "string" && responseText != ""){
                    handler(responseText);
                } else {
                    log("bad resource URL or empty resource = " + path);
                }
            }
        }
        request.send();
    }
    ///////////////
    /* SHORTHAND */
    ///////////////
    function navigate(url){
        if (!url || typeof url != "string" || url == ""){
            log("bar url = " + url);
            return;
        }
        window.location.href = url;
    }
    function get(id){
        var ret = null;
        if (id && typeof id == "string" && id != ""){
            ret = document.getElementById(id);
            if (!ret)
                log("bad id = " + id);
                
        } else {
            log("bad id = " + id);
        }
        return ret;
    }
    function registerClickEvent(control, handler){
        var c = get(control);
        if (c){
            if (handler && typeof handler == "function"){
                c.addEventListener("click", handler);
            } else {
                log("bad handler = " + handler);
            }
        }
    }
    function log(message){
        console.log(message);
    }
    //////////////////////
    /* PUBLICLY EXPOSED */
    //////////////////////
    return {
        log: log,
        registerClickEvent: registerClickEvent,
        navigate: navigate,
        openWindow: openWindow,
        openTab: openTab,
        get: get,
        getServerUrl: getServerUrl,
        getUrlParam: getUrlParam,
        getFlashEmbedHtml: getFlashEmbedHtml,
        getResource: getResource,
        getResourcePath: getResourcePath,
    };
}();

