// This file is automatically included by javascript_include_tag :defaults

function openPreview(content) {
  var win = window.open("", "preview", "width=700,height=500");
  win.document.write(content); 
}

function showQuestion(element) {
  element = $(element);
  var effects = $$(".link_item").map(function(elt) { return new Effect.Fade(elt); });
  //effects.push(new Effect.Fade('seeAll'));
  new Effect.Parallel(effects, { duration: 0.5, afterFinish: function() {
    //new Effect.Parallel([new Effect.Appear(element), new Effect.Appear('seeAll')], { duration: 0.5 });
    new Effect.Parallel([new Effect.Appear(element)], { duration: 0.5 });
  }});
}

function showAllQuestions() {
  //Element.hide('seeAll');
  var effects = $$(".link_item").map(function(elt) { return new Effect.Appear(elt); });
  new Effect.Parallel(effects, { duration: 0.5 });
}

function showInterstitial(element, distance) {
  element = $(element);
  var height = element.getHeight();
  var content = element.down('.interstitial_content');
  distance = (distance || 0) + height;

  setTimeout(function() { new Effect.Move(content, { y: distance,
    beforeSetup: function(effect) {
      content.style.marginTop = -height + 'px';
      element.style.overflow = 'hidden';
      element.style.height = distance + 'px';
      element.show();
    },
    afterFinish: function(effect) {
      element.style.overflow = '';
      element.style.height = height + 'px';
      new Effect.Pulsate(content);
    }}); }, 5000);

  setTimeout(function() { new Effect.Move(content, { y: -distance,
    beforeSetup: function(effect) {
      element.style.height = distance + 'px';
      element.style.overflow = 'hidden';
    },
    afterFinish: function(effect){
      element.hide();
      element.style.overflow = '';
      element.style.height = height + 'px';
    }}); }, 30000);
}

function showLinkLetters() {
  Effect.PopUp.safe('linkletter_popup', {loadClass:'popup_loading'}); return false;
}

function shareJob(code, title, description, user_id) {
  var url = encodeURIComponent('http://laterallink.com/jobs/info/' + code + '?referral=' + user_id + '&promotion=')
  var linkedin_action = $('linkedin_link').getAttribute('onclick');
  linkedin_action = linkedin_action.sub(/url=[^&]*/, 'url=' + url + 'linkedin');
  linkedin_action = linkedin_action.sub(/title=[^&]*/, 'title=' + encodeURIComponent(title));
  linkedin_action = linkedin_action.sub(/summary=[^&]*/, 'summary=' + encodeURIComponent(description));

  $('facebook_link').writeAttribute('href', 'http://www.facebook.com/sharer.php?u=' + url + 'facebook&src=sp');
  $('linkedin_link').writeAttribute('onclick', linkedin_action);
  $('referral_requisition_id').value = code;
  $$('.refer_position_title').each(function(elt) { elt.innerHTML = title; });
  $$('.refer_position').each(Element.show);
}

function openFacebook(url) {
  window.open('http://www.facebook.com/sharer.php?u='+encodeURIComponent(url),' sharer', 'toolbar=0, status=0, width=626, height=436');
}

function openLinkedIn(url) {
  window.open(url,' sharer_li', 'toolbar=0, status=0, width=626, height=436');
}

function stripMS(str) {
  str = str.replace(/<o:p>\s*<\/o:p>/g, "") ;
  str = str.replace(/<o:p>.*?<\/o:p>/g, "&nbsp;") ;
  str = str.replace( /\s*mso-[^:]+:[^;"]+;?/gi, "" ) ;
  str = str.replace( /\s*MARGIN: 0cm 0cm 0pt\s*;/gi, "" ) ;
  str = str.replace( /\s*MARGIN: 0cm 0cm 0pt\s*"/gi, "\"" ) ;
  str = str.replace( /\s*TEXT-INDENT: 0cm\s*;/gi, "" ) ;
  str = str.replace( /\s*TEXT-INDENT: 0cm\s*"/gi, "\"" ) ;
  str = str.replace( /\s*TEXT-ALIGN: [^\s;]+;?"/gi, "\"" ) ;
  str = str.replace( /\s*PAGE-BREAK-BEFORE: [^\s;]+;?"/gi, "\"" ) ;
  str = str.replace( /\s*FONT-VARIANT: [^\s;]+;?"/gi, "\"" ) ;
  str = str.replace( /\s*tab-stops:[^;"]*;?/gi, "" ) ;
  str = str.replace( /\s*tab-stops:[^"]*/gi, "" ) ;
  str = str.replace( /\s*face="[^"]*"/gi, "" ) ;
  str = str.replace( /\s*face=[^ >]*/gi, "" ) ;
  str = str.replace( /\s*FONT-FAMILY:[^;"]*;?/gi, "" ) ;
  str = str.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
  str = str.replace( /<(\w[^>]*) style="([^\"]*)"([^>]*)/gi, "<$1$3" ) ;
  str = str.replace( /\s*style="\s*"/gi, '' ) ;
  str = str.replace( /<SPAN\s*[^>]*>\s*&nbsp;\s*<\/SPAN>/gi, '&nbsp;' ) ;
  str = str.replace( /<SPAN\s*[^>]*><\/SPAN>/gi, '' ) ;
  str = str.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
  str = str.replace( /<SPAN\s*>(.*?)<\/SPAN>/gi, '$1' ) ;
  str = str.replace( /<FONT\s*>(.*?)<\/FONT>/gi, '$1' ) ;
  str = str.replace(/<\\?\?xml[^>]*>/gi, "") ;
  str = str.replace(/<\/?\w+:[^>]*>/gi, "") ;
  str = str.replace( /<H\d>\s*<\/H\d>/gi, '' ) ;
  str = str.replace( /<H1([^>]*)>/gi, '' ) ;
  str = str.replace( /<H2([^>]*)>/gi, '' ) ;
  str = str.replace( /<H3([^>]*)>/gi, '' ) ;
  str = str.replace( /<H4([^>]*)>/gi, '' ) ;
  str = str.replace( /<H5([^>]*)>/gi, '' ) ;
  str = str.replace( /<H6([^>]*)>/gi, '' ) ;
  str = str.replace( /<\/H\d>/gi, '<br>' ) ; //remove this to take out breaks where Heading tags were
  str = str.replace( /<(U|I|STRIKE)>&nbsp;<\/\1>/g, '&nbsp;' ) ;
  str = str.replace( /<(B|b)>&nbsp;<\/\b|B>/g, '' ) ;
  str = str.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' ) ;
  str = str.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' ) ;
  str = str.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' ) ;
  //some RegEx code for the picky browsers
  var re = new RegExp("(<P)([^>]*>.*?)(<\/P>)","gi") ;
  str = str.replace( re, "<div$2</div>" ) ;
  var re2 = new RegExp("(<font|<FONT)([^*>]*>.*?)(<\/FONT>|<\/font>)","gi") ;
  str = str.replace( re2, "<div$2</div>") ;
  str = str.replace( /size|SIZE = ([\d]{1})/g, '' ) ;
  
  return str;
}

/****************************************************************************
 * Event extensions
 */
Object.extend(Event, {
  relativePointer: function(event, container) {
    var container = container ? $(container) : Event.element(event).parentNode;
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    var pos = Position.cumulativeOffset(container);
    return [0,1].map( function(i) { return (pointer[i] - pos[i]) });
  }
});

/****************************************************************************
 * Element extensions
 */
Object.extend(Element.Methods, {
  focusFormChild: function(element) {
    element = $(element);
    var form = element.down('form');
    if (form) {
      Form.focusFirstElement(form);
    } else {
      var link = element.down('a');
      if (link) link.focus();
    }
  },

  saveStyles: function(element) {
    element = $(element);
    if (!element._style) element._style = Object.extend({}, element.style);
  },

  restoreStyles: function(element) {
    element = $(element);
    if (element._style) {
      for (var attribute in element.style) {
        element.style[attribute] = element._style[attribute];
      }
      for (var attribute in element._style) {
        element.style[attribute] = element._style[attribute];
      }
      element._style = undefined;
    }
  },

  setHeight: function(element, pixels) {
    element = $(element);
    element.style.height = pixels + 'px';
  },

  setWidth: function(element, pixels) {
    element = $(element);
    element.style.width = pixels + 'px';
  },
  
  showChildren: function(element, expression) {
    element = $(element);
    var children = expression ? element.select(expression) : element.childElements();
    children.each(function(child) {
      if (child.style) child.style.visibility = "visible";
    });
  },

  hideChildren: function(element, expression) {
    element = $(element);
    var children = expression ? element.select(expression) : element.childElements();
    children.each(function(child) {
      if (child.style) child.style.visibility = "hidden";
    });
  },
  
  parentByTagName: function(element, tagName) {
    element = $(element);
    while (element = element.parentNode)
      if (element.tagName == tagName) return element;
    return null;
  },

  parentForm: function(element) {
    element = $(element);
    return element.parentByTagName("FORM");
  },

  replaceClassName: function(element, oldClassName, newClassName) {
    element = $(element);
    Element.addClassName(element, newClassName);
    Element.removeClassName(element, oldClassName);
  },

  duplicate: function(element, options) {
    element = $(element);
    var lastCopy = element;
    while (lastCopy._nextCopy) lastCopy = lastCopy._nextCopy;
    var copy = element.parentNode.insertBefore(element.cloneNode(true), lastCopy.nextSibling);
    if (options.newline)
      element.parentNode.insertBefore(document.createElement('BR'), copy);
    if (element.id) copy.id = lastCopy.id + '_dup';
    if (options.focus && copy.focus) copy.focus();
    lastCopy._nextCopy = copy;
  },

  removeDuplicates: function(element) {
    element = $(element);
    var lastCopy = element;
    while (lastCopy._nextCopy) lastCopy = lastCopy._nextCopy;
    if (element != lastCopy) {
      while (element.nextSibling != lastCopy) {
        element.parentNode.removeChild(element.nextSibling);
      }
      element.parentNode.removeChild(lastCopy);
      element._nextCopy = null;
    }
  },

  onDelayedMouseOut: function(element) {
    element = $(element);
    var options = Object.extend({ delay: 2000, action: function(elt) { elt.hide() }}, arguments[1] || {})
    Event.observe(element, "mouseout", function(event) {
      if (element._mouseTimeout) cancelTimeout(element._mouseTimeout);
      element._mouseTimeout = setTimeout(function() {
        var elt = $(event.relatedTarget || event.toElement);
        if (!elt || (elt != element && !elt.childOf(element))) options.action(element);
      }, options.delay);
    });
    Event.observe(element, "mouseover", function(event) {
      if (element._mouseTimeout) {
        clearTimeout(element._mouseTimeout);
        element._mouseTimeout = null;
      }
    });
  },

  onDelayedBlur: function(element) {
    element = $(element);
    var options = Object.extend({ delay: 3000, action: function(elt) { elt.hide() }}, arguments[1] || {})
    Event.observe(element, "blur", function(event) {
      if (element._blurTimeout) cancelTimeout(element._blurTimeout);
      element._blurTimeout = setTimeout(function() {
        var elt = $(event.relatedTarget || event.toElement);
        if (!elt || (elt != element && !elt.childOf(element))) options.action(element);
      }, options.delay);
    });
    Event.observe(element, "focus", function(event) {
      if (element._blurTimeout) {
        clearTimeout(element._blurTimeout);
        element._blurTimeout = null;
      }
    });
  },

  outerContent: function(element) {
    element = $(element);
    var emptyElements = { HR: true, BR: true, IMG: true, INPUT: true };
    var specialElements = { TEXTAREA: true };
    if (element.outerHTML) {
      return element.outerHTML;
    } else {
      var html = '';
      switch (element.nodeType) {
        case Node.ELEMENT_NODE:
          html += '<';
          html += element.nodeName;
          if (!specialElements[element.nodeName]) {
            for (var a = 0; a < element.attributes.length; a++)
              html += ' ' + element.attributes[a].nodeName.toUpperCase() +
                      '="' + element.attributes[a].nodeValue + '"';
            html += '>'; 
            if (!emptyElements[element.nodeName]) {
              html += element.innerHTML;
              html += '<\/' + element.nodeName + '>';
            }
          }
          else switch (element.nodeName) {
            case 'TEXTAREA':
              for (var a = 0; a < element.attributes.length; a++)
                if (element.attributes[a].nodeName.toLowerCase() != 'value')
                  html += ' ' + element.attributes[a].nodeName.toUpperCase() +
                          '="' + element.attributes[a].nodeValue + '"';
                else 
                  var content = element.attributes[a].nodeValue;
              html += '>'; 
              html += content;
              html += '<\/' + element.nodeName + '>';
              break; 
          }
          break;
        case Node.TEXT_NODE:
          html += element.nodeValue;
          break;
        case Node.COMMENT_NODE:
          html += '<!' + '--' + element.nodeValue + '--' + '>';
          break;
      }
      return html;
    }
  }
});

Element.addMethods();

/****************************************************************************
 * Prototype Position class extensions
 */

Object.extend(Position, {
  scrollPosition: function() {
    this.prepare();
    return [this.deltaX, this.deltaY];
  },
  clientSize: function() {
    return [
      window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || document.body.offsetWidth,
      window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || document.body.offsetHeight
    ];
  }
});

/****************************************************************************
 * Effect.PopUp effect
 *
 * Displays a popup window
 */
Effect.PopUp = Class.create();

//Effect.PopUp.coverContainer = 'main_frame';

Effect.PopUp.safe = function(element, options) {
  if (Effect.PopUp.current)
    Effect.PopUp.close({ fadeBackground: false, afterFinish: function() { new Effect.PopUp(element, options); }});
  else
    new Effect.PopUp(element, options);
};

Effect.PopUp.close = function(options, delay) {
  if (delay)
    setTimeout(function() { Effect.PopUp.close(options); }, delay);
  else if (Effect.PopUp.current)
    new Effect.PopDown(Effect.PopUp.current, options)
};

Effect.PopUp.confirm = function(element, text, action) {
  element = $(element);
  element.innerHTML = "<div class='popup_content'>" + text + "<br/><a href='#' onclick='Effect.PopUp.close(); " + action + "; return false;'>Yes</a> | <a href='#' onclick='Effect.PopUp.close(); return false;'>No</a></div>"
  Effect.PopUp.safe(element, arguments[3]);
};

Object.extend(Object.extend(Effect.PopUp.prototype, Effect.Opacity.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
      duration: 0.5,
      modal: true,
      focus: true,
      restoreContent: true,
      restoreAfterFinish: true,
      fadeBackground: !Effect.PopUp.current,
      afterSetupInternal: this.afterSetup.bind(this),
      afterFinishInternal: this.afterFinish.bind(this)
    }, arguments[1]);

    // Create modal cover if it doesn't exist
    if (options.modal) {
      if (!Effect.PopUp.cover) {
        var height = document.body.parentNode.scrollHeight;
        Effect.PopUp.coverContainer = Effect.PopUp.coverContainer ? $(Effect.PopUp.coverContainer) : document.body;
        Effect.PopUp.cover = new Element('div', {
          style: "position: absolute; top: 0px; left: 0px; width: 100%; height: " + height + "px; background-color: #000;" });
      }
      if (options.fadeBackground)
        Effect.PopUp.cover.setStyle({ opacity: 0, zIndex: this.element.getStyle('z-index') - 1 });
    }
    
    // Save content (will be refreshed on popup close)
    if (options.restoreContent) this.element._popupContent = this.element.innerHTML;

    // Send ajax request
    if (options.url) {
      this.updateElement = $(options.update) || this.element.down('.popup_content') || this.element.down('.popup_content_scroll') || $(options.backup_update);
      if (this.updateElement) this.updateElement.update("");
      this.element._request = new Ajax.Request(options.url, Object.extend({ asynchronous: true, evalScripts: true,
        onFailure: this.ajaxFailure.bind(this), onSuccess: this.ajaxSuccess.bind(this) }, options));
    } else if (!options.top) {
      options.top = 50;
    }

    // Move element to top level
    if (this.element.parentNode != document.body) document.body.appendChild(this.element);

    // Prepare element
    this.element.setOpacity(0);
    this.element.show();

    // IE6 modes
    var iframe = this.element.down('.popup_ie6_iframe');
    if (iframe) {
      var content = this.element.down('.popup_content') || this.element.down('.popup_content_scroll');
      if (content.className == 'popup_content_scroll') {
        content.style.height = (document.documentElement.clientHeight * 0.8) + 'px';
      }
      iframe.style.height = content.offsetHeight + 'px';
    }

    // Position element
    var scrollPos = Position.scrollPosition();
    var clientSize = Position.clientSize();
    var left = options.left || (clientSize[0] - this.element.offsetWidth) / 2;
    var top = options.top || (clientSize[1] - this.element.offsetHeight) / 2;
    this.element.setStyle({ position: "absolute", overflow: "hidden",
      left: scrollPos[0] + left + "px", top: scrollPos[1] + top + "px" });
    
    // Start showing
    if (Effect.PopUp.current) {
      Effect.PopUp.close({ fadeBackground: false, afterFinish: function() { this.start(options); }.bind(this) });
    } else {
      this.start(options);
    }
  },
  
  afterSetup: function(effect) {
    // Cover other elements
    if (effect.options.modal) {
      Effect.PopUp.coverContainer.insertBefore(Effect.PopUp.cover, null);
    }
    // Set current popup
    Effect.PopUp.current = effect.element;
    if (this.updateElement && this.updateElement.className == 'popup_content_scroll')
      this.updateElement.style.height = (this.element.clientHeight - this.updateElement.offsetTop) + 'px'
  },

  afterFinish: function(effect) {
    if (effect.element.visible() && Effect.PopUp.current) {
      if (effect.options.content) {
        if (effect.element._originalClass) {
          effect.element.className = effect.element._originalClass;
          effect.element._originalClass = null;
        }
        effect.updateElement.update(effect.options.content);
      } else if (effect.options.loadClass && effect.options.url) { /* ajax load class */
        effect.element._originalClass = effect.element.className;
        effect.element.className = effect.options.loadClass;
      }
      if (effect.options.focus) effect.element.focusFormChild();
      if (effect.options.modal && effect.options.fadeBackground)
        new Effect.Opacity(Effect.PopUp.cover, { to: 0.5,  duration: 0.5 });
    }
  },
  
  ajaxSuccess: function(request) {
    this.element._request = null;
    this.options.content = request.getStatus() ? request.responseText : Ajax.connectionError(request.request);
    if (this.state == "finished") this.afterFinish(this);
  },

  ajaxFailure: function(request) {
    this.element._request = null;
    if (this.element._originalClass) {
      this.element.className = this.element._originalClass;
      this.element._originalClass = null;
    } else {
      this.options.loadClass = null; // Set load class to null in case effect hasn't finished
    }
    this.updateElement.update("<h2>Sorry, we experienced an unexpected error</h2>" +
      "<p>For assistance, please contact <a href='mailto:info@laterallink.com'>info@laterallink.com</a></p>");
//    debug(request.responseText);
  }
});

/****************************************************************************
 * Effect.PopDown effect
 *
 * Hides a popup window
 */
Effect.PopDown = Class.create();
Object.extend(Object.extend(Effect.PopDown.prototype, Effect.Opacity.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
      scaleFromCenter: true,
      modal: true,
      to: 0.0,
      from: 1.0,
      duration: 0.5,
      restoreAfterFinish: true,
      fadeBackground: true,
      afterFinishInternal: this.afterFinish
    }, arguments[1]);

    // Reset class name
    if (this.element._originalClass) {
      this.element.className = this.element._originalClass;
      this.element._originalClass = null;
    }

    // Start
    this.start(options);
  },
  
  afterFinish: function(effect) {
    effect.element.hide();
    if (effect.element._popupContent) {
      var content = effect.element._popupContent;
      effect.element._popupContent = null;
      effect.element.innerHTML = content;
      content.evalScripts.bind(content).defer();
    }
    // Uncover other elements
    if (Effect.PopUp.cover && effect.options.fadeBackground) {
      new Effect.Opacity(Effect.PopUp.cover, { to: 0.0, duration: 0.5, afterFinish: function(effect) {
        Effect.PopUp.coverContainer.removeChild(Effect.PopUp.cover);
      }});
      Effect.PopUp.current = null;
    }

    // Abort ajax
    if (effect.element._request) {
      effect.element._request.transport.abort();
      effect.element._request = null;
    }
  }
});

var Client = {
  viewportWidth: function() {
    return self.innerWidth || (document.documentElement.clientWidth || document.body.clientWidth);
  },

  viewportHeight: function() {
    return self.innerHeight || (document.documentElement.clientHeight || document.body.clientHeight);
  },
  
  viewportSize: function() {
    return { width: this.viewportWidth(), height: this.viewportHeight() };
  }
};


/****************************************************************************
 * Cookie class
 *
 * Cookie manager
 */
var Cookie = {
  set: function(name, value, minsToExpire) {
    var expire = '';
    if (minsToExpire != undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (60000 * parseFloat(minsToExpire)));
      expire = '; expires=' + d.toGMTString();
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire);
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  accept: function() {
    if (typeof navigator.cookieEnabled == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === '1');
  }
};
