/**
 * (c) Copyright SECRA GmbH
 */

/*jslint bitwise: true, browser: true, eqeqeq: true, immed: true, newcap: true, plusplus: true, regexp: true, undef: true*/
/*global window */

var groemitz = {};
groemitz.Handler = {};
if(document.addEventListener) {
  groemitz.Handler.add = function(element, eventType, handler) {
    element.addEventListener(eventType, handler, false);
  };
  groemitz.Handler.remove = function(element, eventType, handler) {
    element.removeEventListener(eventType, handler, false);
  };
} else if (document.attachEvent) {
  groemitz.Handler.add = function(element, eventType, handler) {
    if(groemitz.Handler._find(element, eventType, handler) !== -1) {
      return;
    }
    var wrappedHandler = function(e) {
      if (!e) {
        e = window.event;
      }
      var event =
      {
        _event: e, 
        type: e.type, 
        target: e.srcElement,
        currentTarget: element,
        relatedTarget: e.fromElement ? e.fromElement : e.toElement,
        eventPhase: (e.srcElement === element) ? 2 : 3,
        clientX: e.clientX,
        clientY: e.clientY,
        screenX: e.screenX,
        screenY: e.screenY,
        altKey: e.altKey,
        ctrlKey: e.ctrlKey,
        shiftKey: e.shiftKey,
        charCode: e.keyCode,
        stopPropagation: function() {
          this._event.cancelBubble = true;
        },
        preventDefault: function() {
          this._event.returnValue = false;
        }
      };
      if(Function.prototype.call) {
        handler.call(element, event);
      } else {
        element._currentHandler = handler;
        element._currentHandler(event);
        element._currentHandler = null;
      }
    };

    element.attachEvent("on" + eventType, wrappedHandler);
    var h =
    {
      element: element,
      eventType: eventType,
      handler: handler,
      wrappedHandler: wrappedHandler
    };
    var d = element.document || element;
    var w = d.parentWindow;
    var id = groemitz.Handler._uid();
    if(!w._allHandlers) {
      w._allHandlers = {};
    }
    w._allHandlers[id] = h;
    if(!element._handlers) {
      element._handlers = [];
    }
    element._handlers.push(id);
    if(!w._onunloadHandlerRegistered) {
      w._onunloadHandlerRegistered = true;
      w.attachEvent("onunload", groemitz.Handler._removeAllHandlers);
    }
  };

  groemitz.Handler.remove = function(element, eventType, handler) {
    var i = groemitz.Handler._find(element, eventType, handler);
    if(i === -1) {
      return;
    }
    var d = element.document || element;
    var w = d.parentWindow;
    var handlerId = element._handlers[i];
    var h = w._allHandlers[handlerId];
    element.detachEvent("on" + eventType, h.wrappedHandler);
    element._handlers.splice(i, 1);
    delete w._allHandlers[handlerId];
  };
  groemitz.Handler._find = function(element, eventType, handler) {
    var handlers = element._handlers;
    if(!handlers) {
      return -1;
    }
    var d = element.document || element;
    var w = d.parentWindow;
    for (var i = handlers.length - 1; i >= 0; i-=1) {
      var handlerId = handlers[i];
      var h = w._allHandlers[handlerId];
      if(h.eventType === eventType && h.handler === handler) {
        return i;
      }
    }
    return -1; // No match found
  };

  groemitz.Handler._removeAllHandlers = function() {
    var w = this;
    for (var id in w._allHandlers) {
    	if(w._allHandlers.hasOwnProperty(id)) {
	      var h = w._allHandlers[id];
	      h.element.detachEvent("on" + h.eventType, h.wrappedHandler);
	      delete w._allHandlers[id];
    	}
    }
  };
  groemitz.Handler._counter = 0;
  groemitz.Handler._uid = function() {
    return "h" + (groemitz.Handler._counter+=1);
  };
}

////////////////////////////////////////////////////////////////////////////////
// SECRA Maps Init
////////////////////////////////////////////////////////////////////////////////
groemitz.init = function () {
  var i,k,elems = groemitz.getElementsByClassName("karte_nav");
  groemitz.mapLoaded = false;
  groemitz.experience = "groemitz";
  groemitz.karteAction = document.getElementById("karte_sidebar") || document.createElement("img");
  groemitz.karteActionSet = [];
  for(i=0,k=elems.length;i<k;i+=1) {
    if(elems[i].nodeName.toLowerCase() === "a") {
      groemitz.karteActionSet.push(elems[i]);
    }
  }
  groemitz.karteActionSet.push(document.getElementById("karte_reiter") || document.createElement("a"));

  groemitz.Handler.add(groemitz.karteAction, "click", groemitz.imgClick);
  for(i=0,k=groemitz.karteActionSet.length;i<k;i+=1) {
    groemitz.Handler.add(groemitz.karteActionSet[i], "click", groemitz.linkClick);
  }
};

groemitz.imgClick = function() {
  groemitz.mapOpenAction();
};

groemitz.linkClick = function(event) {
  groemitz.mapOpenAction();
  event.preventDefault();

  return false;
};

groemitz.mapOpenAction = function () {
  if(groemitz.mapLoaded === false) {
    groemitz.karteninit();
  } else {
    groemitz.karte.show();
  }
};

groemitz.karteninit = function () {
  groemitz.Handler.remove(groemitz.karteAction, "click", groemitz.imgClick);
  for(i=0,k=groemitz.karteActionSet.length;i<k;i+=1) {
    groemitz.Handler.remove(groemitz.karteActionSet[i], "click", groemitz.linkClick);
  }
  if(groemitz.mapLoaded === false && secra.Kartenmodul.Error.code === 0) {
    groemitz.karte = new secra.Kartenmodul(groemitz.karteLoadedCallback);
    groemitz.karte.setCategoryFeedProxy("comm/mapsfeed.php");
  }
};

groemitz.karteLoadedCallback = function () {
  groemitz.mapLoaded = true;
  groemitz.karte.show();
  groemitz.Handler.add(groemitz.karteAction, "click", groemitz.imgClick);
  for(i=0,k=groemitz.karteActionSet.length;i<k;i+=1) {
    groemitz.Handler.add(groemitz.karteActionSet[i], "click", groemitz.linkClick);
  }
};

groemitz.loadScript = function () {
  if(groemitz.mapLoaded === false) {
    groemitz.myhead   = document.getElementsByTagName("head")[0];
    groemitz.myscript = document.createElement("script");
    groemitz.myscript.toString = function() {return "[ScriptObject]";};
    groemitz.myscript.loaded = false;
    groemitz.myscript.type = "text/javascript";
    groemitz.myscript.src  = "http://www.optimale-praesentation.de/module/kartenmodul/groemitz/KartenmodulGroemitz.js?charset=utf-8";
    groemitz.Handler.add(groemitz.myscript, "readystatechange", groemitz.callbackScriptLoaded);
    groemitz.Handler.add(groemitz.myscript, "load", groemitz.callbackScriptLoaded);
    groemitz.myhead.appendChild(groemitz.myscript);
  }
};

groemitz.callbackScriptLoaded = function () {
  if(typeof groemitz.myscript.readyState !== "undefined") {
    if(groemitz.myscript.readyState === "complete" || groemitz.myscript === "loaded") {
      groemitz.karteninit();
    }
  } else {
    groemitz.karteninit();
  }
  groemitz.myhead.removeChild(groemitz.myscript);
};

groemitz.getElementsByClassName = function(classname, tagname, root) {
  var all, element, elements = [], i, k;
  if(!root) {
    root = document;
  } else if(typeof root == "string") {
    root = document.getElementById(root);
  }
  if(!tagname) {
    tagname = "*";
  }
  all = root.getElementsByTagName(tagname);

  if(!classname) {
    return all;
  }
  for(i = 0, k=all.length; i < k; i+=1) {
    element = all[i];
    if(groemitz.isMember(element, classname)) {
      elements.push(element);
    }
  }

  return elements;
};
groemitz.isMember = function(element, classname) {
  var classes = element.className, whitespace = /\s+/, i, k, c;
  if(!classes) {
    return false;
  }
  if(classes === classname) {
    return true;
  }
  if(!whitespace.test(classes)) {
    return false;
  }
  c = classes.split(whitespace);
  for(i = 0, k = c.length; i < k; i+=1) {
    if(c[i] === classname) {
      return true;
    }
  }
  return false;
};

groemitz.Handler.add(window, "load", groemitz.init);
groemitz.Handler.remove(window, "unload", groemitz.init);
