(function ($) {
    var foreach = function (a,f){var c=0,len=a.length,i=len%8;if(i>0)do{f(a[c],c++,a);}while(--i);i=parseInt(len>>3);if(i>0)do{f(a[c],c++,a);f(a[c],c++,a);f(a[c],c++,a);f(a[c],c++,a);f(a[c],c++,a);f(a[c],c++,a);f(a[c],c++,a);f(a[c],c++,a);}while(--i);};
    var gst = function () { return ( document.body.scrollTop || document.documentElement.scrollTop ); };
    var got = function (item) {
	if ( item.getBoundingClientRect ) {
	    var box  = item.getBoundingClientRect();
	    var top  = box.top + Math.max( document.documentElement.scrollTop, document.body.scrollTop );
	    return top;
	} else {
	    var offsetTop=item.offsetTop,
	        parent=item.offsetParent;
	    while(parent){
	        offsetTop+=parent.offsetTop;
	        parent=parent.offsetParent;
	    };
	    return offsetTop;
	}
    };
    $.fn.JK = function () {
        var items = [], items_offset_top = [], item_marks = [];
        foreach(this,function (o) { items.push(o),
                                    // below is light weight. but is not currect.
                                    // items_offset_top.push(o.offsetTop);
                                    // below is heavy process. but is current.
                                    // items_offset_top.push( $( o ).offset().top );
                                    // below is middum process. current level is middle.
                                    items_offset_top.push( got( o ) );
                                  });
        !items.length && items.push( window );
        var items_length = items.length - 1;
        var item_active = {
                top : null,
                idx : null
        };
        var getActiveElementPosition = function () {
            var scrollTop = gst();
            if ( item_active.top == scrollTop && item_active.idx >= 0 ) {
                return {
                    idx    : item_active.idx,
                    isSame : true
                }
            }
            for ( var i = 0; i < items_length; i++ ) {
                if ( items_offset_top[i] > scrollTop ) {
                   return {
                       idx    : i,
                       isSame : false
                   };
                }
            }
            return {
                idx    : items_length,
                isSame : false
            }
        };
        var move = function ( idx ) {
            var item = items[ idx ];
            var top  = items_offset_top[ idx ];
            window.scrollTo(0, top - 20 );
            item.focus();
            item_active = {
                top : gst(),
                idx : idx
            };
        }
        return {
            next : function () {
                var state = getActiveElementPosition();
                var idx   = state.isSame ? items[ state.idx + 1 ] ? state.idx + 1 : items_length : items[ state.idx ] ? state.idx : items_length;
                move( idx );
            },
            prev : function () {
                var state = getActiveElementPosition();
                var idx   = state.isSame ? items[ state.idx - 1 ] ? state.idx - 1 : 0 : items[ state.idx ] ? state.idx : 0;
                move( idx );
            },
            isLDRize : !!document.getElementById("gm_ldrize")
        }
    }
})(jQuery);

/*
var JK = $("a").JK();

if ( !JK.isLDRize ) {
    JK.options = {
        type           : 'keypress',
        disableInInput : true
    };
    $.hotkeys.add('j', JK.options, JK.next);
    $.hotkeys.add('k', JK.options, JK.prev);
}
*/
/*
require
    - jquery.js-1.2 or higher
    use:
    -- jQuery.fn.offset
available-selector
    see:
    -- http://docs.jquery.com/Selectors
    example:
    -- "h3 a, div.hoge, #id"
code-example(use jquery.hotkeys.js => http://abui.nowa.jp/js/jquery/plugins/jquery.hotkeys.js)
   <script type='text/javascript' charset='utf-8' src='/js/jquery-1.2.3.js'></script>
   <script type='text/javascript' charset='utf-8' src='/js/jquery.hotkeys.js'></script>
   <script type='text/javascript' charset='utf-8' src='/js/jquery.JK.js'></script>
   <script type='text/javascript' charset='utf-8'>
       $(function () {
           var JK = $("a").JK();
           JK.options = {
               type           : 'keypress',
               disableInInput : true
           };
           $.hotkeys.add('j', JK.options, JK.next);
           $.hotkeys.add('k', JK.options, JK.prev);
       });
   </script>
memo:
   2815件のアイテムでもタイムロスなしに読み込めた
*/

