var Docs = function(){
    var layout, center;
    
    var classClicked = function(e, target){
    
    	  var tb = document.getElementById('tb');
    	  var title = target.innerHTML;
    	  tb.innerHTML = " " + target.getAttribute('path');
        var url = target.getAttribute("url");
        if (short_urls) {
          url = url.replace(/ /g,"_")
        }
        Docs.loadDoc(url);
    };
    
    return {
        init : function(){
            // initialize state manager, we will use cookies
            Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
            
            // create the main layout
            layout = new Ext.BorderLayout(document.body, {
                north: {
                    split:false,
                    initialSize: 32,
                    titlebar: false
                },
                west: {
                    split:true,
                    initialSize: 250,
                    minSize: 175,
                    maxSize: 400,
                    titlebar: true,
                    collapsible: true,
                    animate: true,
                    useShim:true,
                    cmargins: {top:2,bottom:2,right:2,left:2}
                },
                center: {
                    titlebar: true,
                    title: '<span id="tb">View Book</span>',
                    autoScroll:false,
                    tabPosition: 'top',
                    closeOnTab: true,
                    //alwaysShowTabs: true,
                    resizeTabs: true
                }
            });
            // tell the layout not to perform layouts until we're done adding everything
            layout.beginUpdate();
            layout.add('north', new Ext.ContentPanel('header'));
            
            layout.add('west', new Ext.ContentPanel('classes', {title: 'Bookshelf Explorer', fitToFrame:true}));
            center = layout.getRegion('center');
            center.add(new Ext.ContentPanel('main', {fitToFrame:true}));
            
            layout.restoreState();
            layout.endUpdate();
            
            var classes = Ext.get('classes');
			if(Docs.classData){
				var tree = new Ext.tree.TreePanel(classes, {
					loader: new Ext.tree.TreeLoader(),
					rootVisible:false,
                    animate:false
                });
                new Ext.tree.TreeSorter(tree, {folderSort:true,leafAttr:'isClass'});
                var root = new Ext.tree.AsyncTreeNode({
					text:'Ext Docs',
					children: [Docs.classData]
				});
				tree.setRootNode(root);

                tree.on('click', function(n){
                    if(n.isLeaf()){
                        Docs.loadDoc('output/'+n.attributes.fullName+'.html');
                    }
                });

                tree.render();
			}else{
            	 classes.on('click', classClicked, null, {delegate: 'a', stopEvent:true});
		         classes.select('h3').each(function(el){
		             var c = new NavNode(el.dom);
		             //if(!/^\s*(?:API Reference|Examples and Demos)\s*$/.test(el.dom.innerHTML)){
		                 c.collapse();
		             //}
		         });
		    }
            var page = window.location.href.split('?')[1];
            if (page) {
            	page = page.replace("sb_slide=","");
            	page = page.replace("/slide","/index.htm?slide");
            }
            if(!page){
                page = 'welcome.htm';
            }
            this.loadDoc(page);
            openFirstLink();
            // safari and opera have iframe sizing issue, relayout fixes it
			if(Ext.isSafari || Ext.isOpera){
				layout.layout();
			}
			
			var loading = Ext.get('loading');
			var mask = Ext.get('loading-mask');
			mask.setOpacity(.8);
			mask.shift({
				xy:loading.getXY(),
				width:loading.getWidth(),
				height:loading.getHeight(), 
				remove:true,
				duration:1,
				opacity:.3,
				easing:'bounceOut',
				callback : function(){
					loading.fadeOut({duration:.2,remove:true});
				}
			});
        },
        
        loadDoc : function(url){
            Ext.get('main').dom.src = url;
        }
    };
}();
Ext.onReady(Docs.init, Docs, true);

/**
 * Simple tree node class based on Collapser and predetermined markup.
 */
var NavNode = function(clickEl, collapseEl){
    this.clickEl = Ext.get(clickEl);
    if(!collapseEl){
        collapseEl = this.clickEl.dom.nextSibling;
        while(collapseEl.nodeType != 1){
            collapseEl = collapseEl.nextSibling;
        }
    }
    this.collapseEl = Ext.get(collapseEl);
    this.clickEl.addClass('collapser-expanded');
    this.clickEl.mon('click', function(){
        this.collapsed === true ? 
            this.expand() : this.collapse();
    }, this, true);
};

NavNode.prototype = {
    collapse : function(){
        this.collapsed = true;
        this.collapseEl.setDisplayed(false);
        this.clickEl.replaceClass('collapser-expanded','collapser-collapsed');
    },
    
    expand : function(){
        this.collapseEl.setDisplayed(true);
        this.collapsed = false;
        this.collapseEl.setStyle('height', '');   
        this.clickEl.replaceClass('collapser-collapsed','collapser-expanded');
    }
};

var sd = function(){

    var dialog, showBtn;

    return {
        init : function(){
             showBtn = Ext.get('show-dialog-btn');
             showBtn.on('click', this.showDialog, this);
        },

        showDialog : function(){
            if(!dialog){ 
                dialog = new Ext.BasicDialog("hello-dlg", {autoTabs:false,width:600,height:400,shadow:true,minWidth:300,minHeight:250,proxyDrag:true});
                dialog.addKeyListener(27, dialog.hide, dialog);
                //dialog.addButton('Submit', dialog.hide, dialog).disable();
                dialog.addButton('Close', dialog.hide, dialog);
            }
            dialog.show(showBtn.dom);
        }
    };
}();
 



// Define global variables
var SEARCHALL     = 2;
var searchType  = '';
var showMatches   = 140;
var currentMatch  = 0;
var copyArray   = new Array();
var sr      = document.getElementById("sr");

// Determine the type of search, and make
// sure the user has entered something
function v() {
	entry = document.forms[0].query.value;
  searchType = SEARCHALL;
  if (entry.length < 3) {
    alert("You cannot search strings that small. Elaborate a little.");
    document.forms[0].query.focus();
    return false;
  }
  try {
    if (noiseWords != undefined && noiseWords != '') {
       entry = entry.replace(noiseWords, ' ');
       re = /\s+/;
       entry = entry.replace(re, ' ');
    }
    convertString(entry);
  } catch (e) {
    alert(e);	
  }  
  return false;
}

// Put the search terms in an array and
// and call appropriate search algorithm
function convertString(reentry) {
  var searchArray = reentry.split(" ");
  requireAll(searchArray); 
}

//if the name starts with a letter and a number, cut
//those off and return remainder
function getAlias(name) {

var alias = name;
   
   re = /^\w\w\s\w/;
   if (re.test(name)) {
     alias = name.substr(3);
   }
   return alias;

}

//check for match
function requireAll(t) {
  
  //need to reload this in case user backed up
  sr = document.getElementById("sr");
 
  var phrase;
  var bookNum;
  var oldBookNum;
  var lineNums = new Array();
  var lineNum = 0;

  if (document.forms[0].queryType.selectedIndex == 1) {
     phrase = '';
     for (j = 0; j < t.length; j++) {
       phrase = phrase + " " + t[j];
     }
     re = /^\s/;
     phrase = phrase.replace(re, '');
     var findings = new Array();
     for (i = 0; i < sbookText.length; i++) {
        var allConfirmation = true;
        var allString       = sbookText[i];
        var refineAllString = allString;

        //line number of hit by book
        bookNum = sbookText[i].substring(0,2);
        if (oldBookNum != bookNum) {
           lineNum = 0;
        }
        lineNum++;
        oldBookNum = bookNum;

        if (refineAllString.indexOf(phrase) == -1) {
           allConfirmation = false;
        }
        if (allConfirmation) {
           findings[findings.length] = sbookText[i];
           lineNums[lineNums.length] = lineNum;
        }
     }
     verifyManage(findings, lineNums);
  
     return;
  }

  var findings = new Array();
  lineNum = 0;
  for (i = 0; i < sbookText.length; i++) {
    var allConfirmation = true;
    var allString       = sbookText[i];
    var refineAllString = allString;

    //line number of hit by book
    bookNum = sbookText[i].substring(0,2);
    if (oldBookNum != bookNum) {
       lineNum = 0;
    }
    lineNum++;
    oldBookNum = bookNum;

    for (j = 0; j < t.length; j++) {
      var allElement = t[j];
      if (refineAllString.indexOf(allElement) == -1) {
           allConfirmation = false;
           continue;
        }
      }
      if (allConfirmation) {
         findings[findings.length] = sbookText[i];
         lineNums[lineNums.length] = lineNum;
      }
    }

    verifyManage(findings, lineNums);
}

// Determine whether the search was successful
// If so print the results; if not, indicate that, too
function verifyManage(resultSet, lineNums) {
  if (resultSet.length == 0) { noMatch(); }
  else {
    copyArray = resultSet.sort();
    formatResults(copyArray, lineNums, currentMatch, showMatches);
    }
  }

// Define a function that indicates that the search returned no results
function noMatch() {
	
  var s = 
    '"' + document.forms[0].query.value + '" returned no results.';

  sr.style.display = '';
  sr.innerHTML = s;

  document.forms[0].query.select();

  }

// Define a function to print the results of a successful search
function formatResults(results, lineNums, reference, offset) {
	
  var currentRecord = (results.length < reference + offset ? results.length : reference + offset);
  var s = 
    'Search Query: <I>' + document.forms[0].query.value + '</I><BR>\n' +
    'Search Results: <I>' + (reference + 1) + ' - ' +
    currentRecord + ' of ' + results.length + '</I><BR><BR>';
   sr.style.display = '';

  var j;
  var oldBookNum;
  var srArray = [];
  for (var i = reference; i < currentRecord; i++) {
    var bookNum = results[i].substring(0,2);
    bookNum = bookNum / 1;
    var titleParts = urls[bookNum].split('/');
    
    var title = 
      getAlias(titleParts[0]) + " &gt;&gt; " + 
      getAlias(titleParts[1]) + " &gt;&gt; " +
    //  getAlias(titleParts[2]) + " &gt;&gt; " +
      getAlias(titleParts[3]) + " &gt;&gt; " + "Page " + lineNums[i];
    if (lineNums[i] < 10) {
       url = urls[bookNum] + "/index.htm?slide0" + (lineNums[i]) + ".htm";
      //url = urls[bookNum] + "/sbframetoc.htm?f=slide0" + (lineNums[i]) + ".htm";
    } else {
      url = urls[bookNum] + "/index.htm?slide" + (lineNums[i]) + ".htm";      
    }
    if (short_urls) {
    	url = url.replace(/ /g,"_");
    }    
    srArray[i] = '<div class="fakelink" onclick="goto(this,\'' +  url + '\')" >' + title + '</span><br>';
    
  }
  sr.innerHTML = s + srArray.join('');  
//  prevNextResults(results.length, reference, offset);
  
  
  document.forms[0].query.select();
}

function goto(me,url) {
  var classes = Ext.get('classes'); 
  classes.select('h3').each(function(el){
    var c = new NavNode(el.dom);
    c.collapse();
  });   
  
  classes = document.getElementById('classes');
  var links = classes.getElementsByTagName("A");
  var link;
  var menuUrl;
  var folder;
  var node;
  var c;
  for (var i = 0; i < links.length; i++) {
    link = links[i];
    menuUrl = link.getAttribute("url");
    if (short_urls) {
    	menuUrl = menuUrl.replace(/ /g,"_");
    }
    if (url.indexOf(menuUrl) != -1) {
      folder = getParentByClassName(link,"pkg");
      node = folder.getElementsByTagName("H3")[0];
      c = new NavNode(node);  	
      c.expand()      
      folder = getParentByClassName(folder,"pkg");
      node = folder.getElementsByTagName("H3")[0];
      c = new NavNode(node);  	
      c.expand();
      Docs.loadDoc(url);

  	  var tb = document.getElementById('tb');
   	  tb.innerHTML = " " + link.getAttribute('path');
      
    } else {
    }
  }

return;

}

function openFirstLink() {
try {	
	
  var classes = document.getElementById('classes');
  var links = classes.getElementsByTagName("A");
  var link = links[1];
  var menuUrl;
  var folder;
  var node;
  var c;
  menuUrl = link.getAttribute("url");
  folder = getParentByClassName(link,"pkg");
  node = folder.getElementsByTagName("H3")[0];
  c = new NavNode(node);  	
  c.expand()      
  folder = getParentByClassName(folder,"pkg");
  node = folder.getElementsByTagName("H3")[0];
  c = new NavNode(node);  	
  c.expand();
} catch (e) {

}
	
}

function getParentByTagName(el,tagName) {

  var p = el.parentNode;
  if (! p) return;
  if (p.tagName == tagName) {
    return p;
  } else {
    return getParentByTagName(p,tagName);
  }
  
}
function getParentByClassName(el,classname) {

  var p = el.parentNode;
  if (! p) return;
  if (p.className == classname) {
    return p;
  } else {
    return getParentByClassName(p,classname);
  }
  
}