/* Language Search Form
 * Author: Dwight VanTuyl
 * Location: v2.linguistlist.org > /home/rubyprojects/MT_Prod/public/widgets/lang_search/set_elements.js
 * Description: Displays four separate forms for submitting language queries and a results list 
 * - Language Name Search
 * - Language Code Search
 * - Family Name Search
 * - Family Tree Select
 * 
 * Depends on Extjs 3.0 library
 * Example Usage:
 
         <head>
             <!--- extjs library files --->
             <link rel="stylesheet" type="text/css" href="http://multitree.linguistlist.org/widgets/ext/resources/css/ext-all.css"/>
             <script type="text/javascript" src="http://multitree.linguistlist.org/widgets/ext/adapter/ext/ext-base.js"></script>
             <script type="text/javascript" src="http://multitree.linguistlist.org/widgets/ext/ext-all.js"></script>
             
             
              <!--- multitree lang_search_form widget setup --->
              <link rel="stylesheet" type="text/css" href="find-a-language-or-family.css"/>
              <script type="text/javascript" src="http://multitree.linguistlist.org/widgets/lang_search/set_elements.js" ></script>
              <script type="text/javascript">
                  Ext.onReady(function(){
                    MultiTree.LangSearch.set_elements({
                      searchEl: 'searchPanel', 
                      resultsEl: 'resultsPanel', 
                      perPage: 10
                    });
              });
              </script>
          </head>
          
          <body>
              <div id="searchPanel"><!--- MultiTree.LangSearch widget generates search forms here  ---></div>
              <div id="resultsPanel"><!--- MultiTree.LangSearch widget generates results here ---></div>
          </body>
 *
 */

//Declare the Multitree Namespace so javascript variables do not conflict with other
Ext.namespace('MultiTree.LangSearch');

//Overwrites  the input search and results elements
// INPUT: searchElement: the div to render the 4 language search forms to
//        resultsElement: the div to render the results to
//        perPage: number of results per page (max 50)
MultiTree.LangSearch.set_elements = function(params){

   var searchElement = params.searchEl;
   var resultsElement = params.resultsEl;
   var limit = ((params.perPage != null && params.perPage <= 50) ? params.perPage : 50);
   
   Ext.QuickTips.init();
   var searchMsg = null;  //popup searching message variable
   
   // init language store for retrieved records
   var store = new Ext.data.Store({
        proxy: new Ext.data.ScriptTagProxy({
            method: 'get',
            url: 'http://multitree.linguistlist.org/nodes.json'
        }),
      reader: new Ext.data.JsonReader({
			root: 'nodes',
			id: 'id',
			totalProperty: 'results'
		}, [{name: 'id'},
      {name: 'tree_id'}, 
			{name: 'pri_name'},
            {name: 'family_name'},
            {name: 'family_code'},
            {name: 'alt_names'},
            {name: 'node_type'},
            {name: 'code'},
            {name: 'code_description'},
            {name: 'parent_type'},
            {name: 'parent_name'},
            {name: 'parent_code'},
            {name: 'code_authority'}
			]
		),
        listeners: {
                        
            // hide the search message and render paging toobars
            load: function(){
                searchMsg.hide();
                topPaging.show();
                
                if(store.getCount() > 0){
                  bottomPaging.show();
                }else{
                  bottomPaging.hide();
                }
                  
            },
            
            //server returned null. this is due to the user submitting less than 2 chars or server timeout due to traffic or long search times
            loadexception: function(){
                searchMsg.hide();
                Ext.Msg.alert('ERROR', 'Search criteria is too vague. Try adding more characters to your query.');
            }
        }
   });

  //define Language Name Search Form Handler
   var searchLangNameHandler = function(){
     searchMsg = Ext.Msg.wait("Searching...");
     searchLangCodeForm.form.reset();
     searchFamilyNameForm.form.reset();
     searchFamilyTreeForm.form.reset();
      params = searchLangNameForm.form.getValues();
      params.limit = limit;
      store.baseParams = params; 
      store.load();
   };
   //define Language Name Search Form
   var searchLangNameForm = new Ext.FormPanel({
        id: 'search-lang-name-form',
        cls: 'search-forms',
        itemCls: 'search-form-items',
        keys: [{
          key: Ext.EventObject.ENTER,
          fn: searchLangNameHandler,
          scope: this
        }],
        items: [
            {xtype: 'textfield', fieldLabel:'Language Name', width: 110, name: 'lang_name'},
            {xtype: 'button', text: 'GO', form: 'searchLangNameForm', tooltip:'Search language names', 
                handler: searchLangNameHandler
            },
            {xtype: 'button',text: 'Reset', tooltip:'Reset form', handler: function(){searchLangNameForm.form.reset();}}
        ]
        
   });
   
   
   //define Language Code Search Form Handler
   var searchLangCodeHandler = function(){
      searchMsg = Ext.Msg.wait("Searching...");
      searchLangNameForm.form.reset();
      searchFamilyNameForm.form.reset();
      searchFamilyTreeForm.form.reset();
      params = searchLangCodeForm.form.getValues();
      params.limit = limit;
      store.baseParams = params; 
      store.load();
   };
   //define Language Code Search Form
   var searchLangCodeForm = new Ext.FormPanel({
        id: 'search-lang-code-form',
        cls: 'search-forms',
        itemCls: 'search-form-items',
        keys: [{
          key: Ext.EventObject.ENTER,
          fn: searchLangCodeHandler,
          scope: this
        }],
        items: [
            {xtype: 'textfield', fieldLabel:'Language Code', width: 110, name: 'lang_code'},
            {xtype: 'button', text: 'GO', form: 'searchLangCodeForm',  tooltip:'Search language codes', 
                handler: searchLangCodeHandler
            },
            {xtype: 'button',text: 'Reset', tooltip:'Reset form',handler: function(){searchLangCodeForm.form.reset();}}   
        ]
   });
   
   //define Language Code Search Form Handler
   var searchFamilyNameHandler = function(){
      searchMsg = Ext.Msg.wait("Searching...");
      searchLangCodeForm.form.reset();
      searchLangNameForm.form.reset();
      searchFamilyTreeForm.form.reset();
      params = searchFamilyNameForm.form.getValues();
      params.limit = limit;
      store.baseParams = params; 
      store.load();
   };
   //define Family Name Search Form
   var searchFamilyNameForm = new Ext.FormPanel({
        id: 'search-family-name-form',
        cls: 'search-forms',
        labelWidth: 80,
        itemCls: 'search-form-items',
        keys: [{
          key: Ext.EventObject.ENTER,
          fn: searchFamilyNameHandler,
          scope: this
        }],
        items: [
            {xtype: 'textfield', fieldLabel:'Family Name', width: 110,  name: 'family_name'},
            {xtype: 'button', text: 'GO', form:'searchFamilyNameForm',  tooltip:'Search family names', 
                handler: searchFamilyNameHandler
            },
            {xtype: 'button',text: 'Reset', tooltip:'Reset form',handler: function(){searchFamilyNameForm.form.reset();}}       
        ]
   });
   
   //define Family Tree Form
   var searchFamilyTreeForm = new Ext.FormPanel({
        id: 'search-family-tree-form',
        cls: 'search-forms',
        labelWidth: 80, 
        itemCls: 'search-form-items',
        keys: [{
          key: Ext.EventObject.ENTER,
          fn: function(){
             var code = searchFamilyTreeForm.form.findField('family-tree-cmb').getValue();
             if(code != ''){
                window.open("http://multitree.linguistlist.org/codes/" + code);
             }
          },
          scope: this
        }],
        items: [ 
            new Ext.form.ComboBox({
                name: 'family-tree-cmb',
                width: 110,
                fieldLabel:'Family Tree',
                cls: 'combo',
                valueField: 'code',                
                displayField: 'pri_name',
                triggerAction: 'all',
                typeAhead: true,
                forceSelection: true,
                minChars: 2,
                store: new Ext.data.Store({
                    baseParams: {family_tree: true},
                    proxy: new Ext.data.ScriptTagProxy({
                        method: 'get',
                        url: 'http://multitree.linguistlist.org/nodes.json'
                    }),
                    reader: new Ext.data.JsonReader({
                        root: 'nodes',
                        id: 'code',
                        totalProperty: 'results'}, 
                        [{name: 'code'},{name: 'pri_name'}]
                    )
               }) 
            }),
            {xtype: 'button', text: 'GO', form: 'searchFamilyTreeForm',  tooltip:'Open the selected family', 
                handler: function(){
                    var code = searchFamilyTreeForm.form.findField('family-tree-cmb').getValue();
                    if(code != ''){window.open("http://multitree.linguistlist.org/codes/" + code);}
                }
            },
            {xtype: 'button',text: 'Reset', tooltip:'Reset form',handler: function(){searchFamilyTreeForm.form.reset();}}            
        ]
   });
   
   //Results template renders the results encapuslated in html
   var tpl = new Ext.XTemplate(
	    '<tpl for=".">',
	        '<div class="lang-item" id="lang-item-{id}">',
		        '<a class="lang-link" target="_blank" href="http://multitree.linguistlist.org/codes/{code}">{pri_name}</a>',
                '<tpl if="alt_names">',
					'<span class="lang-alt-names">({alt_names})</span>',
				'</tpl>',
                '<ul class="lang-info-list">',
                    '<tpl if="code_description">',
                        '<li><span class="info-lbl">description:</span>{code_description}</li>',
                    '</tpl>',
                    '<li>',
                      '<span class="info-lbl">type:</span>{node_type}',
                      '<span class="bar-lbl">|</span>',
                      '<span class="info-lbl">code:</span>{code}',
                      '<span class="bar-lbl">|</span>',
                      '<span class="info-lbl">authority:</span>{code_authority}',
                      '<tpl if="parent_type">',
                        '<span class="bar-lbl">|</span>',
                        '<span class="info-lbl">parent {parent_type}:</span><a target="_blank" href="http://multitree.linguistlist.org/codes/{parent_code}">{parent_name}</a>',
                      '</tpl>',
                      '<tpl if="family_name">',
                        '<span class="bar-lbl">|</span>',
                        '<span class="info-lbl">family:</span><a target="_blank" href="http://multitree.linguistlist.org/codes/{family_code}">{family_name}</a>',
                      '</tpl>',
                    '</li>',
                    '<li><ul class="more-info">',
                        '<li class="more-info-item"><span class="info-lbl">more info:</span></li>',
                        '<tpl if="tree_id">',
                          '<li class="more-info-item"><img height="13" width="13" src="http://multitree.linguistlist.org/widgets/lang_search/mt-tiny.gif" />',
                            '<a target="_blank" href="http://multitree.linguistlist.org/trees/{tree_id}@{id}">Tree</a>',
                          '</li>',
                        '</tpl>',
                        '<tpl if="this.isLanguage(node_type)"',
                          '<li class="more-info-item"><img height="13" width="13" src="http://multitree.linguistlist.org/widgets/lang_search/llmap-tiny.gif" />',
                            '<a target="_blank" href="http://llmap.org/language/{code}/data_browser.html">Map</a>',
                          '</li>',
                        '</tpl>',
                        '<tpl if="this.isDialect(node_type)"',
                          '<li class="more-info-item"><img height="13" width="13" src="http://multitree.linguistlist.org/widgets/lang_search/llmap-tiny.gif" />',
                            '<a target="_blank" href="http://llmap.org/language/{parent_code}/data_browser.html">Map</a>',
                          '</li>',
                        '</tpl>',
                    '</ul></li>',
                '</ul>',
            '</div>',
            '<div style="clear: both;"></div>',
		'</tpl>', {
      isLanguage: function(node_type){
        return node_type == 'Language';
      },
      isDialect: function(node_type){
        return (node_type == 'Dialect' || node_type == 'Dialect Group');
      }
    });

   //Render all search forms into the user specified searchElement
   var searchPanel = new Ext.Panel({
      layout: 'table',
      border: false,
      layoutConfig: {columns: 2},
      renderTo: searchElement,
      items: [searchLangNameForm, searchFamilyNameForm,searchLangCodeForm, searchFamilyTreeForm]
   });
   
   //define top and bottom paging toolbars for results panel
   var topPaging = new Ext.PagingToolbar({
          pageSize: limit,
          store: store,
          displayInfo: true,
          emptyMsg: "No records found",
          hidden: true
        });
        
   var bottomPaging = new Ext.PagingToolbar({
          pageSize: limit,
          store: store,
          displayInfo: true,
          emptyMsg: "No records found",
          hidden: true
        });
   
   //Render the results into the user specified resultsElement
   var resultsPanel = new Ext.Panel({
        border: false,
        layout: 'fit',
        items: [
            new Ext.DataView({
                border: false,
                store: store,
                itemSelector: 'div.lang-item',
                overClass:'lang-item-over',
                autoHeight:true,
                tpl: tpl
            })
        ],
        renderTo: resultsElement,
        tbar: topPaging,
        bbar: bottomPaging
   });

};
