//
//






//
/// Set up of Zannel methods
//
// Zannel has a dependancy on prototype and a few of it's functions have a
// dependancy on other Libraries such as script.aculo.us library
//
// @author bain.kennedy@zannel.com
//
var zannel_js = new Array();
var meta_array = new Array();
var page = new Object();

var upArrow = 38;
var downArrow = 40;
var enterKey = 13;

var browser = navigator.userAgent.toLowerCase();
var isIE = browser.indexOf("msie") != -1;
var isOpera = browser.indexOf("opera")!= -1;

var DELIMETER = '\n';

var Zannel = new Object();
var metas = document.getElementsByTagName('meta');

for(var i = 0; i < metas.length; i++) {
  meta_array[metas[i].name] = metas[i].content;
}

ZannelUtil = {
  version: '1.0',
  captcha: 0,
  wsUrl: meta_array['wsUrl'],
  wsImgBase: meta_array['wsImgBase'],
  wsVideoBase: meta_array['wsVideoBase'],
  currentVideoUrl: '',
  getWsUrl: function() {
    return this.wsUrl;
  },
  getWsImgBase: function() {
    return this.wsImgBase;
  },
  getWsVideoBase: function() {
    return this.wsVideoBase;
  },
  require: function(libraryName) {
    // inserting via DOM fails in Safari 2.0, so brute force approach
    document.write('<script language="javascript" src="'+libraryName+'"></script>');
  },
  load: function() {
    if((typeof Prototype=='undefined') || (typeof Element == 'undefined') || (typeof Element.Methods=='undefined') ||
        parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1]) < 1.6) {
      throw("Zannel requires the Prototype JavaScript framework >= 1.6.0");
    }
    $$('script').findAll(function(s) { return (s.src && s.src.match(/zannel\.js(\?.*)?$/)); }).each( function(s) {
      var path = s.src.replace(/zannel\.js(\?.*)?$/,'');
      var includes = s.src.match(/\?.*load=([a-z,]*)/);
      if(includes) {
        includes[1].split(',').each(
          function(include) { zannel_js.push(include); ZannelUtil.require(path+"zannel/"+include+'.js?v=' + global_vNum); });
      }
    });
  },
  devPage: function() {
    ZannelUtil.toggleErrorPopup('Sorry this page is in development');
    return false;
  },
  getPosition: function(obj) {
    var positionX = 0;
    var positionY = 0;

    while (obj != null) {
      positionX += obj.offsetLeft;
      positionY += obj.offsetTop;
      obj = obj.offsetParent;
    }

    return [positionX, positionY];
  },
  removeElement: function(obj) {
    if(obj.element) {
      Element.remove(obj.element);
    } else {
      Element.remove(obj);
    }
  },
  sendEmailValidation: function(val) {
    var url = this.getWsUrl() + '/editUser';
    var redirect = 'emailconfirm.htm';
    if ($('rurl')) {
      redirect += '?rurl=' + $('rurl').value;
    }
    var opts = {
      method: 'post',
      postBody: 'sendEmailValidation=true',
      onSuccess: function() { document.location.href=redirect;},
      onFailure: function() { ZannelUtil.toggleErrorPopup('Error sending validation, check your email.'); }
    };
    new Ajax.Request(url, opts);
  },
  sendHsValidation: function(val) {
    var url = this.getWsUrl() + '/editUser';
    var redirect = 'phoneconfirm.htm';
    if ($('rurl')) {
      redirect += '?rurl=' + $('rurl').value;
    }
    var opts = {
      method: 'post',
      postBody: 'sendHandsetValidationOnly=true',
      onSuccess: function() { document.location.href=redirect;},
      onFailure: function() { ZannelUtil.toggleErrorPopup('Error sending validation, check your phone number.'); }
    };
    new Ajax.Request(url, opts);
  },
  passiton: function(hashCode, type) {

    if(!type) {
      type = 'title';
    }
    var popId = 'passiton';
    var url = 'popups/passiton.jsp?title=' + hashCode + '&type=' + type;
    this.togglePopup(popId, url, {evalScripts: true });

  },
  verifyAddressEntry: function(address) {
    var results = new Array(2);
    var bError = false;

    // check if it's a user entered address or not
    if(address.indexOf('&lt;') > -1) {
      var begin = address.indexOf('&lt;');
      var end = address.indexOf('&gt;');
      address = address.substring(begin + 4, end);
      address = trim(address);
    }

    if(isPhone(address)) {
      address = address.replace(/[^0-9]/g, '');
      if(address.charAt(0) == 1) {
        address = address.substr(1);
      }
    } else if(!isEmail(address)) {
      bError = true;
    }

    return { bError: bError, address: address };
  },
  getToAddresses : function() {
    var toAddress = '';
    // added options
    var addresses = $('addressList').getElementsByTagName('li');
    for(var f = 0; f < addresses.length; f++) {
      var address = addresses[f].getElementsByTagName('div')[0].innerHTML;
      address = trim(address);
      toAddress += '&toAddress=' + encodeURIComponent(ZannelUtil.getAddressEntry(address));
    }
    // check the input field as well
    if($F('address') != "") {
      var address = trim($F('address'));
      if(address != '') {
        toAddress += '&toAddress=' + encodeURIComponent(ZannelUtil.getAddressEntry(address));
      }
    }
    return toAddress;
  },
  getAddressEntry: function(address) {
    if(address.indexOf('&lt;') > -1) {
      var begin = address.indexOf('&lt;');
      var end = address.indexOf('&gt;');
      address = address.substring(begin + 4, end);
      address = trim(address);
    }
    return address;
  },
  pioSubmit: function() {
    var url = this.getWsUrl() + '/pio';
    var error = "";
    var toAddress = "";
    var params = "message=" + $F('message') + "&fromName=" + $F('name');

    if($F('pioType') == 'contest') {
      params += "&contest=" + $F('titleHashCode');
    } else if($F('pioType') == 'user') {
      params += "&user=" + $F('titleHashCode');
    } else {
      params += "&title=" + $F('titleHashCode');
    }

    if($('captcha')) {
      if($F('captcha').length < 1) {
        error = "Please complete the security check";
      } else {
        params += "&captcha=" + $F('captcha');
      }
    }

    if(trim($F('name')).length < 2) {
      error = "Please enter your name";
    }

    if(trim($F('message')).length < 2) {
      error = "Please enter a message";
    }

    var atLeastOneAddress = false;
    var addresses = $('addressList').getElementsByTagName('li');

    // added options
    for(var f = 0; f < addresses.length; f++) {
      var address = addresses[f].getElementsByTagName('div')[0].innerHTML;
      if(address != "") {
        var results = ZannelUtil.verifyAddressEntry(address);
        if(results.bError) {
          error = results.address + ' is not a valid entry.';
        } else {
          atLeastOneAddress = true;
          toAddress += '&toAddress=' + encodeURIComponent(results.address);
        }
      }
    }

    // check the input field as well
    if($F('address') != "") {
      var address = $F('address');
      if(address != '') {
        var results = ZannelUtil.verifyAddressEntry(address);
        if(results.bError) {
          error = results.address + ' is not a valid entry.';
        } else {
          atLeastOneAddress = true;
          toAddress += '&toAddress=' + encodeURIComponent(results.address);
        }
      }
    }

    if(error == "" && !atLeastOneAddress) {
      error = "Please enter at least one recipient.";
    }

    if(error == "") {
      $('pioStatus').show();
      $('pioStatus').innerHTML = 'sending';
      var opts = {
        method: 'post',
        postBody: params + toAddress,
        onSuccess: this.pioComplete,
        onFailure: this.pioFail
      };
      new Ajax.Request(url, opts);
    }

    if(error != "") {
      $('pioStatus').show();
      $('pioStatus').innerHTML = error;
      new Effect.Highlight('pioStatus');
      if($('captcha')) {
        $('captcha').value = '';
        ZannelUtil.resetCaptcha(true);
      }
    }
  },
  pioComplete: function(resp) {
    var popId = 'passiton';
    $('pioStatus').show();
    $('pioStatus').innerHTML = 'sent';
    new Effect.Fade(popId, {afterFinish: function() { var body = document.getElementsByTagName('body')[0]; body.removeChild($(popId)); } });
    if(!$("alertPopup")) {
      ZannelUtil.toggleAlertPopup('Thank you for using Pass-It-On.');
    }
  },
  pioFail: function(resp) {
    var errorMsg = '';
    if(resp.status == 400) {
      var errors = resp.responseXML.getElementsByTagName('error');
      var errorType = '';
      for(var i = 0; i < errors.length; i++) {
        errorType = errors[i].getAttribute("type");
        if(errorType == 'toAddress') {
          var toAddress = errors[i].getElementsByTagName(errorType)[0].firstChild.data;
          if(errorMsg != '') {
            errorMsg += '<br />';
          }
          errorMsg += toAddress + ' is not a valid phone number or email address.';
        }
      }

      if(errorType != 'toAddress') {
        errorMsg = 'Invalid captcha entered.';
      }
    } else {
      errorMsg = "Pass-it-on failed.";
    }

    $('pioStatus').show();
    $('pioStatus').innerHTML = errorMsg;

    if($('captcha')) {
      $('captcha').value = '';
      ZannelUtil.resetCaptcha(true);
    }

    new Effect.Highlight('pioStatus');
  },
  getZannelSubmit: function() {
    $('sendStatus').innerHTML = "";

    var url = this.getWsUrl() + '/sendZannel';
    var error = "";

    var params = "";
    if (!isPhone($F('mobilePhone'))) {
      error = 'Please enter a valid phone number';
    } else {
      params += "toPhone=" + stripPhone($F('mobilePhone'));
    }

    if($('captcha')) {
      if($F('captcha').length < 1) {
        error = "Please complete the security check";
      } else {
        params += "&captcha=" + $F('captcha');
      }
    }

    if (!$('tosAgree').checked) {
      error="You must agree to the terms and conditions to receive Zannel";
    }

    if (error == "") {
      $('sendStatus').innerHTML = 'sending';
    }

    if(error != "") {
      $('sendStatus').innerHTML = error;
      new Effect.Highlight('sendStatus');
      return;
    }

    var opts = {
      method: 'post',
      postBody: params,
      onSuccess: this.getZannelComplete,
      onFailure: this.getZannelFail
    };
    new Ajax.Request(url, opts);

  },
  getZannelComplete: function(resp) {

    var popId = 'getZannel';
    $('sendStatus').innerHTML = 'sent';
    new Effect.Fade(popId, {afterFinish: function() { var body = document.getElementsByTagName('body')[0]; body.removeChild($(popId)); } });
    if(!$("alertPopup")) {
      ZannelUtil.toggleAlertPopup('A text message has been sent to your phone. When you receive the message, click the link or enter the address in your phone\'s browser to view the mobile version of Zannel.');
    }
  },
  getZannelFail: function(resp) {
    if(resp.status == 400) {
      $('sendStatus').innerHTML = 'The security code you entered is invalid please re-enter';
      $('captcha').value = '';
      $('captcha').select();
      ZannelUtil.resetCaptcha(true);
    } else {
      $('sendStatus').innerHTML = "Sending Zannel failed, please try again later.";
    }
    new Effect.Highlight('sendStatus');
  },
  resetCaptcha: function(fromWs) {
    //captchaImage
    var img = $('captchaImage').firstChild;
    ZannelUtil.captcha++;
    if(fromWs) {
      new Effect.Fade(img, {queue: 'end', duration: 0.5, afterFinish: function() { img.src = ZannelUtil.getWsUrl() + "/captcha.jpg?" + ZannelUtil.captcha; new Effect.Appear(img, {queue:'end'}); }});
    } else {
      new Effect.Fade(img, {queue: 'end', duration: 0.5, afterFinish: function() { img.src = "captcha.jpg?" + ZannelUtil.captcha; new Effect.Appear(img, {queue:'end'}); }});
    }
  },
  logout: function() {
    var url = this.getWsUrl() + "/login";
    var opts = {
      parameters: 'action=logout',
      onSuccess: this.home,
      onFailure: this.home
    };

    new Ajax.Request(url, opts);
  },
  home: function() {
    window.location.href = 'index.htm';
  },
  toggleForgotLogin: function() {
    var popId = 'forgotInfo';
    var url = 'popups/forgotPassword.jsp';
    this.togglePopup(popId, url);
  },
  submitForgotLogin: function() {
    var url = ZannelUtil.getWsUrl() + '/sendPassword';

    if($F('userNameField') != '') {
      var getParams = "user=" + $F('userNameField');
    } else if($F('emailField') != '') {
      var getParams = "email=" + $F('emailField');
    } else {
      var getParams = "phone=" + $F('phoneField');
    }

    var params = {
      method: 'get',
      parameters: getParams,
      onSuccess: function() {
        ZannelUtil.toggleAlertPopup('Your login information has been sent.');
        ZannelUtil.toggleForgotLogin();
      },
      onFailure: function(resp) {
        if(resp.status != 500) {
          ZannelUtil.toggleErrorPopup('We could not find a user in the system with the information you provided.');
        } else {
          ZannelUtil.toggleServerFailPopup('We\'re sorry an internal error has occurred please try again later.');
        }
      }
    };

    new Ajax.Request(url, params);
  },
  doLoginPopup: function(redirectFrom, required) {
    var url = 'popups/login.jsp';
    var params = '?required=' + required;
    params += '&redirectFrom=' + redirectFrom;
    this.togglePopup('loginPopup', url + params);
  },
  toggleLoginPopup: function(redirectFrom) {
    this.doLoginPopup(redirectFrom, false);
  },
  toggleLoginRequired: function() {
    this.doLoginPopup('', true);
  },
  toggleLoginPopupTracked: function(redirectFrom, trackingCode) {
    ZannelUtil.trackingCodeClick('login', trackingCode);
    ZannelUtil.toggleLoginPopup(redirectFrom);
  },
  submitLoginPopup: function() {
    ZannelUtil.submitLogin('userNameField', 'passwordField');
  },
  submitLogin: function(userField, passField) {
    var url = ZannelUtil.getWsUrl() + '/login';
    var opts = {
      method: 'post',
      postBody: 'username=' + $F(userField) + '&password=' + encodeURIComponent($F(passField)) + '&x=true&src=web',
      onSuccess: function(resp) {
        ZannelUtil.loginSuccess(resp);
      },
      onFailure: ZannelUtil.loginFail
    };
    new Ajax.Request(url, opts);
  },
  loginSuccess: function(resp) {
    var xml = resp.responseXML;
    ZannelUtil.checkForNewRegistration(xml);
    var loginRequired = 'false';
    if($('required')) {
        loginRequired = $F('required');
    }
    if(loginRequired == 'true') {
      window.location.reload();
    } else {
      var username = xml.getElementsByTagName('user')[0].getAttribute('username');
      var successUrl = username;
      var redirectFrom = '';
      if($('redirectFrom')) {
        redirectFrom = $F('redirectFrom');
      }
      if(redirectFrom != '') {
        successUrl = redirectFrom;
      }
      window.location.href = successUrl;
    }
  },
  loginFail: function(resp) {
    ZannelUtil.toggleErrorPopup('The username and password you entered<br/> does not match any existing account.');
  },
  registerRequired: function(trackCode) {
    var currentPage = window.location.href;
    var adsrc = '';
    if(trackCode && trackCode != '') {
        adsrc = '&adsrc=' + trackCode;
    }
    window.location.href = 'register.htm?ru=' + encodeURIComponent(currentPage) + adsrc;
  },
  toggleErrorPopup: function(message, errors) {
    popId = "errorPopup";
    var params = "";

    if(message) {
      params = "message=" + message;
    } else {
      params = "message=An error has occurred";
    }

    if(errors) {
      params += "&" + $H(errors).toQueryString();
    }

    this.togglePopup(popId, 'popups/error.jsp', {method: 'post', postBody: params});
  },
  toggleAlertPopup: function(message) {
    var popId = "alertPopup";
    var params = "message=" + message;
    this.togglePopup(popId, 'popups/alert.jsp', {method: 'post', postBody: params});
  },
  toggleServerFailPopup: function(message) {
    var popId = "serverErrorPopup";
    var params = "message=" + message;
    this.togglePopup(popId, 'popups/servError.jsp', {method: 'post', postBody: params});
  },
  toggleMaturityFilter: function() {
    var popId = "maturityFilter";
    this.togglePopup(popId, 'popups/maturityFilter.jsp');
  },
  submitMaturityFilter: function() {
    var url = ZannelUtil.getWsUrl() + '/editUser';
    var newFilter = "false";
    if ($('matureFilterEnabledTrue').checked) newFilter = "true";
    var opts = {
        method: 'post',
        postBody: "familyFilterEnabled=" + newFilter ,
        onSuccess: function() { ZannelUtil.toggleMaturityFilter(); document.location.href = document.location.href;},
        onFailure: function(resp) { ZannelUtil.toggleMaturityFilter(); ZannelUtil.toggleErrorPopup( resp.responseXML.documentElement.firstChild.data );}
    };
    new Ajax.Request(url, opts);
  },
  suppressValidationReminder: function() {
    var url = ZannelUtil.getWsUrl() + '/editPrefs';
    var opts = {
        method: 'post',
        postBody: "name=web_displayValidationReminder&value=false&action=update",
        onSuccess: function() { ZannelUtil.toggleAlertPopup('Your preference was recorded.'); $('validation').style.display = 'none'; },
        onFailure: function() { ZannelUtil.toggleAlertPopup('There was a problem updating your preference.');}
    };
    new Ajax.Request(url, opts);
  },
  //
  toggleReportBug: function(optionDefault) {
    var popId = "reportABug";
    this.togglePopup(popId, 'popups/reportbug.jsp?default=' + optionDefault);
  },
  submitReportBug: function() {
    var url = ZannelUtil.getWsUrl() + '/feedback';

    if($F('reportSummary').length > 1 && $F('reportDescription').length > 2) {
      var options = $('reportBugForm').getInputs('radio', 'type');
      var checkedOption = options.find(function(el) { return el.checked })
      var opts = {
        method: 'post',
        postBody: "type=" + $F(checkedOption) + "&summary=" + $F('reportSummary') + "&description=" + $F('reportDescription') + "&userAgent=" + $F('reportUserAgent') + "&contactInfo=" + $F('reportContactInfo'),
        onSuccess: function() { ZannelUtil.toggleAlertPopup('Thank you for your feedback.'); ZannelUtil.toggleReportBug(); },
        onFailure: function(resp) { ZannelUtil.toggleErrorPopup(resp.responseText); }
      };
      new Ajax.Request(url, opts);
    } else {
      this.toggleErrorPopup('Make sure you include a summary and description of your bug/feature/abuse, and please be as descriptive as possible.');
    }
  },
  togglePopup: function(popId, url, ajaxParams) {
    var body = document.getElementsByTagName('body')[0];
    if($(popId)) {
      new Effect.Fade(popId, {queue: 'end', duration: .50 });
      var popups = $$('.popup');
      if(popups != null && popups.length == 1) {
        if($('modalDiv')) {
            new Effect.Fade('modalDiv', {queue: 'end', duration: .50 });
        }
      }
      setTimeout("$$('body')[0].removeChild($('" + popId + "'));", 1000);

    } else {
      var popup = document.createElement('div');
      popup.id = popId;
      popup.style.display = 'none';
      popup.className = 'popup';

      var sPath = window.location.pathname;

      // if(sPath.indexOf('viewer') >= 0 && navigator.appVersion.indexOf('WebKit') >= 0) {
      //   this.safariPopup(popId, url, ajaxParams);
      // } else {
      body.appendChild(popup);
      new Ajax.Updater(popId, url, ajaxParams);

      var scrollOffsets = document.viewport.getScrollOffsets();
      popup.style.top = (scrollOffsets.top + 80) +  'px';

      if($('modalDiv')) {
        $('modalDiv').style.height = $('mainContainer').getHeight() + 'px';
        $('modalDiv').show();
      }
      var userAgent = navigator.userAgent.toLowerCase();
      if(userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox') != -1) {
        new Effect.Appear(popId, {duration: 0.5, to: 1.1}); // NOTE: set to 1.1 to deal with mac ff flash opacity issue
      }
      else {
        new Effect.Appear(popId, {duration: 0.5});
      }
    }
  },
  safariPopup: function(popId, url, ajaxParams) {
    alert('popId:' +  popId + " :: url:" + url);
    var newWindow = window.open(url + '?safari=true', popId, 'status=0,toolbar=0,location=0,menubar=0,width=420,height=520');
    newWindow.moveTo(50, 250);
  },
  checkRequiredLogin: function() {
    var securityLinks = $$('.requiresLogin');
    for(var i = 0; i < securityLinks.length; i++) {
      securityLinks[i].secureHref = securityLinks[i].href;
      securityLinks[i].href = "javascript:ZannelUtil.toggleLoginRequired()";
    }
  },
  securityCheckInSuccessful: function() {
    var securityLinks = $$('.requiresLogin');
    for(var i = 0; i < securityLinks.length; i++) {
      securityLinks[i].href = securityLinks[i].secureHref;
    }
  },
  enableLoginPassword: function(elem) {
    elem.style.display = "none";
    $('topPassword').style.display = "";
    $('topPassword').focus();
  },
  keepAlive: function() {
    var loginUrl = ZannelUtil.getWsUrl() + '/login';
    new Ajax.Request(loginUrl);
  },
  wrapNode: function(node, wrapper) {
    node = $(node);
    var parent = node.parentNode;
    parent.replaceChild(wrapper, node);
    wrapper.appendChild(node);
  },
  unwrapNode: function(node) {
    node = $(node);
    var wrapper = node.parentNode;
    (wrapper.parentNode).replaceChild(node, wrapper);
  },
  togglePanel: function(id) {
    if($(id).visible()) {
      Effect.BlindUp($(id), { duration: 0.3 });
    } else {
      Effect.BlindDown($(id), { duration: 0.3 });
    };
    return false;
  },
  loadVideo: function(containerId, videoUrl, embedWidth, autoPlay) {
    ZannelUtil.currentVideoUrl = videoUrl;
    var params = {
        allowscriptaccess: "sameDomain",
        allowfullscreen: "false",
        pluginspage: "http://www.macromedia.com/go/getflashplayer",
        quality: "high",
        scale: "noscale",
        salign: "lt",
        bgcolor: "#000000",
        wmode: "transparent",
        flashvars: "embedWidth=" + embedWidth + (!autoPlay ? "&autoplay=false" : "")
    };
    var attributes = {
        align: "middle",
        id: "player",
        name: "player"
    }
    swfobject.embedSWF("player_v3.swf", containerId, "100%", "100%", "8", false, false, params, attributes);
  },
  clearOmnitureVars: function() {
    
    s.pageName="";
    s.campaign="";
    s.events="";
    s.prop8="";
    s.eVar6="";
    s.eVar8="";
  },
  trackClick: function(linkName, events) {
    ZannelUtil.clearOmnitureVars();
    
    s=s_gi(s_account);
    s.linkTrackVars="events";
    s.linkTrackEvents=events;
    s.events=events;
    s.tl(this, 'o', linkName);
  },
  trackingCodeClick: function(linkName, trackingCode) {
    ZannelUtil.clearOmnitureVars();
    
    s=s_gi(s_account);
    s.linkTrackVars="campaign";
    s.linkTrackEvents='None';
    s.campaign=trackingCode;
    s.tl(this, 'o', linkName);
  },
  setCookie: function(cookieName, cookieValue, days) {
    var expires = "";
    if(days) {
      var date = new Date();
      date.setTime(date.getTime()+(days*24*60*60*1000));
      var expires = "; expires="+date.toGMTString();
    }
    document.cookie =  cookieName + '=' + cookieValue + expires + '; path=/';
  },
  clearCookie: function(cookieName) {
    ZannelUtil.setCookie(cookieName, null, -1);
  },
  setRegTrackingCookie: function() {
    ZannelUtil.setCookie('trackRegistration', 'true');
  },
  checkForNewRegistration: function(xml) {
    var user = xml.getElementsByTagName('user')[0];
    var newRegistration = 'false';
    if(user) {
      newRegistration = user.getAttribute('newRegistration');
    }
    if(newRegistration == 'true') {
      ZannelUtil.setRegTrackingCookie();
      ZannelUtil.setCookie('regType', 'twitter');
    }
  },
  unReadMessageQuery: function() {
      var params = {
          method: 'get',
          parameters: 'unreadCountOnly=true',
          onSuccess: function(resp) {
              var xml = resp.responseXML;
              var unread = xml.documentElement.getAttribute('unread');
              if(unread > 0) {
                  var inboxLink = $('navInboxLink');
                  if(inboxLink) {
                      inboxLink.innerHTML = '<span>inbox <strong>' + unread +'</strong></span>';
                      ZannelUtil.showNavAsNew(inboxLink);
                  }
              }
          }
      };
      new Ajax.Request(this.getWsUrl() + '/conversation', params);
  },
  whatsNewNavChecks: function() {
      var params = {
          method: 'get',
          onSuccess: function(resp) {
              var result = resp.responseXML.getElementsByTagName('results')[0];
              if(result.getAttribute('commentsNew') == 'true') {
                  ZannelUtil.showNavAsNew($('navCommentsLink'));
              }
           }
      };
      new Ajax.Request(this.getWsUrl() + '/whatsNewChecks', params);
  },
  showNavAsNew: function(navItem) {
      var whatsNewTitle = 'new or updated';
      navItem.addClassName('new');
      navItem.title = whatsNewTitle;
      var isNew = $('homeBtnIsNew');
      var isNew2 = $('homeBtnIsNew2');
      isNew.show();
      isNew.title = whatsNewTitle;
      isNew2.show();
      isNew2.title = whatsNewTitle;
  },
  submitSearch: function() {
      if($('query')) {
          var query = $F('query');
          if(query != '') {
              window.location.href = 'search.htm?query=' + encodeURIComponent(query);
          }
      }
  },
  initDropdown: function(btn, dropdown) {
      if(btn && dropdown) {
          btn.observe('mouseover', function(event) {
              try {
                  dropdown.show();
    
                  
                  if(dropdown.id != 'homeDropdown') {
                      $('homeDropdown').hide();
                  }
                  if(dropdown.id != 'topicsDropdown') {
                      $('topicsDropdown').hide();
                  }
                  if(dropdown.id != 'settingsDropdown') {
                      $('settingsDropdown').hide();
                  }
              } catch(err) {
                  
              }
          });
          dropdown.observe('mouseout', function(event) {
              try{
                  if(event.relatedTarget) {
                      var isEmptySpace = (event.relatedTarget.hasClassName('emptySpace'));
                      if(!Element.descendantOf(event.relatedTarget, dropdown) || isEmptySpace) {
                          dropdown.hide();
                      }
                  }
              } catch(err) {
                                    
              }
          });
      }
  },
  initNav: function() {
      ZannelUtil.initDropdown($('homeBtn'), $('homeDropdown'));
      ZannelUtil.initDropdown($('topicsBtn'), $('topicsDropdown'));
      ZannelUtil.initDropdown($('settingsBtn'), $('settingsDropdown'));
      if($('homeDropdown')) {
          ZannelUtil.unReadMessageQuery();
          ZannelUtil.whatsNewNavChecks();
      }
      if($('query')) {
          $('query').observe('keypress', function(event) {
              if(event.keyCode == Event.KEY_RETURN) {
                  ZannelUtil.submitSearch();
              }
          });
      }
  },
  init: function() {
    //
    ZannelUtil.checkRequiredLogin();
    //

    ZannelUtil.initNav();

    zannel_js.each(function(tab, index){
      page[tab] = new Zannel[tab];
      if(page[tab].init) {
        page[tab].init();
      }
    } );

    new PeriodicalExecuter(ZannelUtil.keepAlive,  60 * 10 );

    if($('loading')) {
      new Effect.Fade('loading');
    }
  }

};

// called by the flash video player to load the video to play
// note: only supports using one video player at a time
function movie_ready() {
    var flashMovie = $("player");
    flashMovie.set_player_mode("single-part");
    flashMovie.play_video(ZannelUtil.getWsVideoBase() + ZannelUtil.currentVideoUrl);
}

/** Validation Functions */
function isEmpty(val) {
  return (/^\s*$/.test(val));
}

function isEmail(val) {
  //var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  var filter = /^(.+)@(.+)$/;
  return filter.test(val);
}

function stripPhone(val) {
  // i(neil) wrote this. i suck at regex. :)
  val = val.replace(/ /g, "");
  val = val.replace(/\./g, "");
  val = val.replace(/-/g, "");
  val = val.replace(/\(/g, "");
  val = val.replace(/\)/g, "");

  return val;
}

function isPhone(val) {
  val = stripPhone(val);
  var filter = /^\+{0,1}\d{1,15}$/;
  return filter.test(val);
}

function getCheckedValue(radioObj) {
  if(!radioObj)
    return "";
  var radioLength = radioObj.length;
  if(radioLength == undefined)
    if(radioObj.checked)
      return radioObj.value;
    else
      return "";
  for(var i = 0; i < radioLength; i++) {
    if(radioObj[i].checked) {
      return radioObj[i].value;
    }
  }
  return "";
};
function setCheckedValue(radioObj, newValue) {
  if(!radioObj)
    return;
  var radioLength = radioObj.length;
  if(radioLength == undefined) {
    radioObj.checked = (radioObj.value == newValue.toString());
    return;
  }
  for(var i = 0; i < radioLength; i++) {
    radioObj[i].checked = false;
    if(radioObj[i].value == newValue.toString()) {
      radioObj[i].checked = true;
    }
  }
};

function changeDateDays(dayId, month, year, includesDefault) {

  var days = 30;
  switch(month) {
      case '0':
      case '2':
      case '4':
      case '6':
      case '7':
      case '9':
      case '11': days = 31; break;
      case '1': // February
        days = 28;
        if(year != '') {
            if(year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
              days = 29;
            }
        }
        break;
  }

  var options = $(dayId).select('option');
  var index = $(dayId).selectedIndex;
  var optionsLength = options.length;

  if(includesDefault) {
    days = days + 1;
  }

  if(days < optionsLength) {
    for(var i = optionsLength; i > days; i--) {
      $(dayId).removeChild(options[i - 1]);
    }
    if(index >= days) {
      $(dayId).selectedIndex = days - 1;
    } else {
      $(dayId).selectedIndex = index;
    }

  } else if(days > optionsLength) {
    for(var i = optionsLength; i < days; i++) {
      var dayValue = i;
      if (!includesDefault) {
        dayValue++;
      }
      $(dayId).appendChild(Builder.node('option', { value: dayValue }, dayValue));
    }

    $(dayId).selectedIndex = index;
  } // else do nothing same amount of days
}

function validateSearch(term) {
  if (term.length > 2) {
    return true;
  } else {
    return false;
  }
}

function clearElementsForId(name) {
  while($(name).hasChildNodes()) $(name).removeChild($(name).lastChild);
}

function limitTextArea(obj, max) {
  if (obj.value.length > max) {
    obj.value = obj.value.substring(0,max);
  }
}

function capStringLength(str, len) {
  if (!str || str.length == 0 || str.length < len) {
    return str;
  }

  var ender = "...";
  if (str.length > len) {
    var cutIndex = str.lastIndexOf(" ", len-ender.length);
    if (cutIndex != -1) {
      str = str.substring(0,cutIndex) + ender;
    }
    else {
      str = str.substring(0,len-ender.length) + ender;
    }
  }
  return str;
}

function capWordLength(str, len) {
  if (!str || str.length == 0 || str.length < len) {
    return str;
  }
  var newStr = "";
  var words = str.indexOf(' ') == -1 ? new Array(str) : str.split(' ');

  for (var i = 0; i < words.length; i++) {
    if (words[i].length > len) {
      //newStr += "... ";
      // this puts a " " at len position
      newStr += words[i].substring(0, len) + " ";
      newStr += capWordLength(words[i].substring(len), len);
    }
    else {
      newStr += words[i]+" ";
    }
  }

  return newStr;
}

// Removes leading whitespaces
function LTrim( value ) {

  var re = /\s*((\S+\s*)*)/;
  return value.replace(re, "$1");

}

// Removes ending whitespaces
function RTrim( value ) {

  var re = /((\s*\S+)*)\s*/;
  return value.replace(re, "$1");

}

// Removes leading and ending whitespaces
function trim( value ) {

  return LTrim(RTrim(value));

}

String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g,"");
};

var Suggest = Class.create();
Suggest.prototype = {
    initialize: function(fieldId, url, options, entryLimit) {
        this.id = fieldId;
        this.txtField = $(fieldId);
        this.ajaxUrl = url;
        this.setOptions(options);
        this.lastComma = 0;
        this.timeout = null;
        this.selectedIndex = -1;
        this.suggestions = [];
        this.injectEventHandler();
        this.displayLimit = 5;
        this.entryLimit = entryLimit; // < 1 == no limit
    },
    injectEventHandler: function() {

      if(isIE) {
        this.txtField.autocomplete = "off";
      }

      var eventHandler = new SuggestEventHandler(this);
      this.createSuggestDisplay();
    },
    setOptions: function(options) {
        this.options = Object.extend(options, {
            color: '#fff',
            backgroundColor: '#bebebe'
        });
    },
    createSuggestDisplay: function() {
        if(!this.suggestDisplay) {
            this.suggestDisplay = Builder.node('div', { id: 'suggestDisplay', style: 'display: none' });
            $('suggestContainer').appendChild(this.suggestDisplay);
            this.suggestDisplay.style.top = this.txtField.offsetHeight + 'px';
            this.suggestDisplay.style.width = this.txtField.offsetWidth + 'px';
            this.suggestDisplay.style.zIndex = '999';
        }
    },
    addressQuery: function(nick) {
      var url = ZannelUtil.getWsUrl();
      if(this.ajaxUrl != 'url') {
        url += this.ajaxUrl;
      } else {
        url += "/addressBookEntries";
      }
      var params = {
        method: 'get',
        parameters: 'nickName=' + nick,
        onSuccess: suggest.fillQuery
      };
      new Ajax.Request(url, params);
    },
    fillQuery: function(resp) {
      suggest.selectedIndex = -1;
      var xml = resp.responseXML;
      var entries = xml.getElementsByTagName('addressBookEntry');

      suggest.createSuggestDisplay();
      suggest.suggestDisplay.innerHTML = "";
      suggest.suggestions = new Array();
      if(entries.length > 0) {
        $A(entries).each(function(entry, i) {
            var nick = entry.getElementsByTagName('nickName')[0].firstChild.data;
            var address = entry.getElementsByTagName('address')[0].firstChild.data;
            suggest.suggestions.push(address);
            var span = Builder.node('span', {id: suggest.txtField.id + '_' + i, style: 'display: block' }, nick + " <" + address + ">");
            span.onmouseover = suggest.spanMouseOver.bindAsEventListener(suggest);
            span.onmouseout = suggest.spanMouseOut.bindAsEventListener(suggest);
            span.onclick = suggest.spanClick.bindAsEventListener(suggest);
            suggest.suggestDisplay.appendChild(span);
        });
        suggest.showSuggestions();
      } else {
        suggest.hideSuggestions();
      }
    },
    spanClick: function(e) {
      var src = e.srcElement ? e.srcElement : e.target;
      this.selectAddress(src);
    },
    selectAddress: function(span) {
      var address = span.innerHTML;
      address = address.replace(/&lt;/, '<');
      address = address.replace(/&gt;/, '>');
      this.createTargetLi(address);
    },
    showSuggestions: function() {
      this.showing = true;
      new Effect.Appear(suggest.suggestDisplay, { duration: 0.2});
    },
    hideSuggestions: function() {
      this.showing = false;
      this.selectedIndex = -1;
      new Effect.Fade(suggest.suggestDisplay);
    },
    spanMouseOver: function(e) {
      var src = e.srcElement ? e.srcElement : e.target;
      var spans = this.suggestDisplay.getElementsByTagName('span');

      if(this.selectedIndex > -1) {
        this.deselectSpan(spans[this.selectedIndex]);
      }
      for(var i = 0; i < spans.length; i++) {
        if(spans[i] == src) {
          this.selectedIndex = i;
        }
      }

      this.selectSpan(spans[this.selectedIndex]);
    },
    spanMouseOut: function(e) {
      var src = e.srcElement ? e.srcElement : e.target;
      this.deselectSpan(src);
    },
    moveSelectionUp: function() {
      if(this.selectedIndex > 0) {
        this.updateSelection(this.selectedIndex - 1);
      }
    },
    moveSelectionDown: function() {
      if(this.selectedIndex < (this.suggestions.length - 1)) {
        this.updateSelection(this.selectedIndex + 1);
      }
    },
    updateSelection: function(num) {
      var span = $(this.id + "_" + this.selectedIndex);
      if(span) {
        this.deselectSpan(span);
      }

      this.selectedIndex = num;

      var span = $(this.id + "_" + this.selectedIndex);
      if(span) {
        this.selectSpan(span);
      }
    },
    selectSpan: function(span) {
      span.style.color = this.options.color;
      span.style.backgroundColor = this.options.backgroundColor;
    },
    deselectSpan: function(span) {
      span.style.color = '';
      span.style.backgroundColor = '';
    },
    makeSelection: function() {
      var spans = this.suggestDisplay.getElementsByTagName('span');
      this.selectAddress(spans[this.selectedIndex]);
      setTimeout('suggest.selectedIndex = -1', 200);
      this.hideSuggestions();
    },
    isSpecialKey: function(e) {
      var enterKey  = 13;
      var upArrow   = 38;
      var downArrow = 40;

      switch(e.keyCode) {
        case enterKey:
        case upArrow:
        case downArrow: return true; break;
        default: return false;
      }
    },
    handleTextInput: function() {
      clearTimeout(this.timeout);
      var previousRequest = this.lastRequestString;
      this.lastRequestString = this.getCurrentItem();
      if(this.lastRequestString == "") {
        this.hideSuggestions();
      } else if(this.lastRequestString != previousRequest) {
        this.timeout = setTimeout('suggest.addressQuery(\'' + this.lastRequestString +'\')', 250);
      }
    },

    getCurrentItem: function() {
      var value = this.txtField.value;

      var lastDelimeter = value.lastIndexOf(DELIMETER);
      var focus = value;
      if(lastDelimeter != -1) {
        focus = value.substring(lastDelimeter + 1);
      }
      if(lastDelimeter > -1 && lastDelimeter != this.lastDelimeter) {
        this.lastDelimeter = lastDelimeter;
      }

      return focus;
    },
    removeEntry: function(entry) {
      entry.parentNode.parentNode.removeChild(entry.parentNode);
      var entryList = $('addressList');
      var listLength = entryList.getElementsByTagName('li').length;
      if(listLength < this.displayLimit) {
        entryList.removeClassName('withScrollBar');
        $('addressListContainer').removeClassName('scrollVertical');
        $('addressListContainer').setStyle( { height: entryList.getHeight() + 'px' } );
      }

      var count = $$('.addressLi').length;
      if (this.entryLimit > 0 && count < this.entryLimit) {
        this.txtField.value = '';
        this.txtField.enable();
        this.txtField.removeClassName('disabled');
      }

    },
    createTargetLi: function(address) {
      address = trim(address);
      if(address == '') {
        this.txtField.value = "";
        this.txtField.focus();
        return;
      }

      var entryList = $('addressList');
      var listContainer = $('addressListContainer');
      var listLength = entryList.getElementsByTagName('li').length;

      var entry;
      var height;
      var marginBottom;

      if(listLength > 0) {
          entry = entryList.getElementsByTagName('li')[0];
          height = entry.getHeight();
          marginBottom = entry.getStyle('margin-bottom');
          marginBottom = marginBottom.replace('px', '');
      }

      if(listLength == this.displayLimit) {
        height = (height + parseInt(marginBottom)) * this.displayLimit;
        listContainer.addClassName('scrollVertical');
        listContainer.setStyle( { height: height + 'px' } );
        entryList.addClassName('withScrollBar');
      } else if (listLength > 0) {
        height = (height + parseInt(marginBottom)) * (listLength + 1);
        listContainer.setStyle( { height: height + 'px' } );
      }

      var li = Builder.node('li', { style: 'display: none', className: 'addressLi'},
        [ Builder.node('a',
            { href: '#', onclick: 'suggest.removeEntry(this); return false;', title: 'remove' },
            [ Builder.node('img', { src: 'images/r2/icon_delete_x.gif', width: '13px', height: '13px' }) ]
          ),
          Builder.node('div', address)
        ]);

      entryList.insertBefore(li, entryList.firstChild);
      Effect.Appear(li, { duration: 0.3 });

      listContainer.show();

      this.txtField.value = "";
      this.txtField.focus();
      var count = $$('.addressLi').length;
      if (this.entryLimit > 0 && count >= this.entryLimit) {
        this.txtField.value = 'You have reached your connection limit - you cannot add more contacts.';
        this.txtField.disable();
        this.txtField.addClassName('disabled');
        this.txtField.style.fontSize = '11px';
      }
    }
};

SuggestEventHandler = Class.create();
SuggestEventHandler.prototype = {
  initialize: function(suggest) {
    this.suggest = suggest;
    this.input = this.suggest.txtField;

    this.input.onkeypress = this.stopEnter.bindAsEventListener(this);
    this.input.onkeydown = this.keyDown.bindAsEventListener(this);
    this.input.onkeyup = this.keyUp.bindAsEventListener(this);
    this.input.onblur = this.inputBlur.bindAsEventListener(this);
  },
  stopEnter: function(e) {
    if(e.keyCode == enterKey) {
      if(this.suggest.selectedIndex == -1) {
        if(this.input.value != "") {
          this.suggest.createTargetLi(this.input.value);
        }
        this.suggest.hideSuggestions();
      }
      return false;
    }

    return true;
  },
  keyUp: function(e) {
    if(this.input.length == 0) {
      this.suggest.hideSuggestions();
    }

    if(!this.handledSpecialKeys(e)) {
      this.suggest.handleTextInput();
    }
  },
  keyDown: function(e) {
    if(e.keyCode == upArrow) {
      this.suggest.moveSelectionUp();
      setTimeout(this.moveCursorToEnd.bind(this), 1);
    } else if(e.keyCode == downArrow) {
      this.suggest.moveSelectionDown();
    } else if(e.keyCode == enterKey) {
      if(this.suggest.showing) {
        this.suggest.makeSelection();
      }
    }
  },
  inputBlur: function(e) {
    this.suggest.hideSuggestions();
  },
  handledSpecialKeys: function(e) {
    if(e.keyCode == upArrow || e.keyCode == downArrow) {
      return true;
    } else if(e.keyCode == enterKey) {
      //this.suggest.setInputFromSelection();
      return true;
    } else {
      return false;
    }
  },
  moveCursorToEnd: function() {
    var pos = this.input.value.length;
    if(this.input.setSelectionRange) {
      this.input.setSelectionRange(pos, pos);
    } else if(this.input.createTextRange) {
      var m = this.input.createTextRange();
      m.moveStart('character', pos);
      m.collapse();
      m.select();
    }
  }
};

// Ajax Loading status icon
var loadingAjaxResponder = {
  onCreate: function() {
    if($('loading') && $('loading').style.display != 'block') {
      new Effect.Appear('loading', { duration: 0.2});
    }
  },
  onComplete: function() {
    if($('loading') && Ajax.activeRequestCount <= 0) {
      new Effect.Fade('loading', {duration: 0.5});
    }
  }
};

Ajax.Responders.register(loadingAjaxResponder);
ZannelUtil.load();
document.observe("dom:loaded", ZannelUtil.init);