/*
plugin for async paging list like "fliterling content"
require: jquery.address
author: Takanobu Inafuku a.k.a inafact
*/

(function($){

   //!- initialize jquery.address setting
   $.address.init(function(e)
     {
       if(e.value != '/'){
         $(document).data('provider', {target:e.value, hash:''});
       }else{
         $(document).data('provider', {target:'', hash:''});
       }
       $.address.strict(false);
     }
   );

   //!- extend jquery
   $.fn.ajaxPager = function(navElements, loadStart, loadComp){
     //!- set stage
     var stg = this;
     var triggers = navElements.split(',');
     var rewritable = '';
     var statical = '';

     //!- will be arguments
     var statical_idprefix = 'tgl_';
     var statical_onclass = 'c';
     //--

     var _browser = jQuery.browser;
     var _version = jQuery.browser.version;
     var _connecting = false;
     var _xhr = null;

     var fn_start = loadStart;
     var fn_comp = loadComp;

     $(stg).data('readFrom', {value:''});
     $(stg).data('currentQuery', {value:''});

     for(var i = 0; i  < triggers.length; i ++){
       if(triggers[i].search($(this).attr('id')) != -1){
         rewritable += (rewritable != '' ? ',' : '') + triggers[i];
       }else{
         statical += (statical != '' ? ',' : '') + triggers[i];
       }
     }

     $.address.change(function(e)
       {
         if(_connecting){ //!- case of interrupt
           $(document).data('provider').target = '';
           _xhr.abort();
         }

         var checkids = '';
         //!- check toggle button class matching
         $($.address.value().split('+')).each(function(i, el)
           {
             checkids += ((i == 0 ? '' : ',') + statical_idprefix + el);
           }
         );
         $(statical).each(function(j,_el)
           {
             if(checkids.search($(_el).attr('id')) == -1){
               $(_el).attr('class', '');
             }else{
               if($(_el).attr('class') == ''){$(_el).toggleClass(statical_onclass);}
             }
           }
         );

         if(e.value != $(document).data('provider').hash){
           $(stg).data('readFrom', {value:$.address.baseURL() + '/?t=' + e.value});
           $(stg).data('currentQuery', {value:$.address.baseURL() + '/?t=' + e.value});
         }

         $(stg).trigger('tagFilter'); //!- bang
       }
     );

     //!- set trigger
     $(navElements).each(function(i, el)
       {
         //!- set dummy link, set jQuery.address callback function
         $(el).data('linkTo', {value:$(el).attr('href')});
         $(el).attr('href', $(el).data('linkTo').value.replace(/^(.+)(\/\?t=)(.+)/, '$1#$3'));

         $(el).address(function()
           {
             var addr = $.address.value(); //!- current inner-address

             if($(el).attr('id') != ''){ //!- el is statical element
               $(el).toggleClass(statical_onclass);
               var trigelm = $(el).attr('id').replace(statical_idprefix, '');
               if(addr == ''){ //!- no hash
                 $(statical).each(function(j,_el)
                   {
                     if($(_el).attr('id').replace(statical_idprefix, '') != trigelm){
                       addr += $(_el).attr('id').replace(statical_idprefix, '') + '+';
                     }
                   }
                 );
                 addr = addr.replace(/\+$/, '');
               }else{ //!- already has hash
                 if(addr.search(trigelm) == -1){
                   addr += ('+' + trigelm);
                 }else{
                   addr = addr.replace(new RegExp(trigelm + '[\+]*'), '');
                   addr = addr.replace(/\+$/, '');
                 }
               }
             }else{ //!- el is rewritable element
               addr = $(el).attr('href').replace($.address.baseURL() + '#', '');
             }

             $(stg).data('readFrom', {value:$.address.baseURL() + '/?t=' + addr});
             $(stg).data('currentQuery', {value:$.address.baseURL() + '/?t=' + addr});
             $(document).data('provider',{target:'clickableElement', hash:addr});

             return addr;
           }
         );
       }
     );

     return this.each(function(j){
       $(stg).bind('tagFilter', function(e)
         {
           _connecting = true;
           //!- loading function evaluate
           fn_start();

           _xhr = $.get(
             $(stg).data('readFrom').value, {},
             function(data)
             { //!- @load complete

               //!- check toggle button class matching
               var checkids = '';
               if($.address.value() == ''){
                 $(statical).each(function(i,el){$(el).attr('class', statical_onclass);});
               }else{
                 $($.address.value().split('+')).each(function(i, el)
                   {
                     checkids += ((i == 0 ? '' : ',') + statical_idprefix + el);
                   }
                 );
                 $(statical).each(function(i,el)
                   {
                     if(checkids.search($(el).attr('id')) == -1){
                       $(el).attr('class', '');
                     }else{
                       if($(el).attr('class') == ''){$(el).toggleClass(statical_onclass);}
                     }
                   }
                 );
               }

               //!- replace stg elements
               $(stg).html($(data).find('#' + $(stg).attr('id')).html());

               $(document).data('provider').target = '';

               //!- complete function evaluate
               fn_comp();

               _connecting = false;
             },
             'html'
           ); //!- ajax GET function end
         }
       ); //!- event onTagFilter end

       if(j == $(stg).size() - 1){
         if($(document).data('provider').target){
           if($(document).data('provider').target != ''){
             $(stg).data('readFrom', {value:$.address.baseURL() + '/?t=' + $.address.value()});
             $(stg).trigger('tagFilter');
           }
         }
       }

     });
   };

 }
)(jQuery);
