/* new fcms js functioncollection with a own namespace */
var fcms = {
    Version : "1.0",
    Name: 'fcms',

    /* utf-8 methods from selfhtml */
    decode_utf8 : function(utftext) {
        var plaintext = ""; var i = 0; var c = c1 = c2 = 0;

        if (typeof(utftext) == 'object') {
            for (i in utftext) {
                if (typeof(utftext[i]) != 'function') { // each von prototype sitzt da leider mit drinnen
                    utftext[i] = fcms.decode_utf8(utftext[i]);
                }
            }
            return utftext;
        } else {
            // while-Schleife, weil einige Zeichen uebersprungen werden
            while (i < utftext.length) {
                c = utftext.charCodeAt(i);
                if (c < 128) {
                    plaintext += String.fromCharCode(c);
                    i++;
                } else if ((c > 191) && (c < 224)) {
                    c2 = utftext.charCodeAt(i + 1);
                    plaintext += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                    i += 2;
                } else {
                    c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2);
                    plaintext += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                    i += 3;
                }
            }

            return plaintext;
        }
    },

    encode_utf8 : function(rohtext) {
        // dient der Normalisierung des Zeilenumbruchs
        rohtext = rohtext.replace(/\r\n/g, "\n");
        var utftext = "";
        for (var n = 0; n < rohtext.length; n++) {
            // ermitteln des Unicodes des  aktuellen Zeichens
            var c = rohtext.charCodeAt(n);
            // alle Zeichen von 0-127 => 1byte
            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if ((c > 127) && (c < 2048)) {
                // alle Zeichen von 127 bis 2047 => 2byte
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                // alle Zeichen von 2048 bis 66536 => 3byte
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    },

    /* escaping of some characters for handling values within js variables */
    jsspecialchars : function(string) {
        if (string) {
            string = string.replace(/\r*\n/g, "\\n");
            string = string.replace(/\//g, "\\\/");
            string = string.replace(/\"/g, "\\\"");
            string = string.replace(/'/g, "");
        }
        return(string);
    },

    getAnchor : function(elem) {
        var anchor;
        var x, y;
        x = y = 0;
        if (elem && (anchor = $(elem))) {
            x = y = 0;
            while ((anchor = anchor.offsetParent) != null) {
                x += anchor.offsetLeft;
                y += anchor.offsetTop;
            }
            x += $(elem).offsetLeft;
            y += $(elem).offsetTop;
        }
        return(new Array(x, y));
    },

    /* matches scripts (only inline!) and adds them to the given container */
    addScripts : function(container, editor) {
        var sregexp = /<script([^>]*?)>([\s\S]*?)<\/script>/img;
        var scripts;
        //alert('addScript');
        //alert(container);
        //alert(editor);
        while (scripts = sregexp.exec(editor)) {
        //alert(scripts);
            var newscript = document.createElement("script");
            newscript.type = "text/javascript";
            newscript.text = scripts[2];

            var attribs;
            if (attribs =  scripts[1].match(/([a-zA-Z]*)="([^"]*)"/g)) {
                attribs.each(function (a) {
                    var att = /([a-zA-Z]*)="([^"]*)"/.exec(a);
                    newscript[att[1]] = att[2];
                });
            }
            container.appendChild(newscript);
        }
    },

    getFormElementsByName : function(form, field) {
        if (field && form && form.elements) {
            var hits = new Array();
            var tmp;
            for (var i = 0; i < form.elements.length; i++) {
                if (form.elements[i].name) {
                    if (form.elements[i].name.substring(0, field.length) == field) {
                        tmp = form.elements[i].name.substring(field.length, form.elements[i].name.length);
                        hits.push(form.elements[i]);
                    }
                }
            }
            return(hits);
        }
        return(false);
    },

    FormElementstoArray : function(formelems) {
        if (formelems) {
            var tmp, match;
            var arr = new Array();
            var regexp = /.*?\[(\d+)\]\[(.*)\]/i;
            for (var i = 0; i < formelems.length; i++) {
                match = regexp.exec(formelems[i].name); //tmp[1] is the index, tmp[2] the field
                if (match) {
                    if (!tmp || (match[1] != tmp)) {
                        // new object
                        tmp = match[1];
                        arr[match[1]] = new Object();
                    }
                    arr[match[1]][match[2]] = formelems[i].value;
                }
            }
            return(arr);
        }
        return(false);
    },

    replaceContent: function(elemid, content) {
        var elem = $(elemid);
        var currentElement = null;
        var oldwrite = document.write;
        var oldwriteln = document.writeln;


        // document write überschreiben, weil das document ja bereits geschlossen ist
        document.write = function(input) {
            var tmpdiv = document.createElement('div');
            tmpdiv.innerHTML = input;

            for (var t = 0; t < tmpdiv.childNodes.length; t++) {
                elem.appendChild(tmpdiv.childNodes[t]);
            }
        };
        document.writeln = document.write;

        if (elem !== undefined) {
            if (content.length) {
                /*
                 * tmpelement erzeugen, um per dom auf die Inhalte 
                 * zugreifen zu können.
                 */
                var tmpspan = document.createElement('div');
                tmpspan.innerHTML = content.replace(/^\s\s*/, '').replace(/<script[^>]*>([\s\S]*?)<\/script>/igm,'').replace(/<noscript[^>]*>([\s\S]*?)<\/noscript>/igm,'');
            }

            // inhalt von tmpspan in Element mit der id elem hängen
            while (elem.hasChildNodes()) {
                elem.removeChild(elem.firstChild);
            }

            if (tmpspan) {
                while (tmpspan.hasChildNodes()) {
                    elem.appendChild(tmpspan.firstChild);
                }
                fcms.addScripts(elem,content);
                if (typeof fcmsLib_Core_DataMethods === 'function') {
                    fcmsLib_Core_DataMethods.attachHandlers(elem);
                }
            }
        }
    },

    appendContent: function(elemid, content) {
        var elem = $(elemid);
        var currentElement = null;
        var oldwrite = document.write;
        var oldwriteln = document.writeln;        

        // document write überschreiben, weil das document ja bereits geschlossen ist
        document.write = function(input) {
            var tmpdiv = document.createElement('div');
            tmpdiv.innerHTML = input;

            for (var t = 0; t < tmpdiv.childNodes.length; t ++) {
                elem.appendChild(tmpdiv.childNodes[t]);
            }
        };
        document.writeln = document.write;

        if ('undefined' != typeof(elem)) {
            if (content.length) {
                /*
                 * tmpelement erzeugen, um per dom auf die Inhalte
                 * zugreifen zu können.
                 */
                var tmpspan = document.createElement('div');
                tmpspan.innerHTML = content.replace(/^\s\s*/, '');
            }

            if (tmpspan) {
                while (tmpspan.hasChildNodes()) {
                    elem.appendChild(tmpspan.firstChild);
                }
                fcms.addScripts(elem,content);
            }
        }
    },    
    
    redirect: function(link) {
        if (link && link.length) {
            document.location.href = link;
        }
    }
}

