// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

document.observe("dom:loaded", function() {
  Application._init();
  Lightflow.init();
});

// TODO this is temporary - will be finished tomorrow.
var guitarInfoEfectsStatus = { };
var activeGuitarDD = null;
var overPhotos = false;

var Application = {
  _init: function(){
    Application.initOverlayedLabels();
    Application._initializeUI();
    Application._applyFixes();
    Application._openPrivateMsgModal();
    Application._initLogout();
    Application._initFBPermModal();
    Application.__initExistingUserFbMerge();
    Application._initSafariEnterLoginFix();
    Application._initFAQLink();
    Application._initPeekImageLink();

    if (Application.EditGuitars) { Application.EditGuitars._init(); }
    if (Application.FilterGuitars) { Application.FilterGuitars._init(); }
    if (Application.ViewGuitars) { Application.ViewGuitars._init(); }
    if (Application.SearchUsers) { Application.SearchUsers._init(); }
    if (Application.TransferGuitarModal) { Application.TransferGuitarModal._init(); }
    if (Application.Comments) { Application.Comments._init(); }
    if (Application.Messages) { Application.Messages._init(); }
    if (Application.FirstGuitar) { Application.FirstGuitar._init(); }
    if (Application.AddPhoto) { Application.AddPhoto._init(); }
    if (Application.Guardian) { Application.Guardian._init(); }
    if (Application.SoundCloud) { Application.SoundCloud._init(); }
    if (Application.Signup) { Application.Signup._init(); }
  },

  _initFAQLink: function(){
    var faq = $("faq-link");
    if( faq ){
      faq.observe('click', function(e){
        window.open("http://dbtwang.bearhugapp.com/answers");
      });
    }
  },
  
  _initPeekImageLink: function(){
    var peek_image_link = $("peek_image_link");
    if (peek_image_link){
      peek_image_link.observe('click', function(e){
        e.stop();
        window.open(peek_image_link.href,"Peek View","width=620, height=905");
      });
    }
  },

  _initSafariEnterLoginFix: function(){
    password_field = $("password");
    login_form     = $("login-box-form");
    if(password_field && login_form){
      password_field.observe("keydown",function(keyObject){
       if (keyObject.keyCode == 13 ){
         login_form.submit();
       }
      }); 
    }
  },

  _initLogout: function(){
  },

  __initExistingUserFbMerge: function(){
    document.observe("lightflow:updated", Application.__FbPermDialog );
    document.observe("lightflow:visible", Application.__FbPermDialog );
  },
  
  __FbPermDialog: function(){
    if ($("add_facebook_avatar")) {
      $("add_facebook_avatar").observe('click', function(e){
        FB.Connect.showPermissionDialog('email,publish_stream,offline_access', function(result) {
          if(result){
             $("add_facebook_avatar").checked = true ;
          }else{
             $("add_facebook_avatar").checked = false ;
          }
        } );
      } );
    }
    if($('fb-diagram-img') ){
      FB.Connect.showPermissionDialog('email,publish_stream,offline_access', function(result) {  } );
    }
  },

  _initFBPermModal: function(){
    $$(".facebook_perm_modal").each(function(ele){
      ele.observe("click", function(ev){
        
        if( ele.checked ){ 
        FB.Connect.showPermissionDialog('email,publish_stream,offline_access', function(result) {
          if (result) { 
          } }); 
        }
        
        new Ajax.Request('/my/account', {
          method: 'get',
          parameters: {fb_settings: ele.identify() , fb_value: ele.checked }
          });
        
        return false;
      });
    }
    );
  },

  _openPrivateMsgModal: function() {
    $$('.private-msg').each(function(msgelement){
      if (!msgelement) { return; }
      msgelement.observe("click", function(e) {
        e.stop();
        Lightflow.load(msgelement.href);
      });
    });
  },

  /**
   * Adds text placeholder behavior to input/label pairs, where label is positioned on top of the input.
   * Once the label/input gains focus, the label is hidden, once it lost focus, the label becomes visible again.
   *
   * In case of WebKit based browsers we can use the built-in, non-standard placeholder property (coming with HTML5) which does all the magic for us.
   */
  initOverlayedLabels: function(descendantsOf) {
    labels = descendantsOf ? descendantsOf.select("label.overlay") : $$("label.overlay");
    labels.each(function(label) {
      var input = $(label.readAttribute("for"));
      if (!input) { return; }

//      if (Prototype.Browser.WebKit && input.match("input")) {
//        input.writeAttribute("placeholder", label.innerText);
//        Element.remove(label);
//      } else {
        label.observe("click", function() {input.focus();});
        input.observe("focus", function() {label.hide();});
        input.observe("blur", function() {
          if (input.value.empty()) { label.show(); }
        });
        if (!input.value.empty()) { label.hide(); }

        if (input.match("textarea") && Prototype.Browser.IE) { input.observe("click", function() {label.hide();}); }
//      }
    });
  },
  _initializeSubmitButtons: function() {
    // all links/buttons with 'submit' class calls onsubmit on the form they exist in.
    var app = this;
    $$('form a.submit').each(function(i){
      i.observe('click', app._submitEventHandler);
    });
  },
  _submitEventHandler: function(event) {
    // console.debug(event);
    var element = event.element();
    if (element.tagName == 'SPAN') {
        element = element.up();
    }
    // console.debug(element.tagName);
    // console.debug(element);
    element.stopObserving('click', arguments.callee);
    event.stop();
    var form = element.up('form');
    form.onsubmit ? form.onsubmit() : form.submit();
    return false;
  },
  _initializeUI: function() {
    
    this._initializeSubmitButtons();
    // events for navigation dropdowns
    $$('#navigation > ul > li').each(function(topLevelMenuItem) {
      topLevelMenuItem
        .observe("mouseover", function() {topLevelMenuItem.addClassName("expanded");})
        .observe("mouseout", function() {topLevelMenuItem.removeClassName("expanded");});
    });

    // add ajaxified paging for user profile data
    if ($("recently")) {
      this._ajaxifyPagination($("recently"));
      this._ajaxifyPagination($("guitars"));
      this._ajaxifyPagination($("following"));
    }
    
    if ($("news")) {
      this._ajaxifyPagination($("recent_changes"));
      this._ajaxifyPagination($("news"));
      this._ajaxifyPagination($("guitars"));
    }

    this._initailizeGuitarGrid();
    $(document.body).observe("twang:pageChanged", this._initailizeGuitarGrid.bind(this));

    this.focusFirstElement();
    this._initializeFocusMovement();
    this.addCharacterLimits();
  },

  _ajaxifyPagination: function(targetNode) {
    var self = this;
    targetNode.select(".paging a").each(function(paginationLinkNode) {
      paginationLinkNode.observe("click", function(e) {
        e.stop();

        new Ajax.Updater(targetNode, paginationLinkNode.href, {
          method: "get",
          onComplete: function() {
            self._ajaxifyPagination(targetNode);
            if (targetNode.id == 'guitarsList'){
              document.location.href = "#guitarsList";
            }
            targetNode.fire("twang:pageChanged");
          }
        });
      });
    });
  },

  _applyFixes: function() {
    // Fix IE7 sign-up-field background scrolling issue.
    if (Prototype.Browser.IE) {
      $$("input.sign-up-field").each(function(signUpFieldNode) {
        signUpFieldNode.wrap(new Element('div', { "class": "sign-up-field-wrapper" }));
      });
    }
  },

  /* Elements marked with 'focus' class (or their input/textarea/select descendant) should gain focus automatically */
  focusFirstElement: function(inLightflow) {
    var focusNode = function(node) {
      if ((/input|textarea|select/).test(node.tagName.toLowerCase())) {
        try { node.focus(); } catch (e) {}
        return true;
      }
      return false;
    };

    var focusedElement = inLightflow ? $("lightflow").down(".focus") : $(document.body).down(".focus");
    if (focusedElement) {
      if (!focusNode(focusedElement)) {
        var descendants = focusedElement.descendants();
        for (var i = 0; i < descendants.length; i++) {
          if (focusNode(descendants[i])) { return; }
        }
      }
    }
  },

  /** Initializes focusing "table" cells while moving through a form (either via keyboard or mouse) */
  _initializeFocusMovement: function() {
    var updateFocus = function() {
      this.up("form").select("p.focus").each(function(focusedNode) {
        focusedNode.removeClassName("focus");
      });

      var focusingNode = this.match("div.column > p") ? this : this.up("p");
      focusingNode.addClassName("focus");
    };

    $$("div.focused > p > input", "div.focused > p > textarea", "div.focused > p > select").each(function(inputNode) {
      inputNode.observe(inputNode.match("select") ? "mousedown" : "focus", updateFocus.bind(inputNode));
    });
    
    $$("div.column > p > input", "div.column > p > textarea", "div.column > p > select").each(function(inputNode) {
      inputNode.observe(inputNode.match("select") ? "mousedown" : "focus", updateFocus.bind(inputNode));
    });
  },

  _initailizeGuitarGrid: function () {
//    $$('wrapper').observe("mouseover", function(event) { console.log('aaaa'); });

    $$('dd.info-guitar').each(function(guitarDD){
//      guitarDiv.up()
//        .observe("mouseover", function() { Application.showGuitarInfo(guitarDiv.id);} )
//        .observe("mouseout", function() { Application.hideGuitarInfoIfReady(guitarDiv.id);} );
      guitarDD.up()
        .observe("mouseover", function(event) {
//          console.log("in : " + event.findElement().tagName + " - " + this.tagName);
          Application.onGuitarPhotoMouseOver(this);
        }
        )
        .observe("mouseout", function(event) {
//          console.log("out : " + event.findElement().tagName + " - " + this.tagName );
          Application.onGuitarPhotoMouseOut(this);
        } );
    });

  },
  onGuitarPhotoMouseOver: function (tagElement) {
//    console.log('photo in ' + tagElement.id);
    Application.setActiveGuitar(tagElement);
  },
  onGuitarPhotoMouseOut: function (tagElement) {
//    console.log('photo out ' + tagElement.id);
    overPhotos = false;
    setTimeout("if (overPhotos == false) {Application.hideGuitarInfo( activeGuitarDD ); activeGuitarDD = null;}", 2000);
  },
  setActiveGuitar: function (guitarTagElement){
    overPhotos = true;
    if (!(activeGuitarDD) || (activeGuitarDD.id != guitarTagElement.id)){
      if (activeGuitarDD){
        Application.hideGuitarInfo( activeGuitarDD );
      }
//      console.log("changed active guitar to :" + guitarTagElement.id);
      activeGuitarDD = guitarTagElement;
      Application.showGuitarInfo(guitarTagElement);
    }

  },
  showGuitarInfo: function (guitarTagElement) {
    var infoTag = guitarTagElement.down("dd.info");
    new Effect.Move(infoTag ,{ x: 0, y: 160 , mode: 'absolute', duration: 0.2, queue: { position: 'end', scope: 'que' + guitarTagElement.id, limit: 2 }  });
  },
  hideGuitarInfo: function (guitarTagElement) {
    if (guitarTagElement){
      infoTag = guitarTagElement.down("dd.info");
      new Effect.Move(infoTag ,{ x: 0, y: 380 , mode: 'absolute', duration: 0.2,  delay: 0.1, queue: { position: 'end', scope: 'que' + guitarTagElement.id, limit: 2 }  });
    }
  },
  addCharacterLimits: function () {
    if(typeof makeItCount == 'function') {
      makeItCount('comment_content',2000);
      makeItCount('guitar_user_note',100);
    }
  }
};