jQuery.fn.center = function () {
    this.css("position","absolute");
    this.css("top", ( $(window).height() - this.height() ) / 2+$(window).scrollTop() + "px");
    this.css("left", ( $(window).width() - this.width() ) / 2+$(window).scrollLeft() + "px");
    return this;
}


function paramByName( name ) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

var Survey = {
  flash: '',
  overlay: '',

  conditionalTriggers: (new Array()),
  
  requestedSkipForm: false,
  validSubmission: true,

  errorsById: (new Array()),
  
  skipForm: function() {
    this.requestedSkipForm = true;
    return true;
  },

  displayMessage: function(msg) {
    alert(msg)
  },
  
  _isOriginalEvent: function(e) {
    // if no event - it is not the original
    if (e == undefined) return false
    return (
        (jQuery.browser.msie && (e.returnValue == undefined)) ||
        (jQuery.browser.safari) ||
        (e.cancelable)
        );
  },
  
  _isElementVisible: function(elementId) {
    var key = 'e' + elementId;
    if (this.conditionalTriggers[key] && (Object.size(this.conditionalTriggers[key]) != 0)) {
      return true
    }
    return false;
  },
  
  _setElementTrigger: function(elementId, triggerValue, needToShow) {
    var elementWasVisible = this._isElementVisible(elementId);

    var key = 'e' + elementId;
    if (needToShow) {
        if (!this.conditionalTriggers[key]) this.conditionalTriggers[key] = new Array();
        this.conditionalTriggers[key]['t' + triggerValue] = true;
    } else {
        if (!elementWasVisible) return false;
        delete this.conditionalTriggers[key]['t' + triggerValue];
    }
    return elementWasVisible;
  },
  
  _clearFormValues: function(elementId) {
    var offerEngine = this;
    jQuery('#e' + elementId + '-wrapper').find('input,select').each( function() { offerEngine._clearFormValue(this); } ).change();
  },
  
  _clearFormValue: function(domElement) {
    switch (domElement.nodeName) {
      case 'INPUT' :
      switch (domElement.type) {
        case 'checkbox' :
        case 'radio'    : domElement.checked = false; break;
        case 'password' :
        case 'text'     : domElement.value = ''; break;
      }
      break;
      case 'SELECT' : domElement.selectedIndex = 0; break;
    }
    
  },
  
  _processChange: function(conditionalElementIdsString, needToShow, triggerElementValue) {
    if (conditionalElementIdsString == undefined || conditionalElementIdsString == null || conditionalElementIdsString.length < 1) return;

    var conditionalElementIds = conditionalElementIdsString.split(',');
    
    for (var index=0; index<conditionalElementIds.length; index++) {
      var elemId = conditionalElementIds[index];
      var domId = "e" + elemId;
      
      var elementWasAlreadyVisible = this._setElementTrigger(elemId, triggerElementValue, needToShow);
      var elementIsNowVisible = this._isElementVisible(elemId);

      if (needToShow && elementIsNowVisible) {
        if (!jQuery('#e' + elemId + '-wrapper').hasClass('hidden-value-wrapper')) {
          jQuery('#e' + elemId + '-wrapper').slideDown(250);
        }

        jQuery('#e' + elemId + '-is-visible').val(true);
        
      } else if (!needToShow && !elementIsNowVisible) {
        if (!jQuery('#e' + elemId + '-wrapper').hasClass('hidden-value-wrapper')) {
          jQuery('#e' + elemId + '-wrapper').slideUp(250);
        }
        jQuery('#e' + elemId + '-is-visible').val(false);
        this._clearErrors('e' + elemId)
        this._clearFormValues(elemId);
      }
    }
  },
  
  handleEvent: function(triggerEvent, triggerElement, triggerElementId, conditionalElementIdsString) {
    if (triggerElement.type == 'checkbox') {
      this._processChange(conditionalElementIdsString, triggerElement.checked, triggerElement.value);
      
    } else if (triggerElement.type == 'radio') {
      if (this._isOriginalEvent(triggerEvent)) {
        triggerEvent.returnValue = true; // needed for IE
        this._processChange(conditionalElementIdsString, triggerElement.checked, triggerElement.value);
        
        // Now loop through all other radio buttons and fire the onchange for them
        jQuery('.e' + triggerElementId + '-option').not(triggerElement).each(function(){
          this.onchange();
        });
        
      } else {
        this._processChange(conditionalElementIdsString, triggerElement.checked, triggerElement.value);
      }
    }
    return true;
  },
  
  handleSelectChange: function(selectElement) {
    offerEngine = this;
    jQuery(selectElement).find('option').each(function(){ offerEngine._processChange(jQuery(this).attr('conditionalElements'), this.selected, this.value) });
    return true;
  },
  
  addConditionalTrigger: function(elementId, triggerValue) {
    this._setElementTrigger(elementId, triggerValue, true)
  },
  

  offersToPopup: (new Object()),

  addPopup: function(offerId, opts) {
   this.offersToPopup[offerId] = opts
  },

  selectPopup: function(offerId) {
    if (this.offersToPopup[offerId] == undefined) return;

    this.offersToPopup[offerId]['selected'] = true
  },

  burninatePopup: function(offerId) {
    if (this.offersToPopup[offerId] == undefined) return;

    this.offersToPopup[offerId]['selected'] = false
  },

  hasPopped: false,

  _popupOffers: function() {
    if (this.hasPopped == true) return;

    jQuery.each(this.offersToPopup, function(offerId, opts){
      if (opts['selected'] == true) {
        var title = "popup" + offerId
        window.open(opts['url'], title, opts['popup_options'])
      }
    })

    this.hasPopped = true;
    return false
  },

  // addPopupOffer: function(container) {
  //   var tokens = container.attr('id').split('-')
  //   var id = tokens[tokens.length-1]

  //   if (!jQuery.inArray(id, this.offersToPopup) != -1) {
  //     this.offersToPopup.push(
  // },
  
  
  
  
  
  
  elementValidations: (new Array()),
  
  addValidation: function(elementId, valType, valMessage) {
    var key = 'e' + elementId;
    if (Survey.elementValidations[key] == undefined) this.elementValidations[key] = new Object();
    
    var valParams = [];
    for( var i = 3; i < arguments.length; i++ ) {
      valParams.push(arguments[i])
    }
    
    Survey.elementValidations[key][valType] = {valMessage: valMessage, valParams: valParams};
  },
  
  _isBlankString: function(s) {
    var blankRE = /^[\s]+jQuery/;
    return (s == "" || blankRE.test(s));
  },
  
  _formValueFor: function(elemIdString) {
    var offerEngine = this;
    var curVal = '';

    var wrapper = jQuery('#' + elemIdString + '-wrapper')

    if (wrapper.hasClass('date-question-wrapper')) {
      var dayElem = jQuery('#' + elemIdString + '-day')
      var monthElem = jQuery('#' + elemIdString + '-month')
      var yearElem = jQuery('#' + elemIdString + '-year')

      var day = ''
      var month = ''
      var year = ''

      // This is used to determine if they entered ANYTHING for this date element
      var presentedValue = '';

      // Day wasn't present - default it so validation will pass
      if (dayElem.length == 0) {
        day = '01';

      } else {
        day = dayElem.val();

        // Was present, but was left blank
        if (day == '' || day == 'Day') {
          day = '';
        }

        presentedValue += day;
      }


      // Month wasn't present - default it so validation will pass
      if (monthElem.length == 0) {
        month = '01';

      } else {
        month = monthElem.val();

        // Was present, but was left blank
        if (month == '' || month == 'Month') {
          month = '';
        }

        presentedValue += month;
      }


      // Year wasn't present - default it so validation will pass
      if (yearElem.length == 0) {
        year = '2000';

      } else {
        year = yearElem.val();

        // Was present, but was left blank
        if (year == '' || year == 'Year') {
          year = '';
        }

        presentedValue += year;
      }

      var str = day + '/' + month + '/' + year;

      console.log(presentedValue)
      console.log(str);

      // They didn't enter anything
      if (presentedValue == '') {
        return '';

      } else {
        return str;
      }

    } else {
      jQuery('#' + elemIdString + '-wrapper').find('input:not(:hidden,:image),select,textarea').each( function() {
        switch (this.nodeName) {
          case 'INPUT' :
          switch (this.type) {
            case 'checkbox' :
            case 'radio'    : if (this.checked) curVal += this.value; break;
            case 'password' :
            case 'text'     : if (jQuery(this).hasClass('default')){curVal = ''}else{curVal = this.value}; break;
          }
          break;
          case 'SELECT' : curVal = jQuery(this).val(); break;
          case 'TEXTAREA' : curVal = jQuery(this).val(); break;
        }
      });
      
      return curVal;
    }
  },



  _clearErrors: function(elemIdString) {
    var posWrapper = jQuery('#' + elemIdString + '-wrapper')
    posWrapper.removeClass('error-wrapper')

    posWrapper.find('p.error').remove()

    posWrapper.find('.field-with-errors').removeClass('field-being-fixed field-with-errors')
  },


  addError: function(opts){

  },
  
  validateForm: function() {
    if (this.requestedSkipForm) return true;
    
    var validSubmission = true;
    var allErrorMessages = new Array();

    for (var elemIdString in this.elementValidations) {
      if (elemIdString != 'size') {
        var jqWrapper = jQuery('#' + elemIdString + '-wrapper');
        
        var errorMessages = new Array();
        
        var container = jqWrapper.parents('.expandable-container')
        var containerIsVisible = (container.length == 0 || container.is(':visible'))
        if (!containerIsVisible) {continue}

        var isVisible = (jQuery('#' + elemIdString + '-is-visible').val() == 'true');
        if (!isVisible) {continue;};

        var curVal = this._formValueFor(elemIdString);
        var isBlank = this._isBlankString(curVal);
        
        var validations = this.elementValidations[elemIdString]
        var val;

        // Required
        val = validations['RequiredValidation'];
        if (val != undefined && isBlank) {
          errorMessages.push(val.valMessage);
        }
        
        // Date
        val = validations['DateValidation'];
        if (!isBlank && val != undefined) {
          var d = parseDate(curVal);
          if (!d) errorMessages.push(val.valMessage);
        }
        
        // Number
        val = validations['NumberValidation'];
        var numberRe = /^[+-]?[0-9]+$/
        if (!isBlank && val != undefined) {
          if (!numberRe.test(curVal)) errorMessages.push(val.valMessage);
        }

        // MinimumLength
        val = validations['MinimumLengthValidation'];
        var minLengthRe = /^\S{6,}$/
        if (!isBlank && val != undefined) {
          if (!minLengthRe.test(curVal)) errorMessages.push(val.valMessage);
        }
        
        // Regexps
        var revals = ['EmailValidation', 'PhoneValidation', 'ZipValidation', 'RegexpValidation'];
        for (var i=0; i<revals.length; i++) {
          val = validations[revals[i]];
          if (!isBlank && val != undefined) {
            var re = new RegExp(val.valParams[0], val.valParams[1]);
            if (!re.test(curVal)) errorMessages.push(val.valMessage);
          }
        }
        
        if (errorMessages.length == 0) {
          this._clearErrors(elemIdString)

        } else {
          validSubmission = false

          jqWrapper.addClass('error-wrapper')
          var groupWrapper = jqWrapper.find('.group:eq(0)')

          var jqErrorMessageContainer = groupWrapper.find('p.error')

          if (jqErrorMessageContainer.length == 0) {
            groupWrapper.append('<p class="error"></p>')
            jqErrorMessageContainer = groupWrapper.find('p.error')
          }

          jqErrorMessageContainer.html(errorMessages[0])

          jqWrapper.find('input:not(:hidden,:image),select,textarea')
            .addClass('field-with-errors')
            .removeClass('field-being-fixed')

          var label = jqWrapper.find('label:eq(0)')
          var name = ''
          if (label.size != 0)
            name = label.attr('title')
          this.errorsById[elemIdString] = {'name': name, 'messages': errorMessages}
        }
        
      }
    }

    if (!validSubmission) {
      this.validSubmission = false;
      // this.displayFlash("error", "Just a few things to look at", this.flashErrorHtml())
      alert("There were some problems with the submitted information.\n\nPlease look over the form and correct the issues before continuing.")
      return false;
    }

    // Everything was valid, and we'll be submitting the form - clean up all defaults
    jQuery('input[default]').each(function(){
      var input = $(this)
      if (input.val() == input.attr('default') && input.hasClass('default')) {
        input
          .removeClass('default')
          .val('')
      }
    })


    this._popupOffers();

    this.validSubmission = true;
    return true;
  },

  flashErrorHtml: function(){
    var html = "<ol>"
    var opts = {}

    for (var elemIdString in this.errorsById) {
      if (elemIdString != 'size') {
        opts = this.errorsById[elemIdString]

        for (var message in opts['messages']) {
          html += "<li>" + opts['name'] + ' ' + opts['messages'][message] + "</li>"
        }
      }
      html += "</ul>"
    }

    return html
  },

  

  displayFlash: function(flash_class, title, message) {
    this.overlay
      .hide()
      .css('opacity', 0.4)
      .fadeIn(200)

    setTimeout("Survey.overlay.fadeOut(1000)", 1000)

    // this.flash.hide()
    this.flash.find('div.body').html('<h4>' + title + '</h4><p>' + message + '</p>')

    this.flash
      .css("width", "300px")
      .center()
      .fadeIn(500)

    setTimeout('Survey.flash.animate({ "left": "20px", "top": ((( $(window).height() - Survey.flash.height() ) + $(window).scrollTop()) + "px") }, 1000)', 1000)
  },

  hideFlash: function() {
    if (this.flash.is(':visible'))
      this.flash.fadeOut(100)
    if (this.overlay.is(':visible'))
      this.overlay.fadeOut(200)
  },

  setupFlash: function(){
    this.overlay = $('<div id="flash-overlay" style="display: none;"></div>').appendTo("body")
    this.flash = $('<div id="flash-wrapper" style="display: none;"><div class="container shaded"><div class="header"><h3>&nbsp;</h3></div><div class="body">&nbsp;</div></div></div>').appendTo("body")
  },

  tabContent: function(groupID, tabName) {
    $("#" + groupID + "-content-wrapper .content-tab").hide();
    $("#" + groupID + "-tabs > li").removeClass('active')
    $("#" + groupID + "-" + tabName + "-tab").addClass('active')
    $("#" + groupID + "-" + tabName + "-content").show();

    return false;
  }
}

// $(document).ready(function(){
//   Survey.displayFlash('error', 'foobar')
// })

