/*** Language object ***/

function g_loadLanguageCallback() {
    language.loadLanguageCallback();
}

function g_getBooleanProperty(property) {
    return property && ( property == 1 || property.toLowerCase() == 'true' );
}

function Language() {
    this.callAfterLoaded = null;
    this.texts = new Array();
    this.languageRequest = null;
}

Language.prototype.load = function() {
    this.loadByVersion('');
}

Language.prototype.loadByVersion = function(version) {
    var languageAbbreviation = 'en';
    var url = '/language/' + languageAbbreviation + '.xml?version=' + encodeURIComponent(version);
    var forceFresh = false;
    var thisMisc = new Misc();
    if (forceFresh) {
        url += '&random=' + thisMisc.getRandomString(1, 1000000);
    }
    if (window.XMLHttpRequest) {
        this.languageRequest = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        this.languageRequest = new ActiveXObject('Microsoft.XMLHTTP');
    }
    this.languageRequest.onreadystatechange = g_loadLanguageCallback;
    this.languageRequest.open('GET', url, true);
    this.languageRequest.send(null);
}

Language.prototype.get = function(id) {
    var s = '';
    if (this.texts) {
        if (this.texts[id]) {
            s = this.texts[id];
        }
        else {
            alert('Language ID "' + id + '" not found...');
        }
    }
    else {
        alert('Language not loaded...');
    }
    s = this.replaceConstants(s);
    return s;
}

Language.prototype.getReplace = function(id, replaceName, replaceWith) {
    var s = this.get(id);
    s = s.replace('[' + replaceName + ']', replaceWith);
    s = this.replaceConstants(s);
    return s;
}

Language.prototype.replaceConstants = function(s) {
    s = s.replace('[closeLink]', '</a>');
    return s;
}

Language.prototype.loadLanguageCallback = function() {
    if (this.languageRequest.readyState == 4 && this.languageRequest.status == 200) {
        var elements = this.languageRequest.responseXML.getElementsByTagName('text');
        for (var i = 0; i < elements.length; i++) {
            this.texts[ elements[i].getAttribute('id') ] = elements[i].firstChild.data;
        }
        this.callAfterLoaded();
    }
}

/*** Point object ***/

function Point(x, y) {
    this.x = x;
    this.y = y;
}

Point.prototype.assignToElement = function(elm) {
    elm.style.left = this.x + 'px';
    elm.style.top = this.y + 'px';
}


/*** String object ***/

String.prototype.ucWords = function() {
    if (this) {
        var words = this.split(/\s+/g);
        for(var i = 0; i < words.length; i++) {
            var parts = words[i].match(/(\w)(\w*)/);
            if (parts) {
                words[i] = parts[1].toUpperCase() + parts[2].toLowerCase();
            }
       }
       return words.join(' ');
    }
}

String.prototype.replaceAsteriskWithItalics = function() {
    return this.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, "<em>$2</em>");
}


/*** Misc object ***/

Misc.prototype.getElementAndCreateIfNeeded = function(wrapperId, id) {
    var elm = document.getElementById(id);
    if (!elm) {
        elm = document.createElement('div');
        elm.setAttribute('id', id);
        var elmWrapper = document.getElementById(wrapperId);
        if (elmWrapper) {
            elmWrapper.appendChild(elm);
        }
    }
    return elm;
}

Misc.prototype.performCall = function(parameters, isSandbox) {
    var domain = isSandbox ? 'captionxservice-sandbox.appspot.com' : 'captionxservice.appspot.com';
    var script = document.createElement('script');
    script.id = 'thisScript' + misc.getRandomString();
    script.type = 'text/javascript';
    var url = 'http://' + domain + '/api?' + this.toXml(parameters) + '&amp;r=' + misc.getRandomString();
    script.src = url;
    // misc.setHtml('message', url);
    document.body.appendChild(script);
}

Misc.prototype.toggleElm = function(id) {
    var elm = document.getElementById(id);
    if (elm.style.display == 'block') {
        elm.style.display = 'none';
    }
    else {
        elm.style.display = 'block';
    }
}

Misc.prototype.showElm = function(id) {
    var elm = document.getElementById(id);
    if (elm) {
        elm.style.display = 'block';
    }
}

Misc.prototype.hideElm = function(id) {
    var elm = document.getElementById(id);
    if (elm) {
        elm.style.display = 'none';
    }
}

Misc.prototype.setHtml = function(id, html) {
    var elm = document.getElementById(id);
    if (elm) {
        elm.innerHTML = html;
    }
}

Misc.prototype.getRandomString = function() {
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 12;
    var randomstring = '';
    for (var i=0; i < string_length; i++) {
        var rnum = Math.floor( Math.random() * chars.length );
        randomstring += chars.substring(rnum, rnum + 1);
    }
    return '_' + randomstring;
}

Misc.prototype.toXml = function(s) {
    if (s) {
        s = s.toString();
        s = s.replace(/&/g, '&amp;');
        s = s.replace(/</g, '&lt;');
        s = s.replace(/>/g, '&gt;');
    }
    else {
        s = '';
    }
    return s;
}

Misc.prototype.toAttribute = function(s) {
    if (s) {
        s = s.toString();
        s = this.toXml(s);
        s = s.replace(/"/g, '&quot;');
        // todo: s = s.replace(/'/g, '&#145;');
    }
    else {
        s = '';
    }
    return s;
}

Misc.prototype.toName = function(s) {
    var allowedChars = 'abcdefghijklmnopqrstuvwxyz0123456789_';
    s = s.toLowerCase();

    // until restricting to allowedChars is done, use toAttribute:
    s = this.toAttribute(s);

    return s;
}

Misc.prototype.getChars = function(char, numberOfChars) {
    var s = '';
    for (var i = 1; i <= numberOfChars; i++) {
        s += char;
    }
    return s;
}

Misc.prototype.forceMinMax = function(v, min, max) {
    if (v < min) {
        v = min;
    }
    else if (v > max) {
        v = max;
    }
    return v;
}

Misc.prototype.getRandomInt = function(min, max) {
    return Math.floor( ( (max + 1 - min) * Math.random() ) + min );
}

Misc.prototype.getFormattedJson = function(arr, level) {
    var dumped_text = "";
    if (!level) level = 0;

    var level_padding = "";
    for(var j=1; j < level + 1; j++) level_padding += "  ";

    if ( typeof(arr) == 'object' ) {
        for(var item in arr) {
            var value = arr[item];

            if ( typeof(value) == 'object' ) {
                dumped_text += level_padding + "" + item + " ...\n";
                dumped_text += this.getFormattedJson(value, level + 1);
            }
            else {
                dumped_text += level_padding + "" + item + " = \"" + value + "\"\n";
            }
        }
    }
    else {
        dumped_text = "===>" + arr + "<===(" + typeof(arr) + ")";
    }
    return dumped_text;
}

function Misc() {
}


/*** String extension ***/

String.prototype.ucFirst = function() {
    var f = this.charAt(0).toUpperCase();
    return f + this.substr(1, this.length - 1);
}


/*** Browser detection ***/

function doDetectBrowser() {
    // http://quirksmode.org/js/detect.html
    browserDetect = {
        init: function () {
            this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
            this.version = this.searchVersion(navigator.userAgent)
                || this.searchVersion(navigator.appVersion)
                || "an unknown version";
            this.OS = this.searchString(this.dataOS) || "an unknown OS";
        },
        searchString: function (data) {
            for (var i=0;i<data.length;i++)    {
                var dataString = data[i].string;
                var dataProp = data[i].prop;
                this.versionSearchString = data[i].versionSearch || data[i].identity;
                if (dataString) {
                    if (dataString.indexOf(data[i].subString) != -1)
                        return data[i].identity;
                }
                else if (dataProp)
                    return data[i].identity;
            }
        },
        searchVersion: function (dataString) {
            var index = dataString.indexOf(this.versionSearchString);
            if (index == -1) return;
            return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
        },
        dataBrowser: [
            { string: navigator.userAgent, subString: "Chrome", identity: "Chrome" },
            { string: navigator.userAgent, subString: "OmniWeb", versionSearch: "OmniWeb/", identity: "OmniWeb" },
            { string: navigator.vendor, subString: "Apple", identity: "Safari", versionSearch: "Version" },
            { prop: window.opera, identity: "Opera" },
            { string: navigator.vendor, subString: "iCab", identity: "iCab" },
            { string: navigator.vendor, subString: "KDE", identity: "Konqueror" },
            { string: navigator.userAgent, subString: "Firefox", identity: "Firefox" },
            { string: navigator.vendor, subString: "Camino", identity: "Camino" },
            {        // for newer Netscapes (6+) string: navigator.userAgent, subString: "Netscape", identity: "Netscape"
            },
            { string: navigator.userAgent, subString: "MSIE", identity: "Explorer", versionSearch: "MSIE" },
            { string: navigator.userAgent, subString: "Gecko", identity: "Mozilla", versionSearch: "rv" },
            {         // for older Netscapes (4-) string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla"
            }
        ],
        dataOS : [
            { string: navigator.platform, subString: "Win", identity: "Windows" },
            { string: navigator.platform, subString: "Mac", identity: "Mac" },
            { string: navigator.platform, subString: "Linux", identity: "Linux" }
        ]
    };
    browserDetect.init();
}
