Array.prototype.contain = function (value, field) {
    var i;
    for (i = 0; i < this.length; i++) {
        if (field) {
            if (this[field] == value) {
                return true;
            }
        }
        else if (this[i] == value) {
            return true;
        }
    }
    return false;
};

/*
xml2json v 1.1
copyright 2005-2007 Thomas Frank

This program is free software under the terms of the 
GNU General Public License version 2 as published by the Free 
Software Foundation. It is distributed without any warranty.
*/

xml2json = {
    parser: function(xmlcode, ignoretags, debug) {
        if (!ignoretags) { ignoretags = "" };
        xmlcode = xmlcode.replace(/\s*\/>/g, '/>');
        xmlcode = xmlcode.replace(/<\?[^>]*>/g, "").replace(/<\![^>]*>/g, "");
        if (!ignoretags.sort) { ignoretags = ignoretags.split(",") };
        var x = this.no_fast_endings(xmlcode);
        x = this.attris_to_tags(x);
        x = escape(x);
        x = x.split("%3C").join("<").split("%3E").join(">").split("%3D").join("=").split("%22").join("\"");
        for (var i = 0; i < ignoretags.length; i++) {
            x = x.replace(new RegExp("<" + ignoretags[i] + ">", "g"), "*$**" + ignoretags[i] + "**$*");
            x = x.replace(new RegExp("</" + ignoretags[i] + ">", "g"), "*$***" + ignoretags[i] + "**$*")
        };
        x = '<JSONTAGWRAPPER>' + x + '</JSONTAGWRAPPER>';
        this.xmlobject = {};
        var y = this.xml_to_object(x).jsontagwrapper;
        if (debug) { y = this.show_json_structure(y, debug) };
        return y
    },
    xml_to_object: function(xmlcode) {
        var x = xmlcode.replace(/<\//g, "§");
        x = x.split("<");
        var y = [];
        var level = 0;
        var opentags = [];
        for (var i = 1; i < x.length; i++) {
            var tagname = x[i].split(">")[0];
            opentags.push(tagname);
            level++
            y.push(level + "<" + x[i].split("§")[0]);
            while (x[i].indexOf("§" + opentags[opentags.length - 1] + ">") >= 0) { level--; opentags.pop() }
        };
        var oldniva = -1;
        var objname = "this.xmlobject";
        for (var i = 0; i < y.length; i++) {
            var preeval = "";
            var niva = y[i].split("<")[0];
            var tagnamn = y[i].split("<")[1].split(">")[0];
            tagnamn = tagnamn.toLowerCase();
            var rest = y[i].split(">")[1];
            if (niva <= oldniva) {
                var tabort = oldniva - niva + 1;
                for (var j = 0; j < tabort; j++) { objname = objname.substring(0, objname.lastIndexOf(".")) }
            };
            objname += "." + tagnamn;
            var pobject = objname.substring(0, objname.lastIndexOf("."));
            if (eval("typeof " + pobject) != "object") { preeval += pobject + "={value:" + pobject + "};\n" };
            var objlast = objname.substring(objname.lastIndexOf(".") + 1);
            var already = false;
            for (k in eval(pobject)) { if (k == objlast) { already = true } };
            var onlywhites = true;
            for (var s = 0; s < rest.length; s += 3) {
                if (rest.charAt(s) != "%") { onlywhites = false }
            };
            if (rest != "" && !onlywhites) {
                if (rest / 1 != rest) {
                    rest = "'" + rest.replace(/\'/g, "\\'") + "'";
                    rest = rest.replace(/\*\$\*\*\*/g, "</");
                    rest = rest.replace(/\*\$\*\*/g, "<");
                    rest = rest.replace(/\*\*\$\*/g, ">")
                }
            }
            else { rest = "{}" };
            if (rest.charAt(0) == "'") { rest = 'unescape(' + rest + ')' };
            if (already && !eval(objname + ".sort")) { preeval += objname + "=[" + objname + "];\n" };
            var before = "="; after = "";
            if (already) { before = ".push("; after = ")" };
            var toeval = preeval + objname + before + rest + after;
            eval(toeval);
            if (eval(objname + ".sort")) { objname += "[" + eval(objname + ".length-1") + "]" };
            oldniva = niva
        };
        return this.xmlobject
    },
    show_json_structure: function(obj, debug, l) {
        var x = '';
        if (obj.sort) { x += "[\n" } else { x += "{\n" };
        for (var i in obj) {
            if (!obj.sort) { x += i + ":" };
            if (typeof obj[i] == "object") {
                x += this.show_json_structure(obj[i], false, 1)
            }
            else {
                if (typeof obj[i] == "function") {
                    var v = obj[i] + "";
                    //v=v.replace(/\t/g,"");
                    x += v
                }
                else if (typeof obj[i] != "string") { x += obj[i] + ",\n" }
                else { x += "'" + obj[i].replace(/\'/g, "\\'").replace(/\n/g, "\\n").replace(/\t/g, "\\t").replace(/\r/g, "\\r") + "',\n" }
            }
        };
        if (obj.sort) { x += "],\n" } else { x += "},\n" };
        if (!l) {
            x = x.substring(0, x.lastIndexOf(","));
            x = x.replace(new RegExp(",\n}", "g"), "\n}");
            x = x.replace(new RegExp(",\n]", "g"), "\n]");
            var y = x.split("\n"); x = "";
            var lvl = 0;
            for (var i = 0; i < y.length; i++) {
                if (y[i].indexOf("}") >= 0 || y[i].indexOf("]") >= 0) { lvl-- };
                tabs = ""; for (var j = 0; j < lvl; j++) { tabs += "\t" };
                x += tabs + y[i] + "\n";
                if (y[i].indexOf("{") >= 0 || y[i].indexOf("[") >= 0) { lvl++ }
            };
            if (debug == "html") {
                x = x.replace(/</g, "&lt;").replace(/>/g, "&gt;");
                x = x.replace(/\n/g, "<BR>").replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;")
            };
            if (debug == "compact") { x = x.replace(/\n/g, "").replace(/\t/g, "") }
        };
        return x
    },
    no_fast_endings: function(x) {
        x = x.split("/>");
        for (var i = 1; i < x.length; i++) {
            var t = x[i - 1].substring(x[i - 1].lastIndexOf("<") + 1).split(" ")[0];
            x[i] = "></" + t + ">" + x[i]
        };
        x = x.join("");
        return x
    },
    attris_to_tags: function(x) {
        var d = ' ="\''.split("");
        x = x.split(">");
        for (var i = 0; i < x.length; i++) {
            var temp = x[i].split("<");
            for (var r = 0; r < 4; r++) { temp[0] = temp[0].replace(new RegExp(d[r], "g"), "_jsonconvtemp" + r + "_") };
            if (temp[1]) {
                temp[1] = temp[1].replace(/'/g, '"');
                temp[1] = temp[1].split('"');
                for (var j = 1; j < temp[1].length; j += 2) {
                    for (var r = 0; r < 4; r++) { temp[1][j] = temp[1][j].replace(new RegExp(d[r], "g"), "_jsonconvtemp" + r + "_") }
                };
                temp[1] = temp[1].join('"')
            };
            x[i] = temp.join("<")
        };
        x = x.join(">");
        x = x.replace(/ ([^=]*)=([^ |>]*)/g, "><$1>$2</$1");
        x = x.replace(/>"/g, ">").replace(/"</g, "<");
        for (var r = 0; r < 4; r++) { x = x.replace(new RegExp("_jsonconvtemp" + r + "_", "g"), d[r]) };
        return x
    }
};


if (!Array.prototype.push) {
    Array.prototype.push = function(x) {
        this[this.length] = x;
        return true
    }
};

if (!Array.prototype.pop) {
    Array.prototype.pop = function() {
        var response = this[this.length - 1];
        this.length--;
        return response
    }
};


