/************************************
 * General Site Functions - trivial change
 ***********************************/
 
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

Element.addMethods({ visibleIff: function(element, condition) { $(element).style.display = condition ? '' : 'none'; } });

var pageLoaded = false;
Event.observe(window, 'load', function() {
  if ($('pagination') && location.hash.include('page=')) {
    var params = location.search ? location.search + '&' : '?';
    site.show_page(params + location.hash.substr(1));
  }
	site.loadIframes();
	site.handleExternalLinks();
  pageLoaded = true;
})

var site = {
  
  wait: function() { document.body.style.cursor = 'wait'; return true },
  unwait: function() { document.body.style.cursor = ''; return true },
  ajax_error: function() { site.unwait(); alert('Processing error'); },

  show_page: function(page) {
    new Ajax.Request(location.pathname + page, {method: 'get'});
  },

  observe_pager: function() {
    var pager = $('pagination');
    if (pager) {
      pager.observe('click', function(e) {
        var element = e.element();
        if (element.tagName != 'A') element = element.up('a');
        e.stop();
        var page = element.search || '?page=1';
        site.show_page(page);
        location.hash = page.substr(1);
      });
    }
  },

  observe_links: function() {
    $$('a.blank').invoke('stopObserving', 'click');
    $$('a.blank').invoke('observe', 'click', function(e) {
      e.stop();
      site.new_window(e.element().readAttribute('href'));
    });

    $$('#sidebar .flipout-ctrl a').invoke('observe', 'click', function(e) {
      e.stop();
      site.toggle_element   (e.findElement('a').up('div', 1));
    });

    site.observe_pager();
  },

  new_window: function(href) {
    var w = window.open(href, '_blank');
    w.focus();
  },

  toggle_element: function(e) {
    if(e.hasClassName('closed')) {
      e.removeClassName('closed');
    } else {
      e.addClassName('closed');
    }
  },

  lightview_video: function(anchor) {
    var caption = anchor.readAttribute('title');

    if (caption == null) {
      caption = anchor.innerHTML;
    }

    Lightview.show({
      href:    'http://www.youtube.com/v/' + anchor.readAttribute('href').split('=')[1] + '&fs=1&rel=0',
      caption: caption,
      rel:     'flash',
      options: {
        width: 640,
        height: 385,
        topclose: true,
        autosize: true
      }
    });
  },

  add_dividers: function() {
    var posts = $$('#content .entry');

    // dont add a divider to the last item
    posts.pop();

    if (posts.length > 0) {
      posts.invoke('addClassName', 'divider');
    }
  },
  
  // iframes delayed load
  
  loadIframes: function() {
  	$$('iframe.mussitate').each(function(ifr){
		ifr.src = ifr.getAttribute("name");
  	});
  },
  
  // opens external in a new window
  handleExternalLinks: function() {
    var hostName = window.location.hostname;
    var www = String(window.location);
  	var pos = www.indexOf(hostName);
    var links = $$("a");
    for(var i = 0; i < links.length; i++) {
      if(links[i].href.indexOf(hostName) == -1 || links[i].href.indexOf(hostName) > pos) {
        var curTitle = (links[i].getAttribute("title")) ? links[i].getAttribute("title") + " - ": "";
        links[i].setAttribute("target", "_blank");
      }
    }
  },
  
  toggleCheckbox: function(cbox_id, link_id) {
    var cbox = $(cbox_id);
    cbox.checked = !cbox.checked;
    $(link_id).toggleClassName('on');
    return false;
  },
  
  signUp: function() {
    if (!site.opted_out && !$('member_profile_attributes_opt_in').checked && $('opt-out-lightbox')) {
      Lightview.show({
        href: '#opt-out-lightbox',
        options: {
          autosize: true,
          closeButton: false
        }
      });
      return false;
    } else {
      return true;
    }
  },
  
  optOut: function() {
    site.opted_out = true;
    Lightview.hide();
    $('join-form').onsubmit();
    return false;
  },
  
  optIn: function() {
    $('big-opt-in').onclick();
    Lightview.hide();
    $('join-form').onsubmit();
    return false;
  }
  
}

/*************************
 * Member box
 *************************/
 
var MemberBox = {
  
  username : function() {
    return readCookie('username');
  },
  
  store_current_url : function() {
    if (window.location.pathname != "/members/login"){
      url = window.location.href;
      createCookie('current_url', url, 1);
    }
  },
  
  render : function() {
    if (this.username() != null) {
      this.render_logged_in_box();
    }
    else {
      this.render_logged_out_box();
    }
    $$('#subscriber-controls ul')[0].show();
    $$('#subscriber-controls p')[0].hide();
  },

  render_logged_in_box : function() {
    this.update_welcome_link();
    this.update_profile_link();  
    this.update_logout_link();  
  },

  render_logged_out_box : function() {
    this.update_sign_in_link();
    this.update_join_link();
  },

  update_welcome_link : function() {
    link = $$('#subscriber-controls ul li a')[0];
    link.setAttribute('href', '/'+this.username());
    link.update(this.username()); 
  },
  
  update_profile_link : function() {
    link = $$('#subscriber-controls ul li a')[1];
    link.setAttribute('href', '/members/'+this.username()+'/edit');
    link.update('Update Profile'); 
  },
  
  update_logout_link : function() {
    link = $$('#subscriber-controls ul li a')[2];
    link.setAttribute('href', '/members/logout');
    link.update('Logout');
  },
  
  update_sign_in_link : function() {
    link = $$('#subscriber-controls ul li a')[0];
    link.setAttribute('href', '/members/login');
    link.update('Login');
  },
  update_join_link : function() {
    link = $$('#subscriber-controls ul li a')[1];
    link.setAttribute('href', '/join');
    link.update('Join My Nikon Life');
  },
  
  offline: function(){
  	$$('#subscriber-controls ul')[0].hide();
	$$('#subscriber-controls p')[0].update('<em>Membership details temporarily unavailable.</em>');
	$$('#subscriber-controls p')[0].show();
  }

};

/**************************
 * Gallery functions
 **************************/
var gallery = {

  hidden_div_with_photo_links: function(photos) {

    var hidden_div = new Element("div", {"style": "display:none"});

    photos.each(function(photo) {
      title = photo.title + " :: " + photo.description + " :: topclose: true, autosize: true"
      link = new Element('a', {'class': 'lightview', 'rel': 'gallery[album]', 'href': photo.url, 'title': title}).update("link");
      hidden_div.insert({bottom: link})
    });

    return hidden_div;
  },

  insert_image_links: function(top_links, bottom_links) {

    var top_div    = this.hidden_div_with_photo_links(top_links);
    var bottom_div = this.hidden_div_with_photo_links(bottom_links);
    var photo_div  = $('photo');

    $(photo_div).insert({top: top_div});
    $(photo_div).insert({bottom: bottom_div});

  },

  toggle_info : function() {
    if ($('gallery').hasClassName('collapsed')) {
      //$('sidebar').hide();
      $('gallery').removeClassName('collapsed');
      $('gallery').addClassName('uncollapsed');
    } else {
      //$('sidebar').show();
      $('gallery').addClassName('collapsed');
      $('gallery').removeClassName('uncollapsed');
    }
  }

}


/************************************
 * Subscriber Functions : Needs to be moved to the extension
 ***********************************/
var subscriber = {
  lightview_form: function(e) {
    var href = '';

    if (typeof e == 'object') {
      e.stop();

      if (e.findElement('a')) {
        href = e.findElement('a').readAttribute('href');
      } else {
        href = e.element().readAttribute('href');
      }
    } else {
      href = e;
    }

    if (href != '') {
      Lightview.show({
        href: href,
        rel:  'ajax',
        options: {
          autosize: true,
          topclose: true,
          overflow: 'hidden',
          ajax: {
            method: 'get',
            onSuccess: function(transport) {
              // Modify the response text before LightView gets it
              transport.responseText = subscriber.fix_response_text(transport.responseText);
            },
            onComplete: function() {
              subscriber.lightview_observe();
              site.observe_links();
            }
          }
        }
      });

      document.observe("lightview:hidden", function() {
        subscriber.controls();
      });
    }
  },

  lightview_observe: function() {
    var form = $('lightview').select('form').first();

    // Observe the inputs
    subscriber.observe_form(form);

    // Hijack the submit
    form.observe('submit', function(e) {
      e.element().request({
        onSuccess: function(transport) {
          // Replace the content
          $$("#lightview .subscriber").first().replace(transport.responseText);
					
          // If its a failed form re-observe it
          // else add a close link
          if ($$("#lightview form").first()) {
            subscriber.lightview_observe();
          } else {
						
						// After member has joined, show the assignment enter button if necessary
		        if ($('enter-assignment-button')) new Ajax.Request(location.pathname.sub(/\/?$/, '/update_enter_button'));
						
						var close = new Element('a', {'href':'#'}).update('Close to return to the website').observe('click', function(e) {
              e.stop();
              Lightview.hide();
            });

            $$(".welcome ul").first().insert({after: new Element('p').update(close)});
          }

          // Force Lightview to resize
          Lightview._resize({height: $$("#lightview .subscriber").first().getHeight()});
        }
      });

      e.stop();
      e.element().disable();
    });
  },

  login_form: function(e) {
    // there's a display issue in ie6 so send it to a normal login page
    var arVersion = navigator.appVersion.split("MSIE");
    var version   = parseFloat(arVersion[1]);

    if (isNaN(version) || version > 6) {
      e.stop();

      var el = $$('.inline-login').first();

      if (el == undefined) {
        new Ajax.Request(e.element().readAttribute('href'), {
          method: 'post',
          onSuccess: function(transport) {
            var el = new Element('div', {'class' : 'inline-login'}).update(transport.responseText);
            $('slideshow').insert({top: el});
            subscriber.observe_login_form(el);
          },
          onFailure: function(transport) {
            $('subscriber-controls').update("<p>Login temporarily unavailable.</p>")
          }
        });
      } else {
        el.show();
      }
    }
  },

  observe_login_form: function(el) {
    // Insert the ajax close link
    el.select('.left').first().insert({
      after: new Element('a', {'class':'close bkg-image', 'href':'#'}).update('Close').observe('click', function(e) {
        e.stop();
        el.hide();
      })
    });

    // Observe the lost password and join links
    el.select('.subscriber-lightview').invoke('observe', 'click', function(e) {
      el.hide();
      subscriber.lightview_form(e);
    });


    var form = el.select('form').first();

    // Observe the focus / blurs
    subscriber.observe_form(form);

    // Observe the submit
    form.observe('submit', function(e) {
      e.stop();

      if ($F('member_session_username') && $F('member_session_password')) {
        e.element().request({
          onSuccess: function(transport) {
            var response = transport.responseText;

            if (response.match('error-with-field')) {
              el.select('.login').first().replace(response);
              subscriber.observe_login_form(el);
            } else {
              el.remove();
              subscriber.controls();
            }
          }
        });

        e.element().disable();
      }
    });
  },

  observe_form: function(form) {
    var fields = form.select('input[type="text"], input[type="password"]');

    fields.each( function(field) {
      var label = subscriber.label_for(field);

      if (label.hasClassName('no-js-label') == false) {
        // Hide the label if the field has a value
        if (field.value) {
          label.hide();
        }

        // Set the class so the label appear above the input
        if (label.hasClassName('js-label') == false) {
          label.addClassName('js-label');
        }

        // Fade the label on focus
        field.observe('focus', function() {
          label.addClassName('fade');
        });

        // Remove the label on a keydown
        field.observe('keydown', function() {
          label.hide();
        });

        // Clean up the form on blur
        field.observe('blur', function() {
          if (field.value == '') {
            label.removeClassName('fade');
            label.show();
          }

          // Hide labels that recieved and autofill value
          fields.each(function(field) {
            if (field.value) {
              subscriber.label_for(field).hide();
            }
          });
        });
      }
    });

    // Fix the validates_acceptance_of errors
    var errors = $$('.accept-terms .error-with-field');

    if (errors.length > 0) {
      // Hide the hidden input error
      $$('.accept-terms input[value="0"]').first().up('.error-with-field').hide();

      // Fix the position of the displayed error
      $$('.accept-terms input[value="1"]').first().insert({before: $$('label[for="member_accept_terms"]').first()});
    }
  },

  controls: function() {
    new Ajax.Request('/members/controls', {
      method: 'get',
      onSuccess: function(transport) {
        $('subscriber-controls').update(transport.responseText).fire("subscriber:loaded")
        $$('.subscriber-lightview').invoke('observe', 'click', subscriber.lightview_form);
        //$$('.subscriber-login').invoke('observe', 'click', subscriber.login_form);
      },
      onFailure: function(transport) {
        $('subscriber-controls').update("<p>Member controls temporarily unavailable.</p>")
      }
    });
  },

  label_for: function(field) {
    return field.up('.field').select('label').first();
  },

  fix_response_text: function(text) {
    // Lightview gets the height wrong due to the observe_form label behaviour
    // Apply the style now so that height gets set correctly
    var div = new Element('div').update(text);
    var ctn = div.select('.subscriber').first();

    // Set the correct styles so height gets calculated correctly
    if (text.match('label')) {
      div.select('input[type="text"], input[type="password"]').each( function(field) {
        field.up().select('label').first().addClassName('js-label');
      });
    }

    return div.innerHTML;
  }
}


/************************************
 * Clickables (big block targets)
 ***********************************/
var Clickables = Class.create({
  initialize: function(options) {
    selector = $$(options.selector) || $$(".clickables");

    this.clickable = options.clickable || "li";
    this.hoverclass = options.hoverclass || "over";

    selector.each(function(e) {$(e).setStyle({cursor: 'pointer'})});

    selector.invoke('observe', 'click', this.clicked.bind(this));
    selector.invoke('observe', 'mouseover', this.activate.bind(this));
    selector.invoke('observe', 'mouseout', this.deactivate.bind(this));
  },

  activate: function(event) {
    event.stop();
    element = Event.findElement(event, this.clickable);
    element.addClassName(this.hoverclass);
  },

  deactivate: function(event) {
    event.stop();
    element = Event.findElement(event, this.clickable);
    element.removeClassName(this.hoverclass);
  },

  clicked: function(event) {
    event.stop();

    element = Event.findElement(event, this.clickable).select("a").first();
    href = element.readAttribute('href');

    // Make it work with the site.new_window
    if (element.hasClassName('blank')) {
      site.new_window(href);
    }

    else if (element.hasClassName('lightview-video')) {
      site.lightview_video(element);
    }

    else {
      window.location = href;
    }
  }
});

// Open any link classed as blank in a new window
document.observe("dom:loaded", function() {
if (window.XMLHttpRequest) { var menu = new Dropdown("navigation", { menu_selector: 'ul.dropdown', fade_duration:0.3,  timeout: 600 }); }
  site.observe_links();
  site.add_dividers();
});

Ajax.Responders.register({onCreate: site.wait, onFailure: site.ajax_error, onComplete: site.unwait});


/**
 * Event.simulate(@element, eventName[, options]) -> Element
 * 
 * - @element: element to fire event on
 * - eventName: name of event to fire (only MouseEvents and HTMLEvents interfaces are supported)
 * - options: optional object to fine-tune event properties - pointerX, pointerY, ctrlKey, etc.
 *
 *    $('foo').simulate('click'); // => fires "click" event on an element with id=foo
 *
 **/
(function(){
  
  var eventMatchers = {
    'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
    'MouseEvents': /^(?:click|mouse(?:down|up|over|move|out))$/
  }
  var defaultOptions = {
    pointerX: 0,
    pointerY: 0,
    button: 0,
    ctrlKey: false,
    altKey: false,
    shiftKey: false,
    metaKey: false,
    bubbles: true,
    cancelable: true
  }
  
  Event.simulate = function(element, eventName) {
    var options = Object.extend(Object.clone(defaultOptions), arguments[2] || { });
    var oEvent, eventType = null;
    
    element = $(element);
    
    for (var name in eventMatchers) {
      if (eventMatchers[name].test(eventName)) { eventType = name; break; }
    }

    if (!eventType)
      throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported');

    if (document.createEvent) {
      oEvent = document.createEvent(eventType);
      if (eventType == 'HTMLEvents') {
        oEvent.initEvent(eventName, options.bubbles, options.cancelable);
      }
      else {
        oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, 
          options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
          options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element);
      }
      element.dispatchEvent(oEvent);
    }
    else {
      options.clientX = options.pointerX;
      options.clientY = options.pointerY;
      oEvent = Object.extend(document.createEventObject(), options);
      element.fireEvent('on' + eventName, oEvent);
    }
    return element;
  }
  
  Element.addMethods({ simulate: Event.simulate });
})()
