var ProjectClass = function( key, onUpdateReady, initialData ){
  var self = this;
  this.key = key;
  var infoURL, saveURL;
  var infoMessage = [];
  self.params = {};
  Object.extend(this, {

    init  : function(_infoURL, _saveURL){
      infoURL = _infoURL;
      saveURL = _saveURL;

      $('gotoPageInputField').hide();

      if (initialData) {
        self.params = initialData;
        self.updatePageIndex();
        (onUpdateReady || function(){console.log('nothing to do')})();
      } else {
        self.update();
      }
    },


    update: function(caller, params){
      new Ajax.Request( (params) ? saveURL : infoURL, {
        parameters: Object.extend(
          { projectKey: key, productsize: $F('productsize'), caller: (caller) ? caller.id : null },
          (params || {} )
        ),
        requestHeaders: {Accept: 'application/json'},
        onSuccess: function(t){
	  
          self.params       = t.responseText.evalJSON();
          InfoMessage = [];
          if ( self.params.hasEmptyPages ) {
            infoMessage.push(hintminimumpages);
          }
          if ( self.params.sizeChanged ) {
            infoMessage.push(changesideformat);
          }
          self.updatePageIndex();

          try {
            (onUpdateReady || function(){console.log('nothing to do')})();
          }
          catch (e) {
            for (var i in e) {
              console.log('WB-Exception: '+i + ': '+e[i]);
            }
          }
        },
        onException: function(req,e) {
          for (var i in e) {
            console.log('Ajax-Exception: '+i + ': '+e[i]);
          }
        }
      });
    },

    updatePageIndex : function() {
      // wenn seiten vorhanden: "zeige gehe zu Seite"
      if( parseInt(self.params.logicalPageCount) > 0 ) {
        $('gotoPageInputField').show();
      }
      if (self.params.contentDuplex) {
        self.maxPageIndex = Math.floor(parseInt(self.params.logicalPageCount)/2);
      } else {
        self.maxPageIndex = parseInt(self.params.logicalPageCount)-1;
      }
      // console.log(self.maxPageIndex);
    },

    contentPagenums: function(index){
      var duplex = self.params.contentDuplex;
      var p1 = (duplex) ? 2*index :   0;
      var p2 = (duplex) ? 2*index+1 : index+1;
      return [ p1, p2 ];
    },

    getImgUrl: function(type){
      var params = { pk: key, 'sb': 1, 'nbh': 1, 'ck' : this.params.cachekeys[type] };
      return '/interfaces/img_cover_wb.php?'+($H(params).toQueryString());
    }
  });
}

var WorkbenchClass = function(){
  var self = this;
  var sess;
  var project;
  var uploader;
  var progress;
  var throbberCount = 0;
  var currentTitle;
  var currentAuthor;
  var modPage;
  var checkGotoInput;

  Object.extend(this, {
    init: function(key, mandantId, isProductiveSystem){

      var params    = $H(FOA.Session).merge({pk: key});

      var paramStr  = params.toQueryString();

      progress  = new ProgressClass();
      self.currentPageIndex = 0;
	    self.modPage=1;

      self.checkGotoInput = new Form.Element.Observer(
        $('gotoPage'),
        1.5,  // jede 1.5. Sekunde
        function(el, value){
          self.gotoPageNumber();
        }
      );

      project   = new ProjectClass(key, self.updateAll, $(FOA.WBbootstrap));
      project.init(
        '/interfaces/projectGetProps.php?'  + paramStr,
        '/interfaces/projectSetProps.php?'  + paramStr
      );

      uploader  = new SuberUploaderClass();
      uploader.init(
        '/interfaces/projectUploadProgress.php',
        $H({t0: FOA.Upload['t0']}),
        {
          onProgress:   function(currentBytes, ratio, remainingTime){
            progress.update(ratio, (new Date(Math.round(remainingTime) * 1000)).format());
          },
          onSuccess:    function(warning){
            // console.log('success');
            if(isProductiveSystem){
                pageTracker._trackEvent('Uploadversuch', 'erfolgreich');
            }
            progress.stop();
            project.update();
           if(warning) {
	     self.translate(warning,progress.displayWarning);
           }
            // self.currentPageIndex = 0;
          },
          onError:      function(errorText){
            // console.log('error: '+errorText);
            self.translate(errorText,progress.displayError);
            if(isProductiveSystem){
                pageTracker._setCustomVar(1, "Uploadfehler", errorText, 3);
                pageTracker._trackEvent('Uploadfehler', 'Fehlermeldung', errorText);
            }
          },
          onStandby:    function() {
            progress.displayStandby();
          }
        },
        FOA.Upload.user,
        FOA.Upload.password
      );

      currentAuthor = $F('book_author');
      currentTitle = $F('book_title');
      self.initCovertext();

      // wurde während des Pageloads schon ein Upload angeworfen?
      if (self.uploadRequested) {
        self.upload(self.uploadRequested);
        self.uploadRequested = false;
      }
    },

    initCovertext : function() {
      $('book_title').focus();
      if ($F('book_title') == 'Mein Buch') { $('book_title').select(); }

      Event.observe($('book_title'),  'keyup', self.voteCover );
      Event.observe($('book_author'), 'keyup', self.voteCover );

      Event.observe($('book_title'), 'change', function() {
        self.tryUpdateCover()
        $('book_author').focus();
        if ($F('book_author') == 'Mein Name') { $('book_author').select() };
      });

      Event.observe($('book_author'), 'change', self.tryUpdateCover);
    },

    displayMessages: function() {
      // console.log(infoMessage);
    },

    voteCover : function(){
      var test = function (){
        clearTimeout(self.voteCover.timer);
        var now = (new Date()).getTime();
        if (self.voteCover.lastUpdate && (now - self.voteCover.lastUpdate > 1000)){
          self.tryUpdateCover();
        } else {
          self.voteCover.timer = setTimeout(test, 500);
        }
      }
      self.voteCover.lastUpdate = (new Date()).getTime();
      self.voteCover.timer = setTimeout(test, 400);
    },

    tryUpdateCover : function() {
      clearTimeout(self.voteCover.timer);
      if (
        ($F('book_author') == currentAuthor) &&
        ($F('book_title') == currentTitle)
      ) {
        return;
      }
      currentAuthor = $F('book_author');
      currentTitle  = $F('book_title');
      self.setProps();
      self.updateCover();
    },

    upload: function(target,callingWindow,uploadToken){
      if (!uploader) {
        // console.log('no uploader, delaying upload');
        self.uploadRequested = target;
        return;
      }
      uploader.startUpload(target,callingWindow,uploadToken);
      progress.hideError();
      progress.start();
    },

    setProps: function(caller){
      try {
        project.update(caller, Object.extend(
          $('options').serialize(true))
        );
      }
      catch(e) { console.log(e.message); }
    },

    pageLeft: function(){
      self.currentPageIndex = Math.max(self.currentPageIndex - 1, 0);
      self.updateContent(true);
    },
    pageRight: function(){
      self.currentPageIndex = Math.min(self.currentPageIndex + 1, project.maxPageIndex);
      self.updateContent(true);
    },

    pageLeftStart: function(){
      self.currentPageIndex =	0;
      self.updateContent(true);
    },
    pageRightEnd: function(){
      self.currentPageIndex = project.maxPageIndex;
      self.updateContent(true);
    },

    // springt in der WB-ansicht auf eine bestimmte Seite
    gotoPageNumber: function () {
      // lasse nur Zahlen zu
      var pageNumber =  $('gotoPage').value.replace(/[^0-9]/,'');

      if (pageNumber!='') {
	self.updatePager(parseInt(pageNumber));
      }
    },

    updatePager: function(no) {
        $('gotoPage').value=no;

        if ( project.params.contentDuplex ) {
          no=Math.floor( no / 2 );
        } else {
          no--;
        }
        no = Math.min(Math.max(no,0), project.maxPageIndex);
        self.currentPageIndex = no;
        self.updateContent(true);
        self.modPage=1;
    },

    updateContent: function(lazy){
      var pageNums = project.contentPagenums(self.currentPageIndex);

      var params = $H ( { pk: project.key, ck: project.params.cachekeys.content } );
      var prefix = '/interfaces/img_content.php?';

	    var left  = $('content_img_left');
      var right = $('content_img_right');
      var p = params;
      if ((!lazy) || project.params.contentDuplex) {
        p.set('p', pageNums[0]);
        p.set('s', 'l');
        p.set('sb', '1');

        self.setImgWithSize( left, prefix + p.toQueryString());
      }
      // show empty page
      if (!project.params.contentDuplex && self.currentPageIndex!=0 ) {
        p.set('p',100000000);
      	self.setImgWithSize( left, prefix + p.toQueryString());
      }
      // show umschlagsseite
      if (!project.params.contentDuplex && self.currentPageIndex==0 ) {
        p.set('p',0);
        p.set('s','l');
        p.set('sb', '1');
      	self.setImgWithSize( left, prefix + p.toQueryString() );
      }

      p.set('p', pageNums[1]);
      p.set('s', 'r');

      self.setImgWithSize( right, prefix + p.toQueryString());
      // console.log(prefix + p.toQueryString());

      // decide the format of the workbench
      // decide just on the number and the first decimal place
      aspect = Math.floor(project.params.aspect*10)/10;
      if (aspect < 1) {
        $('workbench').className = 'portrait';
      } else {
        if (aspect > 1) {
          $('workbench').className = 'landscape';
        } else {
          $('workbench').className = 'square';
        }
      }

      if (project.params.logicalPageCount > 0) {
        left.title = (pageNums[0]) ? site + pageNums[0] + ' ' + of + ' ' + project.params.logicalPageCount : + emptypage;
        // wenn erste Umschlagseite
        if (pageNums[1]<=1 ) {
          left.title = 'coversite';
        }
      } else {
        left.title = 'uploadcontentalternative';
        $('button_pageleft').hide();
      }

      if ( project.params.logicalPageCount > 0 && ( pageNums[1] <= project.params.logicalPageCount ) ) {
        right.title = site + ' ' + pageNums[1] + ' ' + of + ' ' + project.params.logicalPageCount;
      }


      if ( project.params.logicalPageCount < 0) {
        right.title = 'uploadcontentalternative';
        $('button_pageright').hide();
      }

      // Wenn angezeigte Seitenzahl grösser als Gesamtzahl => kein title anzeigen
      if ( pageNums[1] > project.params.logicalPageCount ) {
        right.title = '';
      }
      // letzte umschlagseite bei duplex
      if ( project.params.logicalPageCount > 0 && ( pageNums[0] == project.params.logicalPageCount && project.params.contentDuplex ) ) {
        right.title = 'coversite';
      }

      if (self.currentPageIndex <= 0) {
        self.currentPageIndex = 0;
        $('button_pageleft').hide();
		    $('button_pageleft_start').hide();
      } else {
        $('button_pageleft').show();
		    $('button_pageleft_start').show();
      }
      if ( self.currentPageIndex >= project.maxPageIndex ) {
        self.currentPageIndex = project.maxPageIndex;
        $('button_pageright').hide();
		    $('button_pageright_end').hide();
      } else {
        // console.log('Showing (currentPageIndex: %d of %d)',self.currentPageIndex,project.maxPageIndex);
        $('button_pageright').show();
		    $('button_pageright_end').show();
      }

      $('book_title').value   = project.params.title;
      $('book_author').value  = project.params.author;
    },

    updateInfo: function() {
      $('bookPrice').innerHTML   = project.params.price;
    },

    updateCover: function() {
      self.setImgWithSize($('img_cover_cover'), project.getImgUrl('cover'));
    },

    setOptionlist: function(target,values,currval) {
      target.length = 0;
      values.keys().each(function(k){
        target.options[target.length] = new Option( values.get(k),k,false,(k==currval));
      });
      if (typeof(Selects) != 'undefined') {
        Selects.update(target.id);
      }
    },

    updateVariations: function() {

      /*
      self.setOptionlist(
        $('productbinding'),
        $H(project.params.bindingVariations),
        project.params.currentBinding
      );

      self.setOptionlist(
        $('productsize'),
        $H(project.params.sizeVariations),
        project.params.currentSize
      );
      */

      if(project.params.infoText != null) {
          alert(project.params.infoText);
      }

      $('productbinding').value = project.params.currentBinding;
      $('productsize').value = project.params.currentSize;
      $('contentpaper').value = project.params.currentPaper;

      if ( project.params.duplexVariation === null ) {
        $('duplexchoice').hide();
        if ( project.params.contentDuplex ) {
          $('duplexwarning_onlyduplex').show();
        }
        else {
          $('duplexwarning_noduplex').show();
        }
      }
      else {
        $('duplexwarning_noduplex').hide();
        $('duplexwarning_onlyduplex').hide();
        $('duplexchoice').show();
      }

      if (project.params.contentDuplex) {
        $('book_duplex_yes').checked = true;
      }
      else {
        $('book_duplex_no').checked = true;
      }

      if ($('coloroptions')) {
        $('coloroptions').value = project.params.contentBW;
      }
      
      if($('firstpage_cover')) {
	$('firstpage_cover').checked  = (project.params.firstPageCover == 1);
      }
      
      if($('lastpage_cover')) {
	$('lastpage_cover').checked   = (project.params.lastPageCover == 1);
      }
    },

    updatePagenum: function() {
      self.currentPageIndex = Math.min(self.currentPageIndex,Math.max(project.maxPageIndex,0));
      if (project.params.uploads['content']) {
	console.log('reset pager')
      }
    },

    updateCaptions: function() {
      $A(['front', 'back', 'cover']).each(function(which){
        if (project.params.uploads[which]) {
	  if( $('caption_'+which+'_upload')) {
	    $('caption_'+which+'_upload').hide();
	    $('caption_'+which+'_delete').show();
	  }
        }
        else {
	  if($('caption_'+which+'_upload')) {
	    $('caption_'+which+'_upload').show();
	    $('caption_'+which+'_delete').hide();
	  }
        }
      });
    },

    updateZoom: function() {
      if (project.params.uploads['content']) {
        $('content_img_left').onclick = function() { WB.Zoom('content_img_left') };
        // $('content_img_left').removeClassName('clickable');
        $('content_img_left').addClassName('zoomable');
        $('content_img_right').onclick = function() { WB.Zoom('content_img_right') };
        // $('content_img_right').removeClassName('clickable');
        $('content_img_right').addClassName('zoomable');
      }
    },

    updateDisplay:  function(what){
      $A(what).each(function(updateFunc){ updateFunc(); });
    },

    updateAll: function(){
      var updates = [
          self.updatePagenum,
          self.updateInfo,
          self.updateVariations,
          self.updateContent,
          self.updateCover,
          self.updateZoom
      ]
      if(!project.params.restrictions['content_fixed'] || !project.params.restrictions['covers_fixed'] ) {
        updates.push(self.updateCaptions);
      }
      if (project.params.uploads['content']) {
	updates.unshift(self.pageLeftStart)
      }
      self.updateDisplay( updates );
    },

    setImgWithSize: function(img, src){
      self.throbberStart();
      var i = new Image();
      Event.observe(i, 'load', function(){
        img.src = i.src;
        img.setStyle({ height: i.height+'px', width: i.width+'px' });
        img.show();
        self.throbberDone();
      });
      Event.observe(i, 'error', self.throbberDone);
      Event.observe(i, 'abort', self.throbberDone);
      i.src = src;
    },


    Zoom:  function(source) {
      //wenn front- oder back-cover -> keine Blätterbuttons anzeigen
      if ( $(source).id.match(/^img_cover_/) ) {
        $('zoomTurnPageTop').hide();
        $('zoomTurnPageBottom').hide();
      } else {
        $('zoomTurnPageTop').show();
        $('zoomTurnPageBottom').show();
      }


      if ( match = $(source).src.match(/^(.*?)([?]|$)/) ) {
        self.Zoom.params = $H($(source).src.toQueryParams());
        self.Zoom.params.set('p', parseInt(self.Zoom.params.get('p')));
        self.ZoomShowPage();

        $('zoomCanvas').show();
        $('zoomPreview').show();

        try {
          $('zoomPreview').setStyle({ height: LB.getWindowSize()[1] * 0.8 +'px'});
          LB.centerItem($('zoomCanvas'));

		  // verstecke select-felder (wegen ie)
		  if (typeof(Selects) == 'undefined') {
            $('aoptions').hide();
            $('noptions').hide();
          }
        }
        catch(e) { console.log(e.message); }
      }
    },


    UnZoom: function() {
      if ( typeof(Selects) == 'undefined' ) {
        $('aoptions').show();
        $('noptions').show();
      }
      $('zoomPreview').hide();
      $('previewImage').hide();
      $('zoomCanvas').hide();
      return false;
    },


    ZoomShowPage: function(){
      // behandlung des zeigens der Navielemente
      // erst alle zeigen
      try {
        $('ZoomStartTop').show();
        $('ZoomLeftTop').show();
        $('ZoomEndTop').show();
        $('ZoomRightTop').show();
        $('ZoomStartBottom').show();
        $('ZoomLeftBottom').show();
        $('ZoomEndBottom').show();
        $('ZoomRightBottom').show();

        // ganz links -> linke ausblenden
        if (self.Zoom.params.get('p') <= 0) {
          $('ZoomStartTop').hide();
          $('ZoomLeftTop').hide();
          $('ZoomStartBottom').hide();
          $('ZoomLeftBottom').hide();
        }
        // ganz rechts -> rechte ausbelnden
        if(self.Zoom.params.get('p') >= project.params.logicalPageCount) {
          $('ZoomEndTop').hide();
          $('ZoomRightTop').hide();
          $('ZoomEndBottom').hide();
          $('ZoomRightBottom').hide();
        }

        self.setImgWithSize(
          $('previewImage'),
          match[1]+'?'+self.Zoom.params.merge({w:600, st:1, sb:1}).toQueryString()
        );
      }
      catch (e) {};
    },

    ZoomToStart: function() {
      self.Zoom.params.set('p',  1);
      self.ZoomShowPage();
      self.pageLeftStart();
      if (project.params.contentDuplex ) {
        // ist immer eine linke seite
        self.modPage=0;
      }
    },

    ZoomGotoPageNumber: function (pageNumber)
    {
      if (pageNumber < 0)
      {
        pageNumber=0;
      }
      if (pageNumber > project.params.logicalPageCount)
      {
        pageNumber=project.params.logicalPageCount;
      }

      self.Zoom.params.p = pageNumber;
      self.ZoomShowPage();
      self.gotoPageNumber();

        // ist immer eine rechte seite
      self.modPage=1;
    },

    ZoomToEnd: function() {
      self.Zoom.params.set('p', project.params.logicalPageCount);
      self.ZoomShowPage();
      self.pageRightEnd();
      if (project.params.contentDuplex ) {
        // ist immer eine rechte seite
        self.modPage=1;
      }
    },

    ZoomLeft: function() {
      self.Zoom.params.set('p', Math.max(self.Zoom.params.get('p') - 1, 0));
      self.ZoomShowPage();

      // bei DUPLEX nur jede zweite Seite im Hintergrund blättern
      self.modPage--;
      if (! project.params.contentDuplex || ( Math.abs( self.modPage ) % 2 ) ) {
        self.pageLeft();
      }
    },

    ZoomRight: function() {
      self.Zoom.params.set('p', Math.min(self.Zoom.params.get('p') + 1, project.params.logicalPageCount));
      self.ZoomShowPage();
      self.modPage++;

	    // bei DUPLEX nur jede zweite Seite im Hintergrund bl�ttern
      if (!project.params.contentDuplex || ( Math.abs( self.modPage ) % 2 ) ) {
        self.pageRight();
      }
    },

    AbortUpload: function() {
      uploader.cancelUpload(true);
      progress.stop();
      progress.hideError();
      progress.hideWarning();
      return false;
    },

    deleteUpload: function(caller,which) {
      if (confirm(deletequestion)) {
        project.update(
          caller, {
            delete_upload: project.params.uploads[which]
          }
        );
      }
    },

    throbberStart : function() {
      self.throbberUpdate(1);
    },

    throbberDone : function() {
      self.throbberUpdate(-1);
    },

    throbberUpdate : function(delta) {
      var oldCount  = throbberCount;
      throbberCount = Math.max(throbberCount + delta, 0);
      $('throbber').title = translate_update+' '+throbberCount+' '+element;

      if (oldCount == 0 && throbberCount > 0) {
        Effect.Appear('throbber',{ duration: 0.25 });
      } else if (oldCount > 0 && throbberCount == 0) {
        Effect.Fade('throbber', { duration: 0.3 });
      }
    },

    translate: function( langCode, callback ) {
      if ( ! langCode.startsWith('foa.') ) {
        callback(langCode);
        return;
      }
      new Ajax.Request( '/interfaces/translate.php/' + langCode, {
        method: 'get',
        requestHeaders: {Accept: 'text/html'},
        onSuccess: function(transport) { callback(transport.responseText) }
      });
    },

    uploadError: function (msg) {
      if(uploader) {
        uploader.finishUpload({status:4,msg:msg});
      }
    }

  });
}
var WB = new WorkbenchClass();


