/* GOOGLE MAPS ................................................

- setDealerMarkers() moet in de pagina aanwezig zijn, anders worden de organisaties niet op de kaart weergegeven.

*/

var gMapsObject = new Object();
gMapsObject.data = new Array();
gMapsObject.data['startPos'] = null;
gMapsObject.data['startZoom'] = null;
gMapsObject.data['map'] = null;
gMapsObject.data['geocoder'] = null;
gMapsObject.data['userPoint'] = null;
gMapsObject.data['bezoekerIcon'] = null;
gMapsObject.data['startingPosition'] = null;
gMapsObject.data['mapId'] = 'googleMaps';
gMapsObject.data['points'] = new Array();

gMapsObject.loadGoogleMaps = function() {
  	if (GBrowserIsCompatible()) {
		gMapsObject.data['startPos'] = gMapsObject.data['startingPosition'] ? new GLatLng(gMapsObject.data['startingPosition'].latitude,gMapsObject.data['startingPosition'].longitude) : new GLatLng(52.167194,5.232041);
		gMapsObject.data['startZoom'] = gMapsObject.data['startingPosition'] ? gMapsObject.data['startingPosition'].zoomlevel : 6;
		gMapsObject.data['map'] = new GMap2($(gMapsObject.data['mapId']));
		gMapsObject.data['geocoder'] = new GClientGeocoder();
		gMapsObject.data['bezoekerIcon'] = new GIcon(G_DEFAULT_ICON);
		gMapsObject.data['bezoekerIcon'].image = "http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png";

		gMapsObject.data['map'].setCenter(gMapsObject.data['startPos'], gMapsObject.data['startZoom']);
		gMapsObject.data['map'].addControl(new GSmallMapControl());
		var mapControl = new GMapTypeControl();
		gMapsObject.data['map'].addControl(mapControl);
		gMapsObject.data['points'].each(function(propertyList){
			gMapsObject.processMarker(propertyList.latitude,
									  propertyList.longitude,
									  propertyList.message);
		});
	}
}

gMapsObject.setStartPos = function(latitude,longitude,zoomlevel){
	gMapsObject.data['startingPosition'] = {latitude: latitude, 
											longitude:longitude, 
											zoomlevel:zoomlevel};
}

gMapsObject.addMarker = function(latitude,longitude,message){
	gMapsObject.data['points'].push({
		latitude: latitude, 
		longitude: longitude, 
		message: message});
}

gMapsObject.processMarker = function(latitude, longitude, message) {
	var targetLocation = 'http://maps.google.com/maps?f=d&hl=nl&daddr=\'+this.to.value+\'&saddr=\'+this.from.value+\',+Nederland';
	var latlng = new GLatLng(latitude,longitude);
	var dealerIcon = new GIcon(G_DEFAULT_ICON);
	var markerOptions = {
		icon:dealerIcon
	};
	var marker = new GMarker(latlng, markerOptions);
	gMapsObject.data['map'].addOverlay(marker);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(message);
		}
	);
}

gMapsObject.calcProximityToPostcode = function(postcode, targetContainer, proximity, zoomlevel){
	//clearShapes();
	if (gMapsObject.data['geocoder']) {
		gMapsObject.data['geocoder'].getLatLng(
			postcode + ', netherlands',
			function(point) {
				if (!point) {
					if($('geocoderRespondedFalse')) {
						$('geocoderRespondedFalse').show();
					}
					gMapsObject.data['map'].setCenter(new GLatLng(52.167194,5.232041), 6);
					// todo : take action on empty return
				} else {
					if($('geocoderRespondedFalse')) {
						$('geocoderRespondedFalse').hide();
					}
					// setting the center
					gMapsObject.data['map'].setCenter(point, zoomlevel);
					// placing an extra marker for the found location
					markerOptions = { icon:gMapsObject.data['bezoekerIcon'] };
					var marker = new GMarker(point,markerOptions);
					gMapsObject.data['map'].addOverlay(marker);
					GEvent.addListener(marker, "click", function() {
						marker.openInfoWindowHtml('Door u ingevoerde postcode: ' + postcode);
					});
					
					dealerList.updateDealerContainer(proximity, point.lat(), point.lng(), targetContainer);
				}
			}
		);
	}
}

/***************************************************************
* GET ELEMENT BY TAG NAMES
* todo : hier zal best wel een prototype oplossing voor zijn, 
*        maar ik heb gewoon geen tijd meer
***************************************************************/

function getElementsByTagNames(list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}


/***************************************************************
* STATIC LINKS
*
* Acts like abstract-class (no inheritance whatsoever) so 
* every script can access it
*
***************************************************************/

StaticLink = new Object();
StaticLink.repository = new Hash();
StaticLink.initialize = function(){
	$$('.staticLink').each(function(elem){
		elem.observe('click',StaticLink.eventHandler);
	});
	$$('a').each(function(elemObj){
		if(!elemObj.hasClassName('staticLink')){
			elemObj.observe('click', function(eventObject){
				StaticLink.redirectDirect(this.readAttribute('href'),this.readAttribute('target'));
				eventObject.stop();
				return false;
			});
		}
	});
}
StaticLink.setLink = function(linkRef,targetUrl) {
	StaticLink.repository.set(linkRef,targetUrl);
}
StaticLink.getLink = function(linkRef) {
	StaticLink.repository.get(linkRef);
}
StaticLink.eventHandler = function(e) {
	var reqLink = e.target.getAttribute('linkRef');
	StaticLink.redirect(reqLink);
}
StaticLink.redirect = function(linkRef) {
	// TODO : improve script with external window feature
	if(!StaticLink.repository.get(linkRef)) return false;
	var reposResult = StaticLink.repository.get(linkRef);
	StaticLink.redirectDirect(reposResult);
}

StaticLink.redirectDirect = function(URLPath,target) {
	if(URLPath.charAt(0) == '#') {
		document.location.hash = URLPath.substr(1);
	} else {
		var baseURL = '';
		$$('base').each(function(element) {
			baseURL = element.readAttribute('href');
		},this);
		if(URLPath.indexOf('://')==-1) {
			URLPath=baseURL+URLPath;
		}
		target ? window.open(URLPath,target) : (document.location.href = URLPath);
	}
}

// E-MAIL HANDLING

var emptyString = /^\s*$/ ;
var proceed = 2;

function evalForm(formId,validationScript) {
	if ((validationScript == "") || eval(validationScript)) {
		document.getElementById(formId).submit();
	}
}

function commonCheck(valfield, required) {
	if (!document.getElementById)  return true; 
	if (emptyString.test(valfield.value)) {
		if (required) {
			setfocus(valfield);
			return false;
		}
		else {
			return true;  
		}
	}
	return proceed;
}

function validatePresent(valfield) {
  var stat = commonCheck(valfield, true);
  if (stat != proceed) return false;
  return true;
}
function validateEmail  (valfield, required) {
	var tfld = trim(valfield.value); 
	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
	if (!email.test(tfld)) {
		setfocus(valfield);
		return false;
	}
	var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
	return true;
}
function validateTelnr  (valfield, required) {
	var tfld = trim(valfield.value);  
	var telnr = /^\+?[0-9 ()-]+[0-9]$/  ;
	if (!telnr.test(tfld)) {
		setfocus(valfield);
		return false;
	}
	var numdigits = 0;
	for (var j=0; j<tfld.length; j++)
	if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;
	if (numdigits<6) {
		setfocus(valfield);
		return false;
	}
	return true;
}

function trim(str) { return str.replace(/^\s+|\s+$/g, ''); }

function setFocusDelayed() { global_valfield.focus(); }
function setfocus(valfield) {
	global_valfield = valfield;
	setTimeout('setFocusDelayed()',100);
}


/* DIVERSEN - form focus */

var currentlyActiveInputRef = false;
var currentlyActiveInputClassName = false;

function highlightActiveInput() {
  if(currentlyActiveInputRef) {
    currentlyActiveInputRef.className = currentlyActiveInputClassName;
  }
  currentlyActiveInputClassName = this.className;
  this.className = 'inputHighlighted';
  currentlyActiveInputRef = this;
}

function blurActiveInput() {
  this.className = currentlyActiveInputClassName;
}

function initInputHighlightScript() {
  var tags = ['INPUT','TEXTAREA'];
  for(tagCounter=0;tagCounter<tags.length;tagCounter++){
    var inputs = document.getElementsByTagName(tags[tagCounter]);
    for(var no=0;no<inputs.length;no++){
      if(inputs[no].className && inputs[no].className=='doNotHighlightThisInput')continue;
      if(inputs[no].tagName.toLowerCase()=='textarea' || (inputs[no].tagName.toLowerCase()=='input' && inputs[no].type.toLowerCase()=='text')){
        inputs[no].onfocus = highlightActiveInput;
        inputs[no].onblur = blurActiveInput;
      }
    }
  }
}

/***************************************************************
* SLIDESHOW
***************************************************************/
function Slideshow(slideshow, timeout) {
  this.slides = [];
  var nl = $(slideshow).getElementsByTagName('div');
  for (var i = 0; i < nl.length; i++) {
    if (Element.hasClassName(nl[i], 'slide')) {
      this.slides.push(nl[i]);
    }
  }
  this.timeout = timeout;
  this.current = 0;

  for (var i = 0; i < this.slides.length; i++) {
    this.slides[i].style.zIndex = this.slides.length - i;
  }

  Element.show(slideshow);
  setTimeout((function(){this.next();}).bind(this), this.timeout + 850);
}
Slideshow.prototype = {
  next: function() {
    for (var i = 0; i < this.slides.length; i++) {
      var slide = this.slides[(this.current + i) % this.slides.length];
      slide.style.zIndex = this.slides.length - i;
    }

    Effect.Fade(this.slides[this.current], {
      afterFinish: function(effect) {
        effect.element.style.zIndex = 0;
        Element.show(effect.element);
        Element.setOpacity(effect.element, 1);
      }
    });
    
    this.current = (this.current + 1) % this.slides.length;
    setTimeout((function(){this.next();}).bind(this), this.timeout + 850);
  }
}

/* ---------------------------------------------------------------- //
// CONFIRM                                                          //
// ---------------------------------------------------------------- */

function initiate_confirm(e){
	var elem = e.target;
	var confirmMessage = elem.getAttribute("confirmMessage").replace(/\\n/,"\n");
	if(!confirmMessage) return false;
	if(!confirm(confirmMessage)) {
		window.event? event.returnValue = false : e.preventDefault();
		return false;
	}
}


/* ---------------------------------------------------------------- //
// "POPUP"                                                          //
// ---------------------------------------------------------------- */

var flvLoaded = false;

function get_flvPlayer(player){
	// deze antieke manier omdat ome adobe vindt dat het zo moet
	var isIE = navigator.appName.indexOf("Microsoft") != -1;
	return (isIE) ? window[player] : document[player];
}

function popup_show(e) {
	elem = e.target;
	$('popup_name').innerHTML = elem.getAttribute('windowName');
	var targElem = elem.getAttribute('targPlayer') ? $(elem.getAttribute('targPlayer')) : $('popup_img');
	$$('.popup_targElem').each(function(elem){
		if(!elem.hasClassName('popup_toggle')) elem.toggleClassName('popup_toggle');
	});
	if($('popup_achtergrond').hasClassName('popup_toggle')) $('popup_achtergrond').toggleClassName('popup_toggle');
	if($('popup_content').hasClassName('popup_toggle')) $('popup_content').toggleClassName('popup_toggle');
	if(targElem.hasClassName('popup_toggle')) targElem.toggleClassName('popup_toggle');
	if(targElem == $('popup_flv')) {
		get_flvPlayer('popup_flv').playVideo(elem.getAttribute("srcValue"));
		//$('popup_flv').playVideo(elem.getAttribute("srcValue"));
	} else {
		targElem.src = elem.getAttribute("srcValue");
	}
};

function popup_hide() {
	$('popup_name').innerHTML = "";
	$('popup_img').src = "images/popup_loading.gif";
	if(flvLoaded) { get_flvPlayer('popup_flv').pauseResume(); } ;
	flvLoaded = true;
	if(!$('popup_achtergrond').hasClassName('popup_toggle')) { $('popup_achtergrond').toggleClassName('popup_toggle'); };
	if(!$('popup_content').hasClassName('popup_toggle')) { $('popup_content').toggleClassName('popup_toggle'); };

};

/***************************************************************
* DOM EVENT LISTNERS
***************************************************************/
document.observe('dom:loaded', function(event){
	if($('googleMaps')) { 
		gMapsObject.loadGoogleMaps();
	}
	StaticLink.initialize();
	$$('.openPopup').each(function(elem){elem.observe('click',popup_show)});
	$$('.closePopup').each(function(elem){elem.observe('click',popup_hide);});
	$$('.popup_targElem').each(function(elem){elem.observe('click',popup_hide);});
	$$('.confirmBox').each(function(elem){elem.observe('click',initiate_confirm)});
	$$('.slideshow').each(function(elem){new Slideshow(elem.id, 3000)});
	if($('popup_name')) { popup_hide(); } // dit mag aanvankelijk niet gehide zijn, want dan vertikt je browser de swf te downloaden
	initInputHighlightScript();
});