/**
 * Copyright 2013 IBM Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 **/
RED.library = function() {
    
    
    function loadFlowLibrary() {
        d3.json("library/flows",function(data) {
                //console.log(data);

                var buildMenu = function(data,root) {
                    var ul = document.createElement("ul");
                    ul.className = "dropdown-menu";
                    if (data.d) {
                        for (var i in data.d) {
                            var li = document.createElement("li");
                            li.className = "dropdown-submenu pull-left";
                            var a = document.createElement("a");
                            a.href="#";
                            a.innerHTML = i;
                            li.appendChild(a);
                            li.appendChild(buildMenu(data.d[i],root+(root!=""?"/":"")+i));
                            ul.appendChild(li);
                        }
                    }
                    if (data.f) {
                        for (var i in data.f) {
                            var li = document.createElement("li");
                            var a = document.createElement("a");
                            a.href="#";
                            a.innerHTML = data.f[i];
                            a.flowName = root+(root!=""?"/":"")+data.f[i];
                            a.onclick = function() {
                                $.get('library/flows/'+this.flowName, function(data) {
                                        RED.view.importNodes(data);
                                });
                            };
                            li.appendChild(a);
                            ul.appendChild(li);
                        }
                    }
                    return ul;
                };
                var menu = buildMenu(data,"");
                $("#flow-menu-parent>ul").replaceWith(menu);
        });
    }
    loadFlowLibrary();


    
    function createUI(options) {
        var libraryData = {};
        var selectedLibraryItem = null;
        var libraryEditor = null;
        
        function buildFileListItem(item) {
            var li = document.createElement("li");
            li.onmouseover = function(e) { $(this).addClass("list-hover"); };
            li.onmouseout = function(e) { $(this).removeClass("list-hover"); };
            return li;
        }
        
        function buildFileList(root,data) {
            var ul = document.createElement("ul");
            
            for (var i in data) {
                var v = data[i];
                if (typeof v === "string") {
                    // directory
                    var li = buildFileListItem(v);
                    li.onclick = function () {
                        var dirName = v;
                        return function(e) {
                            var bcli = $('<li class="active"><a href="#">'+dirName+'</a> <span class="divider">/</span></li>');
                            $("a",bcli).click(function(e) { 
                                    $(this).parent().nextAll().remove();
                                    $.getJSON("library/"+options.url+root+dirName,function(data) {
                                        $("#node-select-library").children().first().replaceWith(buildFileList(root+dirName+"/",data));
                                    });
                                    e.stopPropagation();
                            });
                            var bc = $("#node-dialog-library-breadcrumbs");
                            $(".active",bc).removeClass("active");
                            bc.append(bcli);
                            $.getJSON("library/"+options.url+root+dirName,function(data) {
                                    $("#node-select-library").children().first().replaceWith(buildFileList(root+dirName+"/",data));
                            });
                        }
                    }();
                    li.innerHTML = '<i class="icon-folder-close"></i> '+v+"</i>";
                    ul.appendChild(li);
                } else {
                    // file
                   var li = buildFileListItem(v);
                   li.innerHTML = v.name;
                   li.onclick = function() {
                       var item = v;
                       return function(e) {
                           $(".list-selected",ul).removeClass("list-selected");
                           $(this).addClass("list-selected");
                           $.get("library/"+options.url+root+item.fn, function(data) {
                                   selectedLibraryItem = item;
                                   libraryEditor.setText(data);
                           });
                       }
                   }();
                   ul.appendChild(li);
                }
            }
            return ul;
        }
    
        $('#node-input-name').addClass('input-append-left').css("width","65%").after(
            '<div class="btn-group" style="margin-left: -5px;">'+
            '<button id="node-input-'+options.type+'-lookup" class="btn input-append-right" data-toggle="dropdown"><i class="icon-book"></i> <span class="caret"></span></button>'+
            '<ul class="dropdown-menu pull-right" role="menu">'+
            '<li><a id="node-input-'+options.type+'-menu-open-library" tabindex="-1" href="#">Open Library...</a></li>'+
            '<li><a id="node-input-'+options.type+'-menu-save-library" tabindex="-1" href="#">Save to Library...</a></li>'+
            '</ul></div>'
        );
    
        
        
        $('#node-input-'+options.type+'-menu-open-library').click(function(e) {
    
                $("#node-select-library").children().remove();
                var bc = $("#node-dialog-library-breadcrumbs");
                bc.children().first().nextAll().remove();
                libraryEditor.setText('');
                
                $.getJSON("library/"+options.url,function(data) {
                        $("#node-select-library").append(buildFileList("/",data));
                        $("#node-dialog-library-breadcrumbs a").click(function(e) {
                                $(this).parent().nextAll().remove();
                                $("#node-select-library").children().first().replaceWith(buildFileList("/",data));
                                e.stopPropagation();
                        });
                        $( "#node-dialog-library-lookup" ).dialog( "open" );
                });
                
                e.preventDefault();
        });
    
        $('#node-input-'+options.type+'-menu-save-library').click(function(e) {
                //var found = false;
                var name = $("#node-input-name").val().replace(/(^\s*)|(\s*$)/g,"");
    
                //var buildPathList = function(data,root) {
                //    var paths = [];
                //    if (data.d) {
                //        for (var i in data.d) {
                //            var dn = root+(root==""?"":"/")+i;
                //            var d = {
                //                label:dn,
                //                files:[]
                //            };
                //            for (var f in data.d[i].f) {
                //                d.files.push(data.d[i].f[f].fn.split("/").slice(-1)[0]);
                //            }
                //            paths.push(d);
                //            paths = paths.concat(buildPathList(data.d[i],root+(root==""?"":"/")+i));
                //        }
                //    }
                //    return paths;
                //};
                $("#node-dialog-library-save-folder").attr("value","");
    
                var filename = name.replace(/[^\w-]/g,"-");
                if (filename == "") {
                    filename = "unnamed-"+options.type;
                }
                $("#node-dialog-library-save-filename").attr("value",filename+".js");
    
                //var paths = buildPathList(libraryData,"");
                //$("#node-dialog-library-save-folder").autocomplete({
                //        minLength: 0,
                //        source: paths,
                //        select: function( event, ui ) {
                //            $("#node-dialog-library-save-filename").autocomplete({
                //                    minLength: 0,
                //                    source: ui.item.files
                //            });
                //        }
                //});
    
                $( "#node-dialog-library-save" ).dialog( "open" );
                e.preventDefault();
        });
    
        require(["orion/editor/edit"], function(edit) {
                libraryEditor = edit({
                        parent:document.getElementById('node-select-library-text'),
                        lang:"js",
                        readonly: true
                });
        });
    
        
        $( "#node-dialog-library-lookup" ).dialog({
                title: options.type+" library",
                modal: true,
                autoOpen: false,
                width: 800,
                height: 450,
                buttons: [
                    {
                        text: "Ok",
                        click: function() {
                            if (selectedLibraryItem) {
                                for (var i in options.fields) {
                                    var field = options.fields[i];
                                    $("#node-input-"+field).val(selectedLibraryItem[field]);
                                };
                                options.editor.setText(libraryEditor.getText());
                            }
                            $( this ).dialog( "close" );
                        }
                    },
                    {
                        text: "Cancel",
                        click: function() {
                            $( this ).dialog( "close" );
                        }
                    }
                ],
                open: function(e) {
                    var form = $("form",this);
                    form.height(form.parent().height()-30);
                    $(".form-row:last-child",form).height(form.height()-60);
                },
                resize: function(e) {
                    var form = $("form",this);
                    form.height(form.parent().height()-30);
                    $(".form-row:last-child",form).height(form.height()-60);
                }
        });
        
        function saveToLibrary(overwrite) {
            var name = $("#node-input-name").val().replace(/(^\s*)|(\s*$)/g,"");
            if (name == "") {
                name = "Unnamed "+options.type;
            }
            var filename = $("#node-dialog-library-save-filename").val().replace(/(^\s*)|(\s*$)/g,"");
            var pathname = $("#node-dialog-library-save-folder").val().replace(/(^\s*)|(\s*$)/g,"");
            if (filename == "" || !/.+\.js$/.test(filename)) {
                RED.notify("Invalid filename","warning");
                return;
            }
            var fullpath = pathname+(pathname==""?"":"/")+filename;
            if (!overwrite) {
                //var pathnameParts = pathname.split("/");
                //var exists = false;
                //var ds = libraryData;
                //for (var pnp in pathnameParts) {
                //    if (ds.d && pathnameParts[pnp] in ds.d) {
                //        ds = ds.d[pathnameParts[pnp]];
                //    } else {
                //        ds = null;
                //        break;
                //    }
                //}
                //if (ds && ds.f) {
                //    for (var f in ds.f) {
                //        if (ds.f[f].fn == fullpath) {
                //            exists = true;
                //            break;
                //        }
                //    }
                //}
                //if (exists) {
                //    $("#node-dialog-library-save-type").html(options.type);
                //    $("#node-dialog-library-save-name").html(fullpath);
                //    $("#node-dialog-library-save-confirm").dialog( "open" );
                //    return;
                //}
            }
            var queryArgs = [];
            for (var i in options.fields) {
                var field = options.fields[i];
                if (field == "name") {
                    queryArgs.push("name="+encodeURIComponent(name));
                } else {
                    queryArgs.push(encodeURIComponent(field)+"="+encodeURIComponent($("#node-input-"+field).val()));
                }
            }
            var queryString = queryArgs.join("&");
            
            var text = options.editor.getText();
            $.post("library/"+options.url+'/'+fullpath+"?"+queryString,text,function() {
                    RED.notify("Saved "+options.type,"success");
            });
        }
        $( "#node-dialog-library-save-confirm" ).dialog({
                title: "Save to library",
                modal: true,
                autoOpen: false,
                width: 530,
                height: 230,
                buttons: [
                    {
                        text: "Ok",
                        click: function() {
                            saveToLibrary(true);
                            $( this ).dialog( "close" );
                        }
                    },
                    {
                        text: "Cancel",
                        click: function() {
                            $( this ).dialog( "close" );
                        }
                    }
                ]
        });
        $( "#node-dialog-library-save" ).dialog({
                title: "Save to library",
                modal: true,
                autoOpen: false,
                width: 530,
                height: 230,
                buttons: [
                    {
                        text: "Ok",
                        click: function() {
                            saveToLibrary(false);
                            $( this ).dialog( "close" );
                        }
                    },
                    {
                        text: "Cancel",
                        click: function() {
                            $( this ).dialog( "close" );
                        }
                    }
                ]
        });

    }
    
    return {
        create: createUI,
        loadFlowLibrary: loadFlowLibrary
    }
}();