text: /**
   * 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() {
          $.getJSON("library/flows",function(data) {
              //console.log(data);
  
              var buildMenu = function(data,root) {
                  var i;
                  var li;
                  var a;
                  var ul = document.createElement("ul");
                  ul.id = "btn-import-library-submenu";
                  ul.className = "dropdown-menu";
                  if (data.d) {
                      for (i in data.d) {
                          if (data.d.hasOwnProperty(i)) {
                              li = document.createElement("li");
                              li.className = "dropdown-submenu pull-left";
                              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 (i in data.f) {
                          if (data.f.hasOwnProperty(i)) {
                              li = document.createElement("li");
                              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,"");
              //TODO: need an api in RED.menu for this
              $("#btn-import-library-submenu").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");
              var li;
              for (var i=0;i<data.length;i++) {
                  var v = data[i];
                  if (typeof v === "string") {
                      // directory
                      li = buildFileListItem(v);
                      li.onclick = (function () {
                          var dirName = v;
                          return function(e) {
                              var bcli = $('<li class="active"><span class="divider">/</span> <a href="#">'+dirName+'</a></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="fa fa-folder"></i> '+v+"</i>";
                      ul.appendChild(li);
                  } else {
                      // file
                     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: 0px;">'+
              '<button id="node-input-'+options.type+'-lookup" class="btn input-append-right" data-toggle="dropdown"><i class="fa fa-book"></i> <i class="fa fa-caret-down"></i></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=0;i<options.fields.length;i++) {
                                  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);
                  $("#node-select-library-text").height("100%");
                  $(".form-row:last-child",form).children().height(form.height()-60);
              },
              resize: function(e) {
                  var form = $("form",this);
                  form.height(form.parent().height()-30);
                  $(".form-row:last-child",form).children().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=0;i<options.fields.length;i++) {
                  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
      }
  })();
  
  
  