YAHOO.namespace("ksu.dynamic");

KSU.dynamic.Visible = function() {

   // Shortcut YUI definitions
   var Dom = YAHOO.util.Dom;
   var $ = Dom.get;
   var addClass = Dom.addClass;
   var hasClass = Dom.hasClass;
   var removeClass = Dom.removeClass;
   var setStyle = Dom.setStyle;
   var Anim = YAHOO.util.Anim;

//   var hideease = YAHOO.util.Easing.backOut;
//   var hideanim = new Anim(document.body, { height: { from: 100, to: 0, unit: "%" },
//      width: { from: 100, to: 0, unit: '%' }, opacity: { from: 1, to: 0 } }, 0.2, hideease);
//   var showanim = new Anim(document.body, { height: { from: 0, to: 100, unit: "%" },
//      width: { from: 0, to: 100, unit: '%' }, opacity: { from: 0, to: 1 } }, 0.2, hideease);

   var onCompleteHide = function() {
      // console.log('onCompleteHide', this, arguments, this.getEl());
      addClass(this.getEl(), 'inactive');
   };

   var LOG;

   var displayall = false;
   
   var insertFirstChild = function(mother, child) {
      if (!mother || !child) {
         return;
      }
      
      if (mother.firstChild) {
         YAHOO.util.Dom.insertBefore(child, mother.firstChild);
      } else {
         mother.appendChild(child);
      }
   };

   return {

      init: function() {

         if (!LOG) {
	    LOG = new YAHOO.widget.LogWriter("Visible");
	 }
         LOG.log("init");

      },

      displayAll: function(root, ctxEval, els) {

         var i, el, expr, ss, label;
         
         ss = new YAHOO.util.StyleSheet(".inactive {background-color: #dfd;}");
         ss2 = new YAHOO.util.StyleSheet($("mainstyle"));
         ss2.set(".inactive", {backgroundColor: "#dfd", display: "block"});

        // console.log(arguments);
         
         addClass(els, "dynamic-element-visible");

         for (i = 0; i < els.length; i++) {
            el = els[i];
            
            label = document.createElement("div");
            label.innerHTML = el.getAttribute('visible');
            insertFirstChild(el, label);
            
            expr = KSU.util.decodeHTML(el.getAttribute('visible'));
            ctxEval.evaluateAndWatch(expr, { fcn: KSU.dynamic.Visible.util.showNow, scope: this, args: [ el ] }, {
               fcn: KSU.dynamic.Visible.util.hideNow, scope: this, args: [ el ] });
         }
      },

      update: function(root, ctxEval) {

         var i, el, els, expr;

         if (root) {
            root = $(root);
         } else {
            root = document;
         }

         els = YAHOO.util.Selector.query('*[visible]', root);

         if (displayall) {
            KSU.dynamic.Visible.displayAll.call(this, root, ctxEval, els);
         } else {
            for (i = 0; i < els.length; i++) {
               el = els[i];
               expr = KSU.util.decodeHTML(el.getAttribute('visible'));
               ctxEval.evaluateAndWatch(expr, { fcn: KSU.dynamic.Visible.util.showNow, scope: this, args: [ el ] }, {
                  fcn: KSU.dynamic.Visible.util.hideNow, scope: this, args: [ el ] });
            }
         }
      },

      setDisplayAll: function(v) {

         displayall = !!v;

      },

      getDisplayAll: function() {

         return displayall;

      },

      util: {

      hide: function(el) {
         // console.log("Hiding ", el, el.display);
         hideanim.setEl(el);
         hideanim.animate();
         hideanim.onComplete.subscribe(onCompleteHide);
      },

      show: function(el) {
         removeClass(el, 'inactive');
         showanim.setEl(el);
         showanim.animate();
      },

      hideNow: function(el) {
         addClass(el, 'inactive');
      },

      showNow: function(el) {
         removeClass(el, 'inactive');
      },

      darkerNow: function(el) {
         addClass(el, 'shade-inactive');
      },

      lighterNow: function(el) {
         removeClass(el, 'shade-inactive');
      },

      nondefaultSelect: function(elements) {

         var i, el;

         try {
            for (i = 0; i < elements.length; i++) {
               el = elements[i];
               if (el.selectedIndex !== 0 || !KSU.lang.isEmpty(el.value)) {
                  return true;
               }
            }
         } catch (e) {
            // Just ignore exception, such as specifying elements that don't exist.
      }

      return false;

   } }

   };

}();

