
/** ===company switcher in menu bar
************************************************************
************************************************************/

var $companyList = $('#switcher > ul').css('zIndex',11),
  delayClose;

if ($companyList.find('li').length) {
  var $dropShadow = $([]);
  for (var x=0, y=20; x < 5; x++, y++) {
    $dropShadow = $dropShadow.add($('<div class="shadow"></div>')
      .css({
        opacity:.1, 
        top: 1+y, 
        left: 1+x
      })
    );
  }
  $dropShadow.css({
    position: 'absolute',
    zIndex: 10,
    backgroundColor: '#000',
    height: $companyList.outerHeight(),
    width: $companyList.outerWidth()
  })
  .hide()
  .appendTo('#switcher');

  $('#switcher').css('position', 'relative')
    .children('a').click(function() {
    $companyList.slideToggle(150);
    $dropShadow.slideToggle(150);
    return false;
  })
    .end()
  .hover(function() {
    window.clearTimeout(delayClose);
  }, function() {
    delayClose = window.setTimeout(function() {
      $companyList.slideUp(100);
      $dropShadow.slideUp(100);
    }, 400);
  });
}

/** ===validation for some forms (ugh)
************************************************************
************************************************************/

function validate(formId) {
  var $form = $(formId);
  var rules = {
    required: {
      ruleClass: 'required',
      rule: function(r) {
        return (/\S+/).test(r);
      },
      text: 'is empty',
      check: 'value'
    },
    emails: {
      ruleClass: 'emails',
      rule: function(r) {
        return (/^\S+[@]\w+(\.[a-zA-Z0-9]{2,4}){1,4}.*/).test(r);
      },
      text: 'has an incorrectly formatted address',
      check: 'value'
    }
  }, 
  opts = {
    submitDetails: true,
    wrapper: '<div></div>',
    noticeElement: 'span',
    noticeClass: '',
    preNotice: function(errors) {
      var prob = 'a problem';
      if (errors == 2) {
        prob = 'a couple problems';
      } else if (errors > 2) {
        prob = 'a few problems';
      }
      return '<div>Oops! Looks like we have ' + prob + '...</div>';
    },
    postNotice: '',
    errorClass: 'error'    
  };
  
  if (!$form.find('div.' + opts.errorClass).length) {
    $('<div class="' + opts.errorClass + '"></div>').hide().appendTo($form);
  }
  var $errorDiv = $form.find('div.' + opts.errorClass);
  var errCount = 0, 
    errMsg = '';
  
    $.each(rules, function(rulename, val) {
      $('.' + val.ruleClass, $form).each(function() {
        var $field = $(this);
        // if a field is both required and validated against another rule, 
        // ...don't process other rule if empty 
        if (rulename !== 'required' && $field.hasClass('required') && $field.val() == '') {
          return;
        }
       var $errElement = (/(radio|checkbox)/).test(rulename) ? $field : $field.parents('div:first');
       $errElement.removeClass(opts.errorClass).find(opts.noticeElement + '.' + opts.noticeClass).remove();

        var arg = val.check == 'element' ? $field : $field.val();
        if (!val.rule(arg) && !$field.is(':trulyHidden')) {
          errCount++;
          if (opts.submitDetails === true) {
            var detailText = $field.is('fieldset') ? $field.children(':first').text() : $field.prev().text().replace(/\*$/,'') || '';
            errMsg += '<' + opts.noticeElement + ' class="' + opts.noticeClass + '">' + detailText + ' ' + val.text + '</' + opts.noticeElement + '>';            
          }
        }       

      });
 
    });
    
    if (errCount) {
      $errorDiv.html(opts.preNotice(errCount) + errMsg).fadeIn('fast');
      return false;
    } else {
      $errorDiv.hide();
    }
}

/** ===CONFIRMATION MESSAGES
************************************************************
************************************************************/

$.confirmation = function(options) {
  var defaults = {
    message:  'Message received! We heard you, loud and clear.',
    delay: 3500,
    afterClose: null
  },
  opts = $.extend({},defaults, options),
  delayCloseConfirm,
  closeConfirm = function() {
    $('#confirm').fadeOut('fast', function() {
      $(this).remove();
      if (opts.afterClose) { 
        opts.afterClose();
      }
    });    
  };

  $('body').bind('click.closeit', function() {
    closeConfirm();
    clearTimeout(delayCloseConfirm);
    $(this).unbind('click.closeit');
  });
  $('#facebox').fadeOut('fast');
  $('<div id="confirm">' + opts.message + '</div>')
    .appendTo('body')
    .css({top: $(window).scrollTop() + 50})
    .fadeIn('fast', function() {
      delayCloseConfirm = window.setTimeout(closeConfirm, opts.delay);
    });
};


/** ===COMPANY PAGINATION (cycle)
************************************************************
************************************************************/


var $coLists = $('ul.your-companies');
if (typeof $.fn.cycle !== 'undefined' && $coLists.length > 1) {
  $('#your-companies').after('<a href="#" id="co-prev" class="replace">previous</a><a href="#" id="co-next" class="replace">next</a>');
  $coLists.parent().cycle({
    timeout: 0,
    fx: 'scrollHorz',
    easing: 'easeInBack',
    speed: 500,
    fit: true,
    next: '#co-next',
    prev: '#co-prev',
    prevNextClick: null  // callback fn for prev/next clicks:  function(isNext, zeroBasedSlideIndex, slideElement)
    
  });
}
$.extend(
  jQuery.expr[ ":" ], 
  { trulyHidden : "(jQuery(a).is(':hidden') || jQuery(a).parents(':hidden').length)" }
);