var QuillUtil = {
    lang: "hindi",

    getLangLegacy: function() {
        if(window.defaultLang){
			return window.defaultLang;
		}
        var arr;
        try {
            arr = window.location.pathname.match(/\/[a-z]+/g);
            if(window.location.pathname.slice(-1) === "/") {
                return arr[arr.length - 1].substring(1);
            }
            return arr[arr.length - 2].substring(1);
        } catch(e) {
            // Default to hindi
            return "hindi";
        }
	},

    getLang: function() {
        return QuillUtil.lang;
    },

    setLang: function(language) {
        QuillUtil.lang = language;
		if(language !== "english" ){
		//	setNodeText(getElement("selectedLanguage1"),language.charAt(0).toUpperCase()+language.slice(1));
		//	setNodeText(getElement("selectedLanguage2"),language.charAt(0).toUpperCase()+language.slice(1));
			showRenderWarning("renderWarning", "closeWarn", "errPng");
		}
    },

	isValidEmailID: function(text) {
		var result = text.match(/^[0-9a-zA-Z_\.-]+@([0-9a-zA-Z_-]+\.)+[a-zA-Z0-9_-]+$/); 
		return (result !== null);
	},

	isValidEmailIDGroup: function(text) {
		var results = text.split(/[\s,]+/);
        var result;

        if(results.length < 1) {
            return false;
        }
        var total_id = 0;
		for(var i = 0; i < results.length; ++i){
			result = results[i].match(/[0-9a-zA-Z_\.-]+@([0-9a-zA-Z_-]+\.)+[a-zA-Z0-9_-]+/); 
			if(result){
                total_id += 1;
			}
		}
        if(total_id == 0)
            return false;
		return true;
	},

	getRandom: function(text) {
		var rand = Math.random() - 0.5;
		rand = rand * Math.pow(2, 32);
		return Math.floor(rand);
	},

	getBrowser: function() {
		var ua = window.navigator.userAgent.toLowerCase();
        var version;
        var geckoIdx;
        var spaceIdx;

		if (ua.indexOf('opera') != -1) {
			return 'opera';
		}
		else if (ua.indexOf('safari') != -1) {
			return 'safari';
		}
		else if (ua.indexOf('msie 6.0') != -1 || ua.indexOf('msie 7.0') != -1  || ua.indexOf('msie 8.0') != -1) {
			return 'ie';
		}
		else if (ua.indexOf('mozilla') != -1) {
            geckoIdx = ua.indexOf('gecko/');
			if (geckoIdx == -1) {
				return 'oldmoz';
            }
			spaceIdx = ua.indexOf(' ', geckoIdx);
			if (spaceIdx == -1) {
				spaceIdx = ua.length;
            }
			version = parseInt(ua.substring(geckoIdx + 6, spaceIdx), 10);
			if (version < 20051107) {
				return 'oldmoz';
            }
			return 'moz';
		}
		return 'unknown';
	},

	isBlank: function(text) {
		if(text.match(/^\s*$/)) {
			return true;
        }
		return false;
	},

    isValidURL: function(text) {
        if(text.match(/^http:\/\/.*$/)) {
            return true;
        }
        return false;
    },

    isAlpha: function(text) {
        if(text.match(/^[a-zA-Z]$/)) {
            return true;
        }
        return false;
    },

    getServerAddr: function() {
        if(document.domain) {
        //    return ("http://" + window.location.host);
            return ("http://" + document.domain);
        } else {
            return quillConfig.server.location;
        }
    },

    getServerPath: function() {
        var path = window.location.pathname.match(/.*\//g);
        return ["http://", window.location.host, path].join("");
    },

    isValidAlpha: function(text) {
        // FIXME: This is a hack
        // We know that splitSpecial will split properly
        if(text.match(/[a-zA-Z]+/)) {
            return true;
        }
        return false;
    },

    getMeta: function() {
        var d = document.getElementsByTagName("meta");
        var ret = {};
        var i;

        if(!d || !d.length) {
            logger.error("Could not read meta tags.");
        } else {
            for(i=0; i<d.length; i++) {
                if(d[i].name) {
                    ret[d[i].name] = d[i].content;
                }
            }
        }
        return ret;
    },

    makeURL: function (baseurl, req) {
        var reqstr = "";
        for(var i in req) {
            reqstr += [i, "=", encodeURIComponent(req[i])].join("");
        }

        if(reqstr) {
            return [baseurl, "?", reqstr].join("");
        } else {
            return baseurl;
        }
    },

    setupLogging: function () {
        try {
            try {
                // We have firebug
                if (console.log) {
                    logger = {
                        log: console.log,
                        debug: console.debug,
                        info: console.info,
                        warn: console.warn,
                        error: console.error
                    };
                }
            } catch (e) {
                // Mochikit logging
                if(logDebug) {
                    logger = {
                        log: log,
                        debug: logDebug,
                        info: logDebug,
                        warn: logWarning,
                        error: logError
                    };
                }
            }
        } catch (e) {
            // Oops.. we got nothing
            logger = {
                log: function() {},
                debug: function() {},
                info: function() {},
                warn: function() {},
                error: function() {}
            };
        }
    },

    setCharEncoding: function(encoding)
    {
        if(document.defaultCharset) {
            document.defaultCharset = encoding;
        }
        if(document.charset) {
            document.charset = encoding;
        }
    }

}; /* End of QuillUtil namespace */

getNodeText = function () {
    var n = SPAN();
    if(typeof(n.textContent) !== "undefined") {
        return function (node) {
            return node.textContent;
        };
    } else if(typeof(n.innerText) !== "undefined") {
        return function (node) {
            return node.innerText;
        };
    } else {
        return function (node) {
            return node.text;
        };
    }
} ();


setNodeText = function () {
    // Create a dummy SPAN node and check
    var n = SPAN();
    if(typeof(n.textContent) !== "undefined") {
        return function (node, text) {
            node.textContent = text;
        };
    } else if(typeof(n.innerText) !== "undefined") {
        return function (node, text) {
            node.innerText = text;
        };
    } else {
        return function (node, text) {
            node.text = text;
        };
    }
} ();

function getFontSize()
{
    if(quillConfig.fontSizes && 
        quillConfig.fontSizes.hasOwnProperty(QuillUtil.getLang())) {
        return quillConfig.fontSizes[QuillUtil.getLang()];
    } else {
        return ["12px", "20px"];
    }
}

function addStyleSheet(doc, url)
{
    // logger.info("addStyleSheet called", doc, url);
    var styleSheet = doc.createElement("LINK");
    styleSheet.rel = "stylesheet";
    styleSheet.type = "text/css";
    styleSheet.href = url;

    var docHead = doc.getElementsByTagName('head')[0];
    if(docHead){
        docHead.appendChild(styleSheet);
    } else {
        logger.error("addStyleSheet: document.head not found for", doc);
    }
}

// This is specifically for use with IE
function enableLogPane()
{
    var logpane = getElement("logpane");

    logger.info = function () {
        var s = "";
        for(var i=0; i<arguments.length; i++) {
            s += arguments[i] + " ";
        }
        logpane.appendChild(DIV(s));

        // scroll to the end
        if(logpane.scrollHeight > logpane.clientHeight) {
            logpane.scrollTop = logpane.scrollHeight - logpane.clientHeight;
        }
    };
}

function getCursorPosition(elem)
{
    var cursorPos;

    // MOZILLA and others
    if (typeof(elem.selectionStart) !== "undefined") {
        //cursorPos = this.editorInput.selectionStart;
        cursorPos = elem.selectionEnd;
    }
    // IE
    else if (document.selection) {
        elem.focus();
        var sel = document.selection.createRange();

        // Get current cursor point
        var storedRange = sel.duplicate();
        //storedRange.moveToElementText(elem);
        //storedRange.setEndPoint('EndToEnd', sel);
        //cursorPos = storedRange.text.length - sel.text.length;  
        //cursorPos = storedRange.text.length;
        storedRange.collapse(true);
        var moved = storedRange.moveStart('character', -1000);
        return -moved;
    }

    return cursorPos;
}

function setCursorPosition(elem, pos)
{
   // MOZILLA and others
    if (typeof(elem.selectionStart) !== "undefined") {
        //cursorPos = this.inputArea.selectionStart;
        elem.selectionStart = pos;
        elem.selectionEnd = pos;
    }
    // IE
    else if (document.selection) {
        elem.focus();
        var range = elem.createTextRange();
        range.collapse(true);
        range.moveStart("character", pos);
        range.moveEnd("character", pos);
        range.select();
    }
}

iframePos = function () {
//    return elementPosition(id);
    return elementPosition("indicOutput");
};

/*
TextEngine.prototype.transliterate = function ()
{
    // Parse the innerHTML
    var iarr = this.displayArea.innerHTML.match(/(<[^<]*>)|([^<>]*)/g);

    logger.info(iarr);
    //return;

    function splitSpecial(s) {
        var m = s.match(/((([a-zA-Z]+[\.\^~\/]*)*[a-zA-Z]+)|([^a-zA-Z])+)/g);
        if(!m) {
            return [];
        }
        return m;
    }

    function render (arr, index) {
        var tarr = splitSpecial(arr[index]);
        var d = new Deferred();
        d.count = tarr.length;

        d.addCallback(function () {
            arr[index] = tarr.join("");
            logger.info("concat ", arr[index], tarr);
        });
        
        for(var i=0; i<tarr.length; i++) {
            if(tarr[i].match(/[a-zA-Z]/)) {
                wm.getWordMapping(QuillUtil.getLang(), tarr[i],
                    partial(function (idx, m) {
                        tarr[idx] = ['<span word="', m.engWord, '" lang="', QuillUtil.getLang(), '">', m.preferred, '</span>'].join("");
                        logger.info("Got response", m, d.count);
                        d.count -= 1;
                        if(d.count <= 0) {
                            d.callback();
                        }
                    }, i)
                );
            } else {
                tarr[i] = ['<span>', tarr[i], '</span>'].join("");
                logger.info(tarr[i]);
                d.count -= 1;
                if(d.count <= 0) {
                    d.callback();
                }
            }
        }

        return d;
    }

    var that = this;
    var def = new Deferred();
    def.count = iarr.length;

    def.addCallback(function () {
        logger.info("callback fired");
        that.displayArea.innerHTML = iarr.join("");
    });

    for(var i=0; i<iarr.length; i++) {
        // Ignore tags
        if(iarr[i].length > 0 && ! iarr[i].match(/[<>]/)) {
            render(iarr, i).addCallback(function () {
                logger.info("callback fired", def.count);
                def.count -= 1;
                if(def.count <= 0) {
                    def.callback();
                }
            });
        } else {
            def.count -= 1;
            if(def.count <= 0) {
                def.callback();
            }
        }
    }

};

*/

