<%-- 
    Document   : importFromWsdl
    Created on : July 11, 2013, 6:52:05 PM
    Author     : Alex O'Ree
--%>

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="javax.xml.datatype.XMLGregorianCalendar"%>
<%@page import="javax.xml.ws.Holder"%>
<%@page import="org.apache.juddi.webconsole.resources.ResourceLoader"%>
<%@page import="org.apache.juddi.webconsole.hub.UddiHub"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@include file="header-top.jsp" %>
<div class="container">

    <!-- Main hero unit for a primary marketing message or call to action -->
    <div class="well" >
        <h1><%=ResourceLoader.GetResource(session, "navbar.create.serviceimport")%></h1>

    </div>

    <!-- Example row of columns -->
    <div class="row">
        <div class="span12" >
            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content")%>
            <Br>
            <br>

            <div class="accordion" id="accordion2">
                <div class="accordion-group">
                    <div class="accordion-heading">
                        <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapse1">
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step1")%>
                        </a>
                    </div>
                    <div id="collapse1" class="accordion-body collapse in">
                        <div class="accordion-inner">
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step1a")%><br>
                            <input type="text" id="wsdlurl" placeholder="http://localhost:8080/services/myService?wsdl" style="width:100%" ><br>
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step1b")%><br>
                            <%
                                if (!request.isSecure()) {
                            %>
                            <div class="alert alert-error">
                                <button type="button" class="close" data-dismiss="alert">&times;</button>
                                <h4><i class="icon-warning-sign"></i> <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.sslwarning")%></h4>
                                <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.usessl")%>

                            </div>
                            <%                                }
                            %>
                            <input type="text" id="wsdlusername" placeholder="<%=ResourceLoader.GetResource(session, "navbar.login.username")%> <%=ResourceLoader.GetResource(session, "items.optional")%>" ><br>
                            <input type="text" id="wsdlpassword" placeholder="<%=ResourceLoader.GetResource(session, "navbar.login.password")%> <%=ResourceLoader.GetResource(session, "items.optional")%>" ><br>
                            <input type="checkbox" id="wsdlignoressl" > <%=ResourceLoader.GetResource(session, "items.ignoresslerror")%><br>
                        </div>
                    </div>
                </div>
                <script type="text/javascript">

                    //by James Padolsey
                    //http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
                    function parseURL(url) {
                        var a = document.createElement('a');
                        a.href = url;
                        return {
                            source: url,
                            protocol: a.protocol.replace(':', ''),
                            host: a.hostname,
                            port: a.port,
                            query: a.search,
                            params: (function() {
                                var ret = {},
                                        seg = a.search.replace(/^\?/, '').split('&'),
                                        len = seg.length, i = 0, s;
                                for (; i < len; i++) {
                                    if (!seg[i]) {
                                        continue;
                                    }
                                    s = seg[i].split('=');
                                    ret[s[0]] = s[1];
                                }
                                return ret;
                            })(),
                            file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
                            hash: a.hash.replace('#', ''),
                            path: a.pathname.replace(/^([^\/])/, '/$1'),
                            relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
                            segments: a.pathname.replace(/^\//, '').split('/')
                        };
                    }

                    //after is entered, fetch the wsdl, parse the key domain
                    var trigger1_triggered = false;
                    //considerations, if its an ip address? what about localhost
                    function trigger1()
                    {
                        if (!trigger1_triggered)
                        {
                            var l = parseURL($("#wsdlurl").val());
                            $("#keydomain").val(l.host);
                            $("#collapse1").collapse('hide');
                            $("#collapse2").collapse('show');
                            trigger1_triggered = true;
                        }
                    }

                    function save(preview)
                    {
                        var postbackdata = new Array();
                        var url = 'ajax/importFromWsdl.jsp';
                        postbackdata.push({
                            name: "nonce",
                            value: $("#nonce").val()
                        });
                        if (preview) {
                            postbackdata.push({
                                name: "formaction",
                                value: "preview"
                            });
                        }
                        else
                        {
                            postbackdata.push({
                                name: "formaction",
                                value: "save"
                            });
                        }
                        postbackdata.push({
                            name: "wsdlusername",
                            value: $("#wsdlusername").val()
                        });
                        postbackdata.push({
                            name: "wsdlpassword",
                            value: $("#wsdlpassword").val()
                        });
                        postbackdata.push({
                            name: "wsdlurl",
                            value: $("#wsdlurl").val()
                        });
                        if ($('#wsdlignoressl').is(':checked')) {
                            postbackdata.push({
                                name: "ignoressl",
                                value: true
                            });
                        }
                        else
                        {
                            postbackdata.push({
                                name: "ignoressl",
                                value: false
                            });
                        }
                        postbackdata.push({
                            name: "businessname",
                            value: $("#businessname").val()
                        });

                        postbackdata.push({
                            name: "keydomain",
                            value: $("#keydomain").val()
                        });




                        var request = $.ajax({
                            url: url,
                            type: "POST",
                            //  dataType: "html", 
                            cache: false,
                            //  processData: false,f
                            data: postbackdata
                        });


                        request.done(function(msg) {
                            window.console && console.log('postback done ' + url);
                            $("#preview").html(msg);
                        });

                        request.fail(function(jqXHR, textStatus) {
                            window.console && console.log('postback failed ' + url);
                            $("#preview").html(jqXHR + textStatus);

                        });
                    }

                </script>
                <div class="accordion-group">
                    <div class="accordion-heading">
                        <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapse2" onclick="trigger1();">
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step2")%>
                        </a>
                    </div>
                    <div id="collapse2" class="accordion-body collapse">
                        <div class="accordion-inner">
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step2a")%>
                            <br>
                            <input type="text" id="keydomain" placeholder="<%=ResourceLoader.GetResource(session, "items.import.autofill")%>">
                        </div>
                    </div>
                </div>

                <div class="accordion-group">
                    <div class="accordion-heading">
                        <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapse3">
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step3")%>

                        </a>
                    </div>
                    <div id="collapse3" class="accordion-body collapse">
                        <div class="accordion-inner">
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step3a")%><br>
                            <a href="javascript:loadBusinessModel();"><i class="icon-list-alt icon-large"></i> <%=ResourceLoader.GetResource(session, "items.picker")%></a>

                            <script type="text/javascript">
                    function loadBusinessModel()
                    {
                        reloadBusinessModal();
                        $.dialogBusiness.confirm({
                            callback: function(success, result) {
                                if (success)
                                {
                                    for (var i = 0; i < result.length; i++) {
                                        $("#businessname").val(result[i]);
                                        //if ($("#keylist option[value='"+result[i]+"']").length == 0)
                                        //$("#keylist").append("<option value=\"" + result[i] + "\">" + result[i] + "</option>");
                                    }

                                }
                            }
                        });
                    }
                            </script>
                            <input type="text" id="businessname" placeholder="<%=ResourceLoader.GetResource(session, "items.import.bizname")%>">
                        </div>
                    </div>
                </div>


                <div class="accordion-group">
                    <div class="accordion-heading">
                        <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapse4">
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step4")%>
                        </a>
                    </div>
                    <div id="collapse4" class="accordion-body collapse">
                        <div class="accordion-inner">
                            <%=ResourceLoader.GetResource(session, "pages.serviceimport.content.step4a")%>

                            <Br><br>
                            <div id="preview"></div>
                            <a class="btn btn-info" onclick="javascript:save(true);"><i class="icon-eye-open icon-large"></i> <%=ResourceLoader.GetResource(session, "actions.preview")%></a>
                            <a class="btn btn-primary" onclick="javascript:save(false);"><i class="icon-save icon-large"></i>  <%=ResourceLoader.GetResource(session, "actions.save")%></a>
                        </div>
                    </div>
                </div>

            </div>



        </div>
    </div>

    <%@include file="businessChooser.jsp" %>
    <%@include file="header-bottom.jsp" %>