document.observe('dom:loaded', function() {
    initValidations();
    $$('.dependentSelectMaster').reverse().each( function (elt) {
        new Dependent( $$( '.'+elt.title ).first() , elt );
    });
    if($('shippingAddressFieldset') && $('billingAddressFieldset') && $('useShippingAddressForBilling'))
        new CopyCatFieldSets($('shippingAddressFieldset'), $('billingAddressFieldset'), $('useShippingAddressForBilling'));
    initDialogObservers();
    $$('a.question').each(function(ele){
        var id = ele.innerHTML.unescapeHTML().gsub(/[^\w- ]/, '').gsub(/[\s-]+/, '-').toLowerCase();
        ele.writeAttribute({id: id});
        var link = new Element('a', {href: '#'+id})
            .update(ele.innerHTML)
            .observe('click', function(event){
                event.stop();
                Effect.ScrollTo(ele);
            });
        $('questions').insert(new Element('li').insert(link));
    });
    new ShowMoreLessText();
    //new NavigationSubMenu();
    
    //call function that makes product title equal height
    //equalHeight($$(".prodTitle"));
    
    //call function that makes product price equal height
    //equalHeight($$(".prodPrice"));
    
    //call function that makes product desc equal height
    //equalHeight($$(".prodDesc"));
    
    //call function that makes mantle cols equal height
    //equalHeight($$(".sameHeight"));  the issue this addressed has been solved with css so this script is no longer needed
});

function initValidations(elm) {
    if(!elm) elm = document.body;
    $(elm).select('form.requireValidation').each( function (elt) {
        var useAnimation = true;
        if(elt.hasClassName('no-useAnimation'))
          useAnimation = false;
        var hideErrorBlockWhenEmpty = false;
        if(elt.hasClassName('hideErrorBlockWhenEmpty'))
          hideErrorBlockWhenEmpty = true;
        new Validation(elt, {immediate: true, onSubmit: true, useAnimation: useAnimation, hideErrorBlockWhenEmpty: hideErrorBlockWhenEmpty});
    });
}

function initDialogObservers(elt) {
    if(!elt) elt = document.body;
    $(elt).select('a.centerDialogWindow').each(function(elm){
        var url = elm.href;
        var targetId = url.substring(url.indexOf("#") + 1, url.length);
        var toUpdate = elm.rev ? elm.rev : null;
        window.dialog = new Dialog({
            handle:elm,
            title:elm.title,
            target:{id:targetId,auto:true},
            afterOpen:rebindFormInDailog.curry("centerDialogWindow", toUpdate, targetId, false)
        });
    });
    $(elt).select('a.relativeDialogWindow').each(function(elm){
        var url = elm.href;
        var targetId = url.substring(url.indexOf("#") + 1, url.length);
        var toUpdate = elm.rev ? elm.rev : null;
        window.dialog = new Dialog({
            handle:elm,
            title:elm.title,
            target:{id:targetId,auto:true},
            afterOpen:rebindFormInDailog.curry("relativeDialogWindow", toUpdate, targetId, true)
        });
    });
}

function rebindFormInDailog(dialogClassName, toUpdate, targetId, hideOverlay) {
    // Adding Dependency between selectBoxes of Model Window.
    $('dialog-content').select('.dependentSelectMaster, .dependentSelectMasterForDialog').reverse().each( function (elt) {
        new Dependent( $$( '.'+elt.title ).first() , elt );
    });
    // Adding Validation to forms in Model Window
    $('dialog-content').select('form.requireValidation').each( function (elt) {
        new Validation(elt, {immediate: true});
    });
    initDialogObservers($('dialog-content'));
    if(dialogClassName) $('dialog-container').addClassName(dialogClassName);
    if(hideOverlay) $('dialog-overlay').addClassName('dialogOverlay');

    $('dialog-content').select('form.ajaxMe').each(function(formElt) {
        var displayErrorMethod = 'notification';
        if(formElt.hasClassName('displayErrorMethod-dialog'))
            displayErrorMethod = 'dialog';
        var options = {formElt:formElt, toUpdate:toUpdate, targetId:targetId, dialogClassName:dialogClassName, hideOverlay:hideOverlay, displayErrorMethod:displayErrorMethod};
        ajaxifyForm(options);
    });
}

function ajaxifyForm(extOptions) {
    var options = {
        formElt: null,
        toUpdate: null,
        targetId: null,
        hideOverlay: false,
        dialogClassName: '',
        displayErrorMethod: 'notification', // [dialog | notification]
        afterCallback: null
    }
    Object.extend(options, extOptions || {});

    options.formElt.stopObserving('submit', doAjaxTransection.bind(options));
    options.formElt.observe('submit', doAjaxTransection.bind(options));
}

function doAjaxTransection(event) {
    event.stop();
    var validateForm = new Validation(this.formElt);
    if(validateForm.validate()) {
        new Ajax.Request(event.target.action, {
            asynchronous: false,
            parameters: event.target.serialize(),
            onComplete: function(transport) {
              // Let's check first if we are supposed to redirect user to somewhere
              if (transport.getHeader("requestAction")) {
                  window.location = transport.getHeader("requestAction");
              } else {
                  if(transport.responseText) {
                      if(transport.responseText.isJSON()) {
                          // JSON response might have brought any error message
                          var serverError = getServerError(transport.responseText);
                          if(serverError) {
                              if(event.target.down('.errorMsg'))
                                  serverError = event.target.down('.errorMsg').innerHTML;
                              if(this.displayErrorMethod == 'notification')
                                  displayErrorMessage(serverError);
                              else
                                  new Dialog({title:'Error', content:serverError, className:'errorMessage', autoOpen:true});
                          } else if(event.target.down('.successMsg')) {
                              if(this.displayErrorMethod == 'notification')
                                  displaySuccessMessage(event.target.down('.successMsg'));
                              else
                                  new Dialog({title:'Notification', content:event.target.down('.successMsg').innerHTML, autoOpen:true});
                          }
                      } else {
                          if(this.toUpdate) {
                              // Updating the response we got from the server
                              $(this.toUpdate).update(transport.responseText);
                              if($(this.targetId) && $(this.targetId).descendantOf($(this.toUpdate))) {
                                  // We are dealing with a dialog, will need to update its contents too
                                  window.dialog.opt.content = $(this.targetId).innerHTML;
                                  window.dialog.setContent();
                                  rebindFormInDailog(this.dialogClassName, this.toUpdate, this.targetId, this.hideOverlay);
                              } else {
                                  // We don't need the form anymore, so closing the dialog
                                  if(transport.getHeader("responseName") == 'success')
                                      window.dialog.close();
                              }
                              // Re-Initialising observers on the updated section
                              initValidations(this.toUpdate);
                              initDialogObservers(this.toUpdate);
                          } else {
                              // Seem like we are dealing with a dialog
                              window.dialog.opt.content = transport.responseText;
                              window.dialog.setContent();
                              rebindFormInDailog(this.dialogClassName, this.toUpdate, this.targetId, this.hideOverlay);
                          }
                      }
                  } else if(transport.getHeader("responseName")) {
                      // We got no responseText, let's see if we have responseName header available
                      // we can display static error/notification messages user, if present
                      if(transport.getHeader("responseName") == 'success') {
                          if(event.target.down('.successMsg')) displaySuccessMessage(event.target.down('.successMsg'));
                      } else {
                          if(event.target.down('.errorMsg')) displayErrorMessage(event.target.down('.errorMsg'));
                      }
                  } else {
                      if(event.target.down('.successMsg')) {
                          if(this.displayErrorMethod == 'notification')
                              displaySuccessMessage(event.target.down('.successMsg'));
                          else
                              new Dialog({title:'Notification', content:event.target.down('.successMsg').innerHTML, autoOpen:true});
                      } else if(event.target.down('.errorMsg')) {
                          if(this.displayErrorMethod == 'notification')
                              displayErrorMessage(event.target.down('.errorMsg'));
                          else
                              new Dialog({title:'Error', content:event.target.down('.errorMsg').innerHTML, autoOpen:true});
                      }
                  }
              }
              if(this.afterCallback) this.afterCallback(event, transport);
            }.bind(this)
        });
    } else {
        if(this.afterCallback) this.afterCallback(event);
    }
}

function getServerError(responseText) {
    var data = responseText.evalJSON(true);
    var serverErrorHash = [];
    var serverError = "";
    if (data._ERROR_MESSAGE_LIST_ != undefined) {
      serverErrorHash = data._ERROR_MESSAGE_LIST_;
      serverErrorHash.each(function(error) {
        if (error.message != undefined) {
          serverError += error.message;
        }
      });
      if (serverError == "") {
        serverError = serverErrorHash;
      }
    }
    if (data._ERROR_MESSAGE_ != undefined)
      serverError += data._ERROR_MESSAGE_;
    if(typeof serverError == 'object')
      return serverError.join('<br/>');
    return serverError;
}

function displaySuccessMessage(msg) {
    var message = '';
    if($(msg)) message = $(msg).innerHTML; else message = msg;
    var msgElt = $('successMsg');
    msgElt.down('span').update(message);
    new Effect.Appear(msgElt, {duration: 0.0});
    new Effect.Fade(msgElt, {duration: 0.2, delay:2});
}

function displayErrorMessage(msg) {
    var message = '';
    if($(msg)) message = $(msg).innerHTML; else message = msg;
    var msgElt = $('errorMsg');
    msgElt.down('span').update(message);
    new Effect.Appear(msgElt, {duration: 0.0});
    new Effect.Fade(msgElt, {duration: 0.2, delay:2});
}

//This makes the prod rows equal height
function equalHeight(group) {
	tallest = 0;
	group.each(function(c) {
		thisHeight = c.offsetHeight;
		if(thisHeight > tallest) {
		tallest = thisHeight;
		}
	});
	group.invoke("setStyle", {height: tallest + 'px'})
}

function getHtmlFromString(htmlStr) {
    var tempDiv = document.createElement('div');
    tempDiv.innerHTML = htmlStr;
    return tempDiv;
}
