﻿/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/*
* Wicket Ajax Support 
*
* @author Igor Vaynberg
* @author Matej Knopp 
*/

if (Function.prototype.bind == null) {
  Function.prototype.bind = function(object) {
    var __method = this;
    return function() {
      return __method.apply(object, arguments);
    }
  }
}

// Wicket Namespace

if (typeof (Wicket) == "undefined")
  Wicket = {};



/**
* Browser types
*/

Wicket.Browser = {
  isKHTML: function() {
    return /Konqueror|KHTML/.test(navigator.userAgent) && !/Apple/.test(navigator.userAgent);
  },

  isSafari: function() {
    return /KHTML/.test(navigator.userAgent) && /Apple/.test(navigator.userAgent);
  },

  isOpera: function() {
    return !Wicket.Browser.isSafari() && typeof (window.opera) != "undefined";
  },

  isIE: function() {
    return !Wicket.Browser.isSafari() && typeof (document.all) != "undefined" && typeof (window.opera) == "undefined";
  },

  isIEQuirks: function() {
    // is the browser internet explorer in quirks mode (we could use document.compatMode too)		
    return Wicket.Browser.isIE() && document.documentElement.clientHeight == 0;
  },

  isIELessThan7: function() {
    var index = navigator.userAgent.indexOf("MSIE");
    var version = parseFloat(navigator.userAgent.substring(index + 5));
    return Wicket.Browser.isIE() && version < 7;
  },

  isIE7: function() {
    var index = navigator.userAgent.indexOf("MSIE");
    var version = parseFloat(navigator.userAgent.substring(index + 5));
    return Wicket.Browser.isIE() && version >= 7;
  },

  isGecko: function() {
    return /Gecko/.test(navigator.userAgent) && !Wicket.Browser.isSafari();
  }
};





/**
* Events related code
* Based on code from Mootools (http://mootools.net)
*/

Wicket.Event = {
  idCounter: 0,

  getId: function(element) {
    var current = element.getAttribute("id");
    if (typeof (current) == "string" && current.length > 0) {
      return current;
    } else {
      current = "wicket-generated-id-" + Wicket.Event.idCounter++;
      element.setAttribute("id", current);
      return current;
    }
  },

  handler: function() {
    var id = this[0];
    var original = this[1];
    var element = Wicket.$(id);
    original.bind(element)();
  },

  // adds an event of specified type to the element
  // also supports the domready event on window
  // domready is event fired when the DOM is complete, but before loading external resources (images, ...)
  add: function(element, type, fn) {
    // is the event domready?
    if (element == window && type == "domready") {
      Wicket.Event.addDomReadyEvent(fn);
    } else {
      if (element.addEventListener) {
        element.addEventListener((type == 'mousewheel' && Wicket.Browser.isGecko()) ? 'DOMMouseScroll' : type, fn, false);
      } else {
        if (element == window || element == document) {
          fn = fn.bind(element);
        }
        else {
          fn = Wicket.Event.handler.bind([Wicket.Event.getId(element), fn]);
        }
        // Because of the fn.bind (returning a new function object)
        // you can't detach the event first to be sure that there are no doubles :(
        //element.detachEvent('on'+type, fn);
        element.attachEvent('on' + type, fn);
      }
    }
    return element;
  },

  // handlers that will be fired on dom ready event
  domReadyHandlers: new Array(),

  // fires the dom ready event and cleanup the handlers
  fireDomReadyHandlers: function() {
    var h = Wicket.Event.domReadyHandlers;
    while (h.length > 0) {
      var c = h.shift();
      c();
    }
    Wicket.Event.domReadyHandlers = null;
  },

  // adds the dom ready event 
  addDomReadyEvent: function(fn) {
    // is the window already loaded?
    if (window.loaded) {
      fn();
    } else if (!window.events || !window.events.domready) {
      // register the handler
      Wicket.Event.domReadyHandlers.push(fn);

      // callback
      var domReady = function() {
        if (window.loaded)
          return;
        window.loaded = true;

        // invoke the handlers
        Wicket.Event.fireDomReadyHandlers();
      } .bind(this);

      if (document.readyState && (Wicket.Browser.isKHTML() || Wicket.Browser.isSafari())) {
        //safari and konqueror don't support the event - simulate it through a timeout
        var domCheck = function() {
          if (document.readyState == "loaded" ||
					    document.readyState == "complete") {
            domReady();
          } else {
            // dom not yet ready, set timer to check later
            window.setTimeout(domCheck, 10);
          }
        }
        window.setTimeout(domCheck, 10);
      } else if (document.readyState && Wicket.Browser.isIE()) {
        if (document.getElementById('ie_ready') == null) {
          // for internet explorer we need to load a "dummy" scrip from ::/ to get the 
          // readystatechangeevernt - that means the main page being loaded and now the browser
          // is loading dependencies
          var src = (window.location.protocol == 'https:') ? '\/\/:' : 'javascript:void(0)';
          document.write('<script id="ie_ready" defer src="' + src + '"><\/script>');
          document.getElementById('ie_ready').onreadystatechange = function() {
            if (this.readyState == 'complete') domReady();
          };
        }
      } else {
        // other browsers
        Wicket.Event.add(document, "DOMContentLoaded", domReady);
      }
    } else {
      window.addEventListener("domready", fn, false);
    }
  }
}
