// GeoTags JavaScript Libraries $Revision: 1.16 $

var ns = (document.layers ? true : false);
var ie = (document.all ? true : false);
var navig = navigator.userAgent
var moz = (navig.indexOf("Gecko")>=0?true:false)
var nn6 = ((!document.all && document.getElementById) ? true:false)
var opera = (navig.indexOf("Opera")>=0?true:false)

var onChangeCollection = new Array(0) ;
var deferredActions = new Array(0) ;
var mapActionTypes = new Array(0) ;
var mapActionProperties = new Array(0) ;
var geoEvents = new Array(0) ;
//if (ie)
    window.onload=overloadFunc(window.onload, function() {for (var i in onChangeCollection) { for (var j in onChangeCollection[i]) { onChangeCollection[i][j](); } } });
    window.onload=overloadFunc(window.onload, evaluateDeferredActions);
//else
//    document.onload=overloadFunc(document.onload, function() {alert('onload');for (var i in onChangeCollection) { for (var j in onChangeCollection[i]) { onChangeCollection[i][j](); } } });


var sStatus="Up";
var iTop;
var boxStart;
var end;
var iLeft;
var iWidth = 0;
var iHeight = 0;

if (window.captureEvents)
{
	document.captureEvents(Event.MOUSEUP);
	document.captureEvents(Event.MOUSEDOWN);
	document.captureEvents(Event.MOUSEMOVE);
}

function getEvent(e)
{
    if (e) return e;
    else return window.event;
}

function getTarget(e)
{
    if (e.target) return e.target;
    else return e.srcElement;
}

function MouseDownProcessor(e, imgName)
{
    var formName = getMapActionProperties(imgName).target;
	var rightclick;
	if (!e) var e = window.event;
	if (e.which) rightclick = (e.which == 3);
	else if (e.button) rightclick = (e.button == 2);
	if (! rightclick)
	{
	    var form = document.getElementById(formName);
	    var actiontype = getMapActionType(formName);
	    if (actiontype == 'ZOOMBOX' || actiontype == 'SELECTBOX') {
	        if (sStatus == "Up" || sStatus=="") {
	            boxStart = getPos(e);
	            sStatus = "Down";
	        } else {

	        }
	    } else {
	        sStatus = "Up";
	    }

        var clickPos = getPos(e);
        var img = document.getElementById(imgName);


		form.x.value=clickPos.x - findPosX(img);
		form.y.value=clickPos.y - findPosY(img);
		form.width.value=0;
		form.height.value=0;
	}
	return false;
}

function MouseUpProcessor(e, imgName)
{
    var formName = getMapActionProperties(imgName).target;
	sStatus = "Up";
	if (getMapActionType(formName) != 'SELECTBOX' || getMapActionProperties(imgName).autosubmit) {
	    var form = document.getElementById(formName);
	    form.submit();
	}
    return true;
}

function MouseMoveProcessor(e, boxDivName, imgName, borderWidth)
{
    if (sStatus == "Down") {
        var formName = getMapActionProperties(imgName).target;
        var actiontype = getMapActionType(formName);
        if (actiontype == 'ZOOMBOX' || actiontype == 'SELECTBOX') {
		    var p = getPos(e);
			drawBox(boxStart, p, formName, boxDivName, imgName, borderWidth);
			return false;
	    }
	}

}

function updateCoordinatesProcessor(e, fieldId, coord, box, imgId)
{
	var rightclick;

	var theImage = document.getElementById(imgId);
	var pixelPos = getPos(e);

    var pos = toSrs(new Point(pixelPos.x-findPosX(theImage), pixelPos.y-findPosY(theImage)), box, imgId);

    var field = document.getElementById(fieldId);
    if (coord.toLowerCase() == 'x') field.value = pos.x;
    else field.value = pos.y;

	return false;
}

function drawBox(start,end, formName, boxDivName, imgName, borderWidth)
{
	var minx,miny,maxx,maxy;
    if (start.x <= end.x)
    {
        minx = start.x;
        maxx = end.x;
    }
    else
    {
        minx = end.x;
        maxx = start.x;
    }
    if (start.y <= end.y)
    {
        miny = start.y;
        maxy = end.y;
    }
    else
    {
        miny = end.y;
        maxy = start.y;
    }

    var bbox = document.getElementById(boxDivName);

    bbox.style.borderWidth=borderWidth;
    bbox.style.left=minx;
    bbox.style.top=miny;
    bbox.style.width=maxx - minx;
    bbox.style.height=maxy - miny;

    var image = document.getElementById(imgName);
    var form = document.getElementById(formName);

	form.x.value=minx-findPosX(image);
	form.y.value=miny-findPosY(image);
	form.width.value=maxx - minx;
	form.height.value=maxy - miny;

}

function drawBoxOnly(start,end, boxDivName, borderWidth)
{
	var minx,miny,maxx,maxy;
    if (start.x <= end.x)
    {
        minx = start.x;
        maxx = end.x;
    }
    else
    {
        minx = end.x;
        maxx = start.x;
    }
    if (start.y <= end.y)
    {
        miny = start.y;
        maxy = end.y;
    }
    else
    {
        miny = end.y;
        maxy = start.y;
    }

    var bbox = document.getElementById(boxDivName);

    bbox.style.borderWidth=borderWidth;
    bbox.style.left=minx;
    bbox.style.top=miny;
    bbox.style.width=maxx - minx;
    bbox.style.height=maxy - miny;

}

function Point(_x,_y)
{
    this.x = _x;
    this.y = _y;
}

function Box(_minx,_miny,_maxx,_maxy)
{
    this.minx = _minx;
    this.miny = _miny;
    this.maxx = _maxx;
    this.maxy = _maxy;
}

function getPos(e)
{
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY)
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		posx = e.clientX + document.body.scrollLeft;
		posy = e.clientY + document.body.scrollTop;
	}
    return new Point(posx,posy);
}

function getRelPos(e)
{
    if (ie) return new Point(e.offsetX, e.offsetY);
    else {
        var targ = getTarget(e);
        return new Point(e.pageX-targ.x, e.pageY-targ.y);
    }
}

function test(e)
{
    var e = getEvent(e);

    target = getTarget(e);
    alert("Target : "+target);

    if (e.x) alert("default : "+e.x+","+e.y);
    if (e.offsetX) alert("offset : "+e.offsetX+","+e.offsetY);
    if (e.layerX) alert("layer : "+e.layerX+","+e.layerY);
    if (e.pageX) alert("page : "+e.pageX+","+e.pageY);
    if (e.clientX) alert("client : "+e.clientX+","+e.clientY);

    if (target.x) alert("target def : "+target.x+","+target.y);
    if (target.offsetX) alert("target offset : "+target.offsetX+","+target.offsetY);
    alert("target : "+findPosX(target)+","+findPosY(target));

    var p = getRelPos(e);
    alert("RelPos : "+p.x+","+p.y);
}

function moveAbs(obj, x, y)
{

}

function newImage(arg) {
    if (document.images) {
        var rslt = new Image();
        rslt.src = arg;
        return rslt;
    }
}

function waitOn(imgId, imgSrc)
{
    var img = newImage(imgSrc);
    registerEventHandler(img, 'load', function() {document.getElementById(imgId).src=img.src;});
}

function registerEventHandler(obj, eventName, handler)
{
    if (ie) obj.attachEvent('on'+eventName, handler);
    else obj.addEventListener(eventName, handler,false);
}

function toSrs(pixelPoint, box, imgId)
{
    var image = document.getElementById(imgId);
    var width = image.width;
    var height = image.height;
    var x=signNumbers((box.maxx * pixelPoint.x + box.minx * (width - pixelPoint.x)) / width, 8);
    var y=signNumbers((box.maxy * (height - pixelPoint.y) + box.miny * pixelPoint.y) / height, 8);

    return new Point(x,y);
}

function signNumbers(value, n)
{
    var actualSignNumbers = Math.floor(Math.log(Math.abs(value))/Math.log(10));
    var factor = Math.pow(10, (n-actualSignNumbers));
    return Math.round(factor*(value))/factor;
}


function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x) {
		curleft += obj.x;
		}
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
		    //alert(obj+" offset="+obj.offsetTop+" total="+curtop);
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function registerHiddenOnChange(func, formName)
{
    var curHandlers = onChangeCollection[formName];
    if (curHandlers) {
        curHandlers[curHandlers.length] = func;
        }
    else {
        var handlers = new Array(0);
        handlers[0] = func;
        onChangeCollection[formName]=handlers;
    }
}

function doOnChange(formName)
{
    var handlers = onChangeCollection[formName];
    if (handlers) { for (var i in handlers) { handlers[i](); } }
}

function overloadFunc(oldfunc, newfunc)
{
    if (oldfunc) return function() {oldfunc(); newfunc();};
    else return newfunc;
}

function setMapActionType(formname, mapid, actiontype)
{
    var form = document.getElementById(formname);
    if (form.navAction) form.navAction.value=actiontype;
    mapActionTypes[formname] = actiontype;
    if (mapActionProperties[mapid]) mapActionProperties[mapid].target = formname;
    else mapActionProperties[mapid] = new MapActionProperties(formname, false);
}

function MapActionProperties(targetform, autosubmit)
{
    this.target = targetform;
    this.autosubmit = autosubmit;
}

function getMapActionType(formname)
{
    var form = document.getElementById(formname);
    if (!mapActionTypes[formname] && form.navAction) return form.navAction.value;
    else return mapActionTypes[formname];
}

function getMapActionProperties(mapid)
{
    if (mapActionProperties[mapid]) return mapActionProperties[mapid];
    else new MapActionProperties(null, false);
}

function tryOrDefer(objName, func)
{
    if (document.getElementById(objName)) {
        func(document.getElementById(objName));
    } else {
        addDeferredAction(objName, func);
    }
}

function addDeferredAction(objName, func)
{
    deferredActions[deferredActions.length] = new DeferredAction(objName, func);

}

function DeferredAction(_name, _func)
{
    this.name = _name;
    this.func = _func;
}

function evaluateDeferredActions()
{
    for (var i in deferredActions) {
        deferredActions[i].func(document.getElementById(deferredActions[i].name))
    }
}

function postEvents(url,target)
{
    var form1 = document.createElement("form");
    form1.method = "post";
    form1.action = url;
    if (target) {form1.target = target;}
    form1.setAttribute("style", "display: none;");

    var field;
    for (i=0;i<geoEvents.length;i++) {
        var event = geoEvents[i];
        if (event.tagName && event.tagName == "FORM") {
            for (var j=0;j < event.elements.length;j++) {
                field = document.createElement("input");
                field.name = i+"."+event.elements[j].name;
                field.type = "hidden";
                field.value = event.elements[j].value;
                form1.appendChild(field);
            }
        } else {
            for (var paramName in event) {
                field = document.createElement("input");
                field.name = i+"."+paramName;
                field.value = event[paramName];
                field.type = "hidden";
                form1.appendChild(field);
            }
        }
    }

    document.getElementsByTagName("body")[0].appendChild(form1);

    //alert(document.getElementsByTagName('body')[0].innerHTML);

    form1.submit();
}

function addEvent(event)
{
    geoEvents[geoEvents.length] = event;
}
