var alertx_show = true;
// debug function to avoid infinite Alert loops
function alertx(text) {
	if (alertx_show) {
	    alertx_show = confirm(text);
	}
	return alertx_show;
}


/** 
 *	Querystring object
 *	Client-side access to querystring name=value pairs 
 *	Version 1.2.3 
 *	22 Jun 2005 
 *	Adam Vandenberg 
 **/ 
function Querystring(qs) { // optionally pass a querystring to parse 
	this.params = new Object() 
	this.get=Querystring_get 
	 
	if (qs == null) 
		qs=location.search.substring(1,location.search.length) 
 
	if (qs.length == 0) return 
 
// Turn <plus> back to <space> 
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1 
	qs = qs.replace(/\+/g, ' ') 
	var args = qs.split('&') // parse out name/value pairs separated via & 
	 
// split out each name=value pair 
	for (var i=0;i<args.length;i++) { 
		var value; 
		var pair = args[i].split('=') 
		var name = unescape(pair[0]) 
 
		if (pair.length == 2) 
			value = unescape(pair[1]) 
		else 
			value = name 
		 
		this.params[name] = value 
	} 
} 
 
function Querystring_get(key, default_) { 
	// This silly looking line changes UNDEFINED to NULL 
	if (default_ == null) default_ = null; 
	 
	var value=this.params[key] 
	if (value==null) value=default_; 
	 
	return value 
} 


/**
 *	cross-browser event registering/unregistering functions
 *  and
 *  screenSize()
 *	from http://www.quirksmode.org/
 **/
function addEventSimple(obj,evt,fn) {
	return addEventSimpleEx(obj,evt,fn, false);
}

function addEventSimpleEx(obj,evt,fn,dir) {
	if ( obj.attachEvent) {
		obj.attachEvent('on'+evt,fn);
	} else if (obj.addEventListener) {
		obj.addEventListener(evt, fn, dir);
	}
}

function removeEventSimple(obj,evt,fn) {
	return removeEventSimpleEx(obj,evt,fn, false);
}

function removeEventSimpleEx(obj,evt,fn, dir) {
	if (obj.removeEventListener)
		obj.removeEventListener(evt,fn,dir);
	else if (obj.detachEvent)
		obj.detachEvent('on'+evt,fn);
}

function screenSize() {
	var x,y;
	if (self.innerHeight) // all except Explorer
	{
		x = self.innerWidth;
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight)
		// Explorer 6 Strict Mode
	{
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}
	return [x,y];
}

/**
 *
 *  KPE is the main page object
 *
 **/
var KPE = {};

KPE.init = function () {
	// init sidebar fieldsets
	var fsets = document.getElementById('sidebar').getElementsByTagName('fieldset');
	for (var c = fsets.length - 1; c >= 0; c--) {
	    KPE.addToggle(fsets[c]);
	    if (fsets[c].id == 'fs_snippets') {
	        fsets[c].firstChild.appendChild(KPE.makeDOMLink("KPE.reloadSnippets()",'(reload)'));
	    }
	}
	if (typeof (GUnload) == 'undefined') { 	// Google Maps script not loaded - no point in continuing.
		var e = document.getElementById('scriptsloading');
		if (e != null) {
		    e.className = 'error';
			e.innerHTML = 'Error loading map script.<br />If you are using any script blockers, make sure you are not blocking google.com';
			e['id'] = '';
			e.parentNode.style['backgroundImage'] = 'none';
		}
		return false;
	} else { // Google's script loaded
		// register unload handler
		addEventSimple(window,'unload', GUnload);
		// tweak the log window on first display
		KPE.startCaptureGLog();
		// fit map to window size
		KPE.resizeMap();
		// start map loading
		KPE.mapSetup('map');
	}
};

KPE.mapSetup = function (map_id) {
	var mapID = document.getElementById(map_id);
	if (mapID != null) { // map exists, init
		KPE.map = new GMap2(mapID);
		map = KPE.map; // snippets assume global var map
		if (!KPE.loadMapState(true)) {
			KPE.center = new GLatLng( 50.084683518129665, 14.421100616455078 );
			KPE.map.setCenter(KPE.center, 14);
		}
		
		GEvent.addListener(KPE.map, "move", KPE.onMapMove);
		KPE.onMapMove();
	  	// add controls
		KPE.showMapControls();
		
	}
}

KPE.scriptsReady = function (id) {
	var id_handle = document.getElementById(id);
	if (id_handle != null) {
	    id_handle.parentNode.removeChild(id_handle);
	}
}

KPE.startCaptureGLog = function() { // capture the first message, change window properties (overflows my screen otherwise)
	if (KPE.GLid == null) {
		KPE.GLogWrite = GLog.write;
		
		GLog.write = function (message, color) {
			KPE.GLogWrite(message,color);
			var b = document.getElementsByTagName('body');
			KPE.GLid = b[0].lastChild;
			var ssx = ((screenSize()[0]) - 40);
			KPE.GLid.style.width = (ssx+2) + 'px';
			KPE.GLid['id'] = 'KPE_GLog';
			var lwd = KPE.GLid.getElementsByTagName('div');
			for (var c = lwd.length - 1; c >= 0; c--) {
				lwd[c]['id'] = 'KPE_GLog' + c;
				if (lwd[c].style.width == '80em') {
					lwd[c].style.width = ssx + 'px';
					KPE.GLid.resizedId = lwd[c];
					KPE.GLid.resizedId.oldHeight = lwd[c].style.height;
					if (!KPE.isLarge) {
						lwd[c].style.height = '9ex';
					}
				} else if (lwd[c].style.width == '1042px') {
					lwd[c].style.width = (ssx + 2) + 'px';
				}
			}
			var g2r = document.getElementById('gl2_resize');
			if (g2r == null) {
				var gl2 = document.getElementById('KPE_GLog2');
				var cl2 = gl2.lastChild.cloneNode(false);
				cl2.id = 'gl2_resize';
				cl2.onclick = function() {
					KPE.GLid.resizedId.style.height = KPE.GLid.resizedId.oldHeight;
					return false;
				}
				var sep = gl2.lastChild.previousSibling.cloneNode(false);
				cl2.appendChild(document.createTextNode('Resize'));
				gl2.insertBefore(cl2, gl2.lastChild);
				gl2.insertBefore(sep, gl2.lastChild);
			}
			window.setTimeout(KPE.endCaptureGLog,1); // better do this async, so the function doesn't redefine itself on the run
		}
	}
}

KPE.endCaptureGLog = function () { // we have what we came for, release the poor function
	GLog.write = KPE.GLogWrite;
}

KPE.addToggle = function (fset) {
	var leg = fset.firstChild;
    if (leg != null && leg.tagName.toLowerCase() == 'legend') {
		//*
		var toggle = document.createElement('input');
		toggle.type = 'checkbox';
		toggle.checked = (fset.className.indexOf('closed') == -1);
		/*/
		var toggle = document.createElement('img');
        toggle.src = (fset.className.indexOf('closed') == -1 ? KPE.minus : KPE.plus);
        //*/
        leg.insertBefore(document.createTextNode(' '),leg.firstChild);
        leg.insertBefore(toggle,leg.firstChild);
        addEventSimple(toggle,'click',function() {KPE.toggleFS(this)});
    }
}

KPE.loadSnippet = function(name) {
	KPE.loadScript('snippets/' + name + '.js');
}

KPE.reloadSnippets = function () {
	KPE.loadScript('liveJS.php?a=reloadSnippets');
}

KPE.setData = function (id,content) {
	var i = document.getElementById(id);
	if (i != null) {
	    i.innerHTML = content;
	}
}
KPE.toggleFS = function (img, toState) {
	var which = img.parentNode.parentNode;
	if (toState == null) {
		if (which.className.indexOf('closed') == -1) {
		    toState = false;
		    //img.src = KPE.plus;
		} else {
		    toState = true;
		    //img.src = KPE.minus;
		}
	}
	
    if (toState == false) {
    	which.className += ' closed';
    } else {
	    which.className = which.className.replace(/ ?closed/g,'');
    }
    if (img.checked != toState) {
    	img.checked = toState;
	}
}

KPE.openAllFS = function(state) {
	var fs = document.getElementById('sidebar').getElementsByTagName('fieldset');
	for (var c = fs.length - 1; c >=0; c--) {
	    KPE.toggleFS(fs[c].firstChild.firstChild, state);
	}
}

KPE.toggleMapControls = function (state) { // sets controls on or off
	if (typeof(state) == 'undefined') { // invoked as tmc()
		if (KPE.mapControlsVisible != true) {
			KPE.showMapControls();
		} else {
			KPE.hideMapControls();
		}
	} else { // invoked as tmc(something)
		if (state == false) {
			KPE.hideMapControls();
		} else {
			KPE.showMapControls();
		}
	}
}

KPE.showMapControls = function () {	// initializes controls and adds them to the map
	if (KPE.mapControlsVisible != true && KPE.map != null) {
		if (KPE.scaleCtl == null) {
			KPE.scaleCtl = new GScaleControl();
		}
		KPE.map.addControl(KPE.scaleCtl)//, new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,20)));
		// There's a display bug when removing and re-adding this control. Harmless yet ugly.
		//if (KPE.mapCtl == null) {
			//KPE.mapCtl = new GSmallMapControl();
			KPE.mapCtl = new GLargeMapControl();
		//}
		KPE.map.addControl(KPE.mapCtl)//, new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10)));
		if (KPE.maptypeCtl == null) {
			KPE.maptypeCtl = new GMapTypeControl();
		}
		KPE.map.addControl(KPE.maptypeCtl)//, new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10,10)));
		KPE.mapControlsVisible = true;
	GLog.write('Default controls added.');
	}
	KPE.setCheckbox('defctls',KPE.mapControlsVisible);
	return KPE.mapControlsVisible;
}

KPE.hideMapControls = function () { // removes controls from the map
	if (KPE.mapControlsVisible == true) {
		if (KPE.scaleCtl != null) {
			KPE.map.removeControl(KPE.scaleCtl);
		}
		if (KPE.mapCtl != null) {
			KPE.map.removeControl(KPE.mapCtl);
		}
		if (KPE.maptypeCtl != null) {
			KPE.map.removeControl(KPE.maptypeCtl);
		}
		KPE.mapControlsVisible = false;
		GLog.write('Default controls removed.');
	}
	KPE.setCheckbox('defctls',KPE.mapControlsVisible);
	return KPE.mapControlsVisible;
}

KPE.resizeMap = function () {
	var map_div = document.getElementById('map');
	if (map_div != null) {
		var screensize = screenSize();
		if (1 || screensize[1] < 600) {
		    screensize[1] -= 50;
		    //screensize[1] -= 100;
			KPE.isLarge = false;
		} else {
		    screensize[1] -= 180;
			KPE.isLarge = true;
		}
		map_div.style.height = (screensize[1]) + 'px';
	}

	if (KPE.map != null) {
		var ctr = KPE.map.getCenter();
		KPE.map.checkResize();
		KPE.map.setCenter(ctr);
	}
}

KPE.loadScript = function(script_src) {
	if (KPE.map) {
		script_src2 = script_src + ((script_src.indexOf('?') == -1) ? '?' : '&') + 'rgb=' + (Math.random()).toString().substring(2);
		GLog.writeHtml('Loading <a href="' +script_src2 + '">' + script_src + '</a>');
		var h = document.getElementsByTagName('head')[0]; // assuming page is not headless
		var scr = document.createElement('script');
		scr.setAttribute('type','text/javascript');
		scr.setAttribute('src',script_src2);
		h.appendChild(scr);
	}
}

KPE.setCheckbox = function (id, state) {
	var dom_id = document.getElementsByName(id);
	for (var c = dom_id.length - 1; c >= 0; c--) { // loop thru
		dom_id[c]['checked'] = state;
	}
}

KPE.makeGPointMarker = function (gll, opts) {
	if (opts == null) {
		opts = {clickable:false,draggable:false};
	}
	var m = new GMarker(gll,opts);
	KPE.map.addOverlay(m);
	return m.getLatLng();
}

KPE.randomPos = function (onscreen) {
	var bounds = KPE.map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var lngSpan = northEast.lng() - southWest.lng();
	var latSpan = northEast.lat() - southWest.lat();
	return new GLatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random());
}

KPE.randomColor = function () {
	var colors = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f'];
	var color = '#';
	for (i=0;i<6;i++){
		color += colors[Math.round(Math.random()*14)];
	}
	return color;
}

KPE.loadMapState = function(startup) { // loads data
	var ck = document.cookie.replace(/; /g,'&');
	var qs = new Querystring(ck);
	if (qs.get('mapLat')) {
	    var mtypeUrl = qs.get('mapType');
	    var mts = map.getMapTypes();
	    var mtype = null;
		for (var c = mts.length -1; c >= 0; c--) {
			if (mts[c].getUrlArg() == mtypeUrl) {
				mtype = mts[c];
				break;
			}
		}
		// for some reason, mapZoom must be type-cast to a number
		KPE.center = new GLatLng(qs.get('mapLat'),qs.get('mapLng'));
		KPE.map.setCenter(KPE.center,(+qs.get('mapZoom')),mtype);
		GLog.write('Map state loaded from cookie. lat: ' + qs.get('mapLat') + ' , lng: ' + qs.get('mapLng') + ' , zoom: ' + qs.get('mapZoom') + ' , type: ' + mtypeUrl);
		return true; // success
	} else if (!startup) {
		GLog.write('No map state to load.');
	}
	return false;
}
KPE.saveMapState = function() { // saves center and zoom
	document.cookie = 'mapLat=' + KPE.map.getCenter().lat();
	document.cookie = 'mapLng=' + KPE.map.getCenter().lng();
	document.cookie = 'mapZoom=' + KPE.map.getZoom();
	document.cookie = 'mapType=' + KPE.map.getCurrentMapType().getUrlArg();
	GLog.write('Map state saved into cookie.');
}

KPE.createElementINX = function (id,tagname,idname) { // create an element
	var out;
	if (id == null) {
	    id = document;
	}
	
	if (tagname == null && idname != null) {
	} else if (tagname != null && idname != null) {
		var i = id.getElementsByTagName(tagname);
		if (i.length > 0) {
		    if (idname == null) {
				out = i[0];
			} else {
			    for (var c = i.length - 1; c >=0; c--) {
			        if (i[c].id == idname) {
			            out = i[c];
			            break;
			        }
			    }
			}
		}
	}
	
	if (out == null) {
	    if (tagname == null) {
	        tagname = 'span';
	    }
	    out = document.createElement(tagname);
	    if (idname != null) {
	    	out.id = idname;
		}
	}
	return id.appendChild(out);
}

KPE.newFieldSet = KPE.newFieldset;

KPE.newFieldset = function(id,legend, hidden) {
	if (legend == null) {
	    legend = 'Snippet area';
	}
	if (id == null) {
	    id = 'fs_' + document.getElementsByTagName('fieldset').length;
	}
	var idd = document.getElementById(id);
	if (idd == null) {
		var fs = document.createElement('fieldset');
		fs.id = id;
		if (hidden == true) {
		    fs.className = 'closed';
		}
		var leg = document.createElement('legend');
		fs.appendChild(leg);
		leg.appendChild(document.createTextNode(legend));
		var d = document.createElement('div');
		d.id = id + '_d';
		fs.appendChild(d);
		KPE.addToggle(fs);
		document.getElementById('sidebar').appendChild(fs);
	}
	return id;
}

KPE.onMapMove = function() {
	if (KPE.clatID == null) {
	    KPE.clatID = document.getElementById('c_lat');
	}
	if (KPE.clngID == null) {
	    KPE.clngID = document.getElementById('c_lng');
	}
	if (KPE.czoomID == null) {
	    KPE.czoomID = document.getElementById('c_zoom');
	}
	KPE.clatID.innerHTML = KPE.map.getCenter().lat();
	KPE.clngID.innerHTML = KPE.map.getCenter().lng();
	KPE.czoomID.innerHTML = KPE.map.getZoom();
}

KPE.makeDOMLink = function (href,content) {
	var a = document.createElement('a');
	a.href = '#error';
	a.setAttribute('onclick', (href + ';return false'));
	a.appendChild(document.createTextNode(content));
	return a;
}

KPE.makeLink = function (href,content) {
	var a = '<a href="#error" onclick="' + href + ';return false">' + content + '</a>';
	return a;
}

KPE.plus = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2AEMFDMwjJL82gAAABN0RVh0Q29tbWVudABwaXNrdm9yLm9yZ6N4QIwAAAB0SURBVHjalZLREYAgDEPzOJdgD9ZwWtdgD8eIP%2FauInpHvkoaEo4W3bB96AfALkmEGPjTy7aAnRAHYbsPzi1ryhh51ydwznpbiuwfT%2Blh8riQyfFsuwZXtIhtiK9fzq8EoAFt8v8PvswGZ7tm99xbH9zqalx0700iR7AXLwAAAABJRU5ErkJggg%3D%3D';

KPE.minus = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABmJLR0QA%2FwD%2FAP%2BgvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2AEPEgUG3AwragAAABN0RVh0Q29tbWVudABwaXNrdm9yLm9yZ6N4QIwAAABxSURBVHjalZLdEYAwCIPz9VzCPVyj07qGezhGfBEPOX%2BuecpBIFCKTthe9QGgSxIhBr70si2gE%2BII2K6dlTWtWoYoO%2BbclCy3bF85sN8KcvBh%2Fjl40yCmt06%2FBcCSnk%2BVS1pvI%2BXD2a6LX7nxw41%2BjQNe8U15mRGm7gAAAABJRU5ErkJggg%3D%3D';

KPE.makeRectangle = function (gll1,gll2) {
	GLog.write('corner1: ' + gll1.lat() + ' , ' + gll1.lng() + ' ; corner2: ' + gll2.lat() + ' , ' + gll2.lng());
	return [gll1,new GLatLng(gll2.lat(),gll1.lng()),gll2,new GLatLng(gll1.lat(),gll2.lng()),gll1];
}

KPE.addStyle = function (text) {
	var h = document.getElementsByTagName('head')[0];
	var s = document.createElement('style');
	s.appendChild(document.createTextNode(text));
	h.appendChild(s);
}

var map; // snippets might assume global 'map' variable
addEventSimple(window,'load',KPE.init);

