(function() {
  var $E=YAHOO.util.Event;
  var $D=YAHOO.util.Dom;
  var $=$D.get;
  var $$=$D.getElementsByClassName;
  var $L=YAHOO.lang;
  var $C=YAHOO.util.Connect;
  var $A=YAHOO.util.Anim;

  //BACKEND CODE

  //Clear reseller on submit if empty (user filter form)
  var form = $("autocomplete_user_filters_reseller_id");
  if(form)
  {
    while(form.nodeName != 'FORM'){
      form = form.parentNode;
    }
    $E.on(form, "submit", function(){
      if($("autocomplete_user_filters_reseller_id").value.length == 0)
      {
        $("user_filters_reseller_id").value = "";
      }
    });
  }

  /******************************************************************
   *
   * Useful Javascript tools
   */
  YAHOO.namespace('myTools');
  YAHOO.myTools = {

    /**
     * Remove all form errors in a form
     * @param {string/HTMLElement} Dom class to remove errors from
     */
    clearFormErrors : function(error_class) {
      var form_errors =  $D.getElementsByClassName(error_class);

      if( form_errors )
      {
        for(i = 0; i < form_errors.length; i++) {
          form_errors[i].innerHTML="";
        }
      }
    },

    /**
     * Removed all children from the given DOM elemement
     * @param {string/HTMLElement} Dom element to remove children from
     */
    removeChildren : function(id) {
      var node = $(id);
      if ( node )
      {
        while (node.hasChildNodes())
        {
          // Clear previous handlers
          $E.purgeElement(node.firstChild, true);
          node.removeChild(node.firstChild);
        }
      }
    },

    // Gets the actual link from an event.  Sometimes a picture is included in a link
    // and the link is the actual element clicked and not the link itself
    getLinkElementFromEvent : function(e) {
      var el = $E.getTarget(e);
      // If they clicked on the link image make sure we get the actual link
      if ( el.nodeName != "A" ){
        el=el.parentNode;
      }
      return el;
    },

    // Toggles visibility display on an element
    toggle: function (el) {
      if ($D.getStyle(el, 'display') == 'none') {
        YAHOO.myTools.show(el);
      }
      else {
        YAHOO.myTools.hide(el);
      }
    },

    // Toggles visibility of an element with animation
    toggleAnimate: function(el, seconds) {
      if ($D.getStyle(el, 'display') == 'none') {
        YAHOO.myTools.appear(el, seconds);
      }
      else {
        YAHOO.myTools.fade(el, seconds);
      }
    },

    // Shows an element
    show: function(el) {
      $D.setStyle(el, 'display', '');
    },

    // Hides an element
    hide: function(el) {
      $D.setStyle(el, 'display', 'none');
    },

    // Make an element appear with animation
    appear: function(el, seconds) {
      var sec = seconds || 1;
      $D.setStyle(el, "opacity", 0);
      YAHOO.myTools.show(el);
      var appearAnim = new YAHOO.util.Anim(el, {opacity: { from: 0, to: 1 } }, sec, YAHOO.util.Easing.easeOut);
      appearAnim.animate();
    },

    // Make an element fade with animation
    fade: function(el, seconds) {
      var sec = seconds || 1;
      var fadeAnim = new YAHOO.util.Anim(el, {opacity: { from: 1, to: 0 } }, sec, YAHOO.util.Easing.easeOut);
      fadeAnim.onComplete.subscribe(function() {
        YAHOO.myTools.hide(el);
        $D.setStyle(el, "opacity", 1);
      });
      fadeAnim.animate();
    },

    //fire js event
    fireEvent:  function (element,event){
      element = $(element);
      if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
      }
      else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
      }
    },

    // display an alert message instead of javascripts default message
    //
    alert: function( element, message, width ){
      if(!width){
    	width = "300px";
      }
      var handleYes = function() { this.hide(); };
      var dialogbox = new YAHOO.widget.SimpleDialog( element,
                                               { width: width,
                                                 fixedcenter: true,
                                                 visible: true,
                                                 draggable: false,
                                                 close: true,
                                                 modal: true,
                                                 text: message,
                                                 iframe:true,
                                                 constraintoviewport: true,
                                                 buttons: [ { text:"ok", handler:handleYes, isDefault:true } ]
                                               } );
      dialogbox.setHeader("Notification");
      dialogbox.render("notification");
    }

  }

  /******************************************************************
   *
   * Displays a modal loading picture to use mainly for AJAX requests
   *
   */
  YAHOO.namespace('AjaxLoader');
  YAHOO.AjaxLoader = function(){
    var ajaxLoaderPanel=null;
    var ajaxLoadingMessage = '';

    /**
     * Creates module instanace of AJAX indicator
     */
    var initAjaxLoader = function() {
      if ( ajaxLoaderPanel == null ) {
        ajaxLoaderPanel =  new YAHOO.widget.Panel("wait",{ width: "240px",
                                                      fixedcenter: true,
                                                      close: false,
                                                      draggable: false,
                                                      zindex:4,
                                                      modal: true,
                                                      visible: false
                                                    }
                                                );
        ajaxLoaderPanel.setHeader(ajaxLoadingMessage);
        ajaxLoaderPanel.setBody('<img style="display:block" src="/images/js/loading.gif">');
        ajaxLoaderPanel.render(document.body);
      }
      else {
        ajaxLoaderPanel.setHeader(ajaxLoadingMessage);
      }
    }

    return {
      /**
       * Hides AJAX indicator
       */
      hide: function() {
        initAjaxLoader();
        ajaxLoaderPanel.hide();
      },

      /**
       * Shows the AJAX indicator
       */
      show: function(msg) {
        ajaxLoadingMessage = msg || "Loading, please wait...";
        initAjaxLoader();
        ajaxLoaderPanel.show();
      }
    }
  }();
})();

