namespace("ego.frontend");

ego.frontend = function ()
{
    function _initMaps()
    {
    	
        if( !ego.settings.getVar("ego.frontend.initGoogleMaps"))
        {
        	ego.settings.setVar("ego.frontend.initGoogleMaps",true);
        
        	$(document).ready(function(){
			   var s = document.createElement("script");
			   s.type = "text/javascript";
			   s.src  = "http://maps.google.com/maps/api/js?v=3&sensor=true&callback=gmapLoaded";
			   window.gmapLoaded = function(){
			       geocoder = new google.maps.Geocoder();
  				   var latlng = new google.maps.LatLng(52.033612, 8.532143);
  					
  				   $(document).unbind("PLUGIN_GOOGLEMAP").bind("PLUGIN_GOOGLEMAP",function(){


		  				   $.each($(".googleMaps"),function(){
		  				   		
			  				     var options = ego.settings.getVar("googleMaps."+$(this).attr("id")+".options");

			  				     options = $.extend({
								    center: latlng,
								    mapTypeId: google.maps.MapTypeId.ROADMAP
								  },options);

								switch(options.mapType)
								{
									case 0:
										options.mapTypeId = google.maps.MapTypeId.HYBRID;
									break;
									case 1:
										options.mapTypeId = google.maps.MapTypeId.ROADMAP;
									break;
									case 2:
										options.mapTypeId = google.maps.MapTypeId.SATELLITE;
									break;
									case 3:							
										options.mapTypeId = google.maps.MapTypeId.TERRAIN;
									break;
									case 4:							
										options.mapTypeId = google.maps.MapTypeId.Ui;
									break;
									default:
										options.mapTypeId = google.maps.MapTypeId.ROADMAP;
									break;
								}


			  					map = new google.maps.Map(this, options);
			  					codeAddress(map,options.address,"");
			  					
		  					});

		  			});
		  			$(document).trigger("PLUGIN_GOOGLEMAP");

			   };
			   $("head").append(s);  
			});


		}


    }
    function codeAddress(map,address,contentStuff) {
		geocoder = new google.maps.Geocoder();
	    if (geocoder) {
	    	
	      geocoder.geocode( { 'address': address}, function(results, status) {
	        if (status == google.maps.GeocoderStatus.OK) {
	          map.setCenter(results[0].geometry.location);
	          marker = new google.maps.Marker({
	              map: map, 
	              position: results[0].geometry.location
	              //title:"Hello World!"
	          });
	          var infowindow = new google.maps.InfoWindow({
	      	    content: contentStuff
	      	});
	      	google.maps.event.addListener(marker, 'click', function() {
	      	  infowindow.open(map,marker);
	      	});
			} else {
	          //alert(ego.tools._("Sorry, we couldn't find the provided email address!"));
	        }
	      });
	    }
	  }
	    

    return {
        
        /**
    	 * Extend Namespace with categories
         * @ego.backend.tools.categories.
    	 */
        google:{
                maps:
                	{ init:function(ui){
                   			_initMaps(); 
                		},
                	  refresh:function(){
                	  	
                	  }
                    }
        }
    };
}();


//global function calls!
$(function ()
{
 	ego.frontend.google.maps.init();
});

/*
highlight v3

Highlights arbitrary terms.

<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>

MIT license.

Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>
*/

jQuery.fn.highlight = function(pat) {
 function innerHighlight(node, pat) { 
  var skip = 0;
  if (node.nodeType == 3) {
   var pos = node.data.toUpperCase().indexOf(pat);
   if (pos >= 0) {
    var spannode = document.createElement('span');
    spannode.className = 'highlight';
    var middlebit = node.splitText(pos);
    var endbit = middlebit.splitText(pat.length);
    var middleclone = middlebit.cloneNode(true);
    spannode.appendChild(middleclone);
    middlebit.parentNode.replaceChild(spannode, middlebit);
    skip = 1;
   }
  }
  else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
   for (var i = 0; i < node.childNodes.length; ++i) {
    i += innerHighlight(node.childNodes[i], pat);
   }
  }
  return skip;
 }
 return this.each(function() {
  innerHighlight(this, pat.toUpperCase());
 });

};

jQuery.fn.removeHighlight = function() {
 return this.find("span.highlight").each(function() {
  this.parentNode.firstChild.nodeName;
  with (this.parentNode) {
   replaceChild(this.firstChild, this);
   normalize();
  }
 }).end();
};


/* Extend jQuery with functions for PUT and DELETE requests. */

function _ajax_request(url, data, callback, type, method) {
    if (jQuery.isFunction(data)) {
        callback = data;
        data = {};
    }
    return jQuery.ajax({
        type: method,
        url: url,
        data: data,
        success: callback,
        dataType: type
        });
}
jQuery.extend({
    put: function(url, data, callback, type) {
        return _ajax_request(url, data, callback, type, 'PUT');
    },
    delete_: function(url, data, callback, type) {
        return _ajax_request(url, data, callback, type, 'DELETE');
    }
});
