/**
 * Klasa PageUpdate ma pozwalać określić elementy strony, które ulegają zmianie oraz obslużyć tą zmianę
 * Klasa pozwala na zdefiniowanie callbacków pre i post, które pozwolą np przebudować layout strony
 * Dodatkowo klasa odpowiedzialna jest za parsowanie urli znalezionych na stronie
 */
var PageUpdater = new Class(
{
  URI: null,
  periodicalId: null,
  loadedPageFragment: null,
  page: null,

  initialize: function( page )
  {
    this.startURI = new URI;
    this.loadedPageFragment = '/';
    this.parseLinks();
    this.page = page;
    this.page.injectIndicator();
  },
  parseLinks: function( linksCollection )
  {
    if( !linksCollection )
      linksCollection = $$('a');

    $each( linksCollection, function( link )
    {
      if( link.hasClass( 'parsed' ) )
        return;

      var linkHref = link.getProperty( 'href' );
      if( linkHref && linkHref.substr( linkHref.length - 1, 1 ) == '/' )
        linkHref = linkHref.substr( 0, linkHref.length - 1);

      var linkURI = new URI( linkHref );
      if( linkURI.get('host') != this.startURI.get('host') )
        return;

      var fragment = this.generatePartFor( linkURI );

      link.setProperty( 'href', this.startURI.set( 'fragment', fragment ).toString() );
      link.addClass( 'parsed' );

    }, this);
  },
  scrollTo: function( linkName )
  {
    var fx = new Fx.Scroll( window );
    fx.toElement( $$('a[name='+linkName+']')[0] );
  },
  startURLMonitoring: function( delay )
  {
    delay = delay ? delay : 500;
    this.periodicalId = this.handleURLChange.periodical( delay, this );
  },
  stopURLMonitoring: function()
  {
    $clear( this.periodicalId );
  },
  generatePartFor: function( linkURI )
  {
    var linkFile = ( linkURI.get('file') ? linkURI.get('file') : '' );
    var linkFullQuery = linkURI.get('directory') + linkFile;
    var pageFile = ( this.startURI.get('file') ? this.startURI.get( 'file') : '' );
    var pageFullQuery = this.startURI.get('directory') + pageFile;

    var fragment = linkFullQuery.replace( pageFullQuery, '' );
    fragment = fragment == '' ? '/' : fragment;
    return fragment;
  },
  isURLChanged: function( currentFragment )
  {
    if( currentFragment != this.loadedPageFragment )
      return currentFragment;
    else
      return false;
  },
  getCleanedURL: function()
  {
    newFragment = window.location.hash;
    newFragment = newFragment.replace( '#', '' );
    newFragment = newFragment == '' ? '/' : newFragment;
    return newFragment;
  },
  handleURLChange: function()
  {
    newFragment = this.getCleanedURL();
    if( !this.isURLChanged( newFragment ) )
      return;

    newFragment = newFragment.replace( '#', '' );
    this.loadedPageFragment = newFragment;
    var url = this.startURI.set( 'fragment', ( newFragment == '/' ? '' : newFragment ) ) .toString().replace( '#', '' );

    new Request.JSON(
    {
      'url': url,
      onSuccess: function( data )
      {
        this.page.hideIndicator();

        this.updatePage( data );
      }.bind( this ),
      onRequest: function()
      {
        this.page.showIndicator();
      }.bind( this )
    }).get();
  },
  updatePage: function( data )
  {
    this.page.update( data );

    if( data.goto_link )
      this.scrollTo( data.goto_link );

    this.parseLinks();

    if( window.pageTracker )
      pageTracker._trackPageview( '/' + this.loadedPageFragment );
  }
});

