/* Copyright (c) 2008-2010, Xaquseg
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * The name of Xaquseg may not be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY XAQUSEG ''AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL XAQUSEG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

function emptyBody() {
    while (document.body.lastChild !== null) {
        document.body.removeChild(document.body.lastChild);
    }
}

function genOption(dropdown, name, value) {
    var option = document.createElement("option");
    option.value = value;
    option.appendChild(document.createTextNode(name));
    dropdown.appendChild(option);
}

function genColorOptions(dropdown) {
    genOption(dropdown, "Red", "red");
    genOption(dropdown, "Green", "green");
    genOption(dropdown, "Blue", "default");
    genOption(dropdown, "Light Gray", "lightgray");
    genOption(dropdown, "Black", "black");
    
    dropdown.value = "default";
}

function genParam(applet, name, value) {
    var param = document.createElement("param");
    param.name = name;
    param.value = value;
    applet.appendChild(param);
}

function genParams(applet, server, channel, nick, nspassword, colorscheme) {
    genParam(applet, "archive", "irc.jar,pixx.jar");
    genParam(applet, "CABINETS", "irc.cab,securedirc.cab,pixx.cab");
    genParam(applet, "nick", nick);
    genParam(applet, "alternatenick", nick + "???");
    genParam(applet, "name", "PJIRC @ " + document.location.hostname);
    genParam(applet, "host", server);
    genParam(applet, "authorizedleavelist", "all-" + channel);
    genParam(applet, "coding", "2");
    genParam(applet, "gui", "pixx");
    genParam(applet, "pixx:timestamp", "true");
    genParam(applet, "pixx:highlight", "true");
    genParam(applet, "pixx:highlightnick", "true");
    genParam(applet, "pixx:showchanlist", "false");
    genParam(applet, "pixx:showhelp", "false");
    genParam(applet, "pixx:styleselector", "true");
    genParam(applet, "quitmessage", channel + " chat at " + document.location.hostname);
    
    genColors(applet, colorscheme);
    
    if(nspassword != "") {
        genParam(applet, "command1", "/nickserv identify " + nspassword);
        genParam(applet, "command2", "/join " + channel);
    } else {
        genParam(applet, "command1", "/join " + channel);
    }
}

function genApplet(server, channel, nick, nspassword, colorscheme) {
    var applet = document.createElement("object");
    applet.codeBase = "http://xaquseg.dswebhost.net/pjirc/";
    applet.classid = "java:IRCApplet.class";
    applet.code = "IRCApplet.class";
    applet.type = "application/x-java-applet";
    applet.archive = "irc.jar,pixx.jar";
    applet.width = 800;
    applet.height = 500;
    applet.style.position = "absolute";
    applet.style.left = "0";
    applet.style.right = "0";
    applet.style.top = "0";
    applet.style.bottom = "0";
    applet.style.width = "100%";
    applet.style.height = "100%";
    
    genParams(applet, server, channel, nick, nspassword, colorscheme);
    
    return applet;
}

function ieGenApplet(server, channel, nick, nspassword, colorscheme) {
    // IE is VERY uncooperative... insert a deprecated applet tag anyway in an attempt to support it...
    var applet = document.createElement("applet");
    applet.codeBase = "http://xaquseg.dswebhost.net/pjirc/";
    applet.code = "IRCApplet.class";
    applet.archive = "irc.jar,pixx.jar";
    if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight )) {
        //IE 6+
        applet.width = document.documentElement.clientWidth;
        applet.height = document.documentElement.clientHeight;
        applet.style.position = "absolute";
        applet.style.left = "0";
        applet.style.top = "0";
    } else {
        // fallback
        applet.width = 800;
        applet.height = 500;
    }
    
    genParams(applet, server, channel, nick, nspassword, colorscheme);
    
    return applet;
}

function genColors(applet, colorscheme) {
    switch(colorscheme) {
        case "red":
            genParam(applet, "pixx:color0", "000000");
            genParam(applet, "pixx:color1", "FFFFFF");
            genParam(applet, "pixx:color2", "550000");
            genParam(applet, "pixx:color3", "550000");
            genParam(applet, "pixx:color4", "AA0000");
            genParam(applet, "pixx:color5", "990000");
            genParam(applet, "pixx:color6", "770000");
            genParam(applet, "pixx:color7", "550000");
            genParam(applet, "pixx:color8", "FF0000");
            genParam(applet, "pixx:color9", "990000");
            genParam(applet, "pixx:color10", "880000");
            genParam(applet, "pixx:color11", "000088");
            genParam(applet, "pixx:color12", "880000");
            genParam(applet, "pixx:color13", "000077");
            genParam(applet, "pixx:color14", "770077");
            genParam(applet, "pixx:color15", "777777");
            break;
        case "green":
            genParam(applet, "pixx:color0", "000000");
            genParam(applet, "pixx:color1", "FFFFFF");
            genParam(applet, "pixx:color2", "005500");
            genParam(applet, "pixx:color3", "005500");
            genParam(applet, "pixx:color4", "00AA00");
            genParam(applet, "pixx:color5", "009900");
            genParam(applet, "pixx:color6", "007700");
            genParam(applet, "pixx:color7", "005500");
            genParam(applet, "pixx:color8", "00FF00");
            genParam(applet, "pixx:color9", "009900");
            genParam(applet, "pixx:color10", "008800");
            genParam(applet, "pixx:color11", "000088");
            genParam(applet, "pixx:color12", "880000");
            genParam(applet, "pixx:color13", "000077");
            genParam(applet, "pixx:color14", "770077");
            genParam(applet, "pixx:color15", "777777");
            break;
        case "lightgray":
            genParam(applet, "pixx:color0", "DEE3E7");
            genParam(applet, "pixx:color1", "000000");
            genParam(applet, "pixx:color2", "DEE3E7");
            genParam(applet, "pixx:color3", "DEE3E7");
            genParam(applet, "pixx:color4", "D1D7DC");
            genParam(applet, "pixx:color5", "DEE3E7");
            genParam(applet, "pixx:color6", "E5E5E5");
            genParam(applet, "pixx:color7", "D1D7DC");
            genParam(applet, "pixx:color8", "FFA34F");
            genParam(applet, "pixx:color9", "000000");
            genParam(applet, "pixx:color10", "EFEFEF");
            genParam(applet, "pixx:color11", "FFA34F");
            genParam(applet, "pixx:color12", "599FCB");
            genParam(applet, "pixx:color13", "DEE3E7");
            genParam(applet, "pixx:color14", "DEE3E7");
            genParam(applet, "pixx:color15", "DEE3E7");
            break;
        case "black":
            genParam(applet, "pixx:color0", "AAAAAA");
            genParam(applet, "pixx:color1", "CCCCCC");
            genParam(applet, "pixx:color2", "AAAAAA");
            genParam(applet, "pixx:color3", "888888");
            genParam(applet, "pixx:color4", "CCCCCC");
            genParam(applet, "pixx:color5", "333333");
            genParam(applet, "pixx:color6", "222222");
            genParam(applet, "pixx:color7", "222222");
            genParam(applet, "pixx:color8", "777777");
            genParam(applet, "pixx:color9", "333333");
            genParam(applet, "pixx:color10", "333333");
            genParam(applet, "pixx:color11", "333333");
            genParam(applet, "pixx:color12", "333333");
            genParam(applet, "pixx:color13", "333333");
            genParam(applet, "pixx:color14", "333333");
            genParam(applet, "pixx:color15", "444444");
            genParam(applet, "style:sourcecolorrule1", "all all 0=000000 1=DDDDDD 2=0000DD 3=00DD00 4=FF0000 5=DD8800 6=9944FF");
            break;
    }
}

function trySaveOptions(network, nickname, colorscheme) {
    if(localStorage && localStorage.setItem) {
       localStorage.setItem("irc." + network + ".nickname", nickname);
       localStorage.setItem("irc.generic.colorscheme", colorscheme);
    }
}

function writeForm(element, network, server, channel) {
    var form = document.createElement("form");
    form.id = "joinForm";
    form.action = "javascript:;";
    var nickLabel = document.createElement("label");
    nickLabel.appendChild(document.createTextNode("Nickname: "));
    var nickTextbox = document.createElement("input");
    nickTextbox.type = "text";
    nickTextbox.id = "nickTextbox";
    nickTextbox.size = 30;
    nickLabel.appendChild(nickTextbox);
    form.appendChild(nickLabel);
    
    form.appendChild(document.createElement("br"));
    
    var passwordLabel = document.createElement("label");
    passwordLabel.appendChild(document.createTextNode("NickServ password: "));
    var passwordTextbox = document.createElement("input");
    passwordTextbox.type = "password";
    passwordTextbox.id = "passwordTextbox";
    passwordTextbox.size = 30;
    passwordLabel.appendChild(passwordTextbox);
    passwordLabel.appendChild(document.createTextNode(" (optional)"));
    form.appendChild(passwordLabel);

    form.appendChild(document.createElement("br"));
    
    var colorLabel = document.createElement("label");
    colorLabel.appendChild(document.createTextNode("UI Color: "));
    var colorDropdown = document.createElement("select");
    colorDropdown.id = "colorDropdown";
    genColorOptions(colorDropdown);
    colorLabel.appendChild(colorDropdown);
    form.appendChild(colorLabel);
    
    if(localStorage && localStorage.getItem) {
        var nickname = localStorage.getItem("irc." + network + ".nickname");
        var colorscheme = localStorage.getItem("irc.generic.colorscheme");
        if(nickname != null) nickTextbox.value = nickname;
        if(colorscheme != null) colorDropdown.value = colorscheme;
    }

    form.appendChild(document.createElement("br"));

    var submitButton = document.createElement("input");
    submitButton.type = "submit";
    submitButton.value = "Join";
    form.appendChild(submitButton);
    if(form.addEventListener) {
        form.addEventListener('submit', function() {
            if(nickTextbox.value !== "") {
                var applet = genApplet(server, channel, nickTextbox.value, passwordTextbox.value, colorDropdown.value);
                emptyBody();
                document.body.appendChild(applet);
                if(_gaq !== null) {
                    _gaq.push('_trackEvent', ["PJIRC", "Join", server + "/" + channel]);
                }
                trySaveOptions(network, nickTextbox.value, colorDropdown.value);
            } else {
                alert("Nickname must not be empty.");
            }
        }, false);
    } else {
        form.attachEvent('onsubmit', function() {
            if(nickTextbox.value !== "") {
                var applet = ieGenApplet(server, channel, nickTextbox.value, passwordTextbox.value, colorDropdown.value);
                if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
                    // IE 6+
                    emptyBody();
                    document.body.appendChild(applet);
                    window.attachEvent('onresize', function() {
                        applet.width = document.documentElement.clientWidth;
                        applet.height = document.documentElement.clientHeight;
                    });
                } else {
                    form.parentNode.replaceChild(applet, form); 
                }
                if(_gaq !== null) {
                    _gaq.push('_trackEvent', ["PJIRC", "Join", server + "/" + channel]);
                }
                trySaveOptions(network, nickTextbox.value, colorDropdown.value);
            } else {
                alert("Nickname must not be empty.");
            }
        });
    }
    
    var versionbox = document.createElement("p");
    versionbox.appendChild(document.createTextNode("Chat launch script version 1.3.0 - by Xaquseg"));
    versionbox.style.marginLeft = "0";
    versionbox.style.fontSize = "75%";
    form.appendChild(versionbox);
    
    element.parentNode.replaceChild(form, element);
}
