/*
 * declare global mdv namespace
 */
var mdv;

if (!mdv) {
    mdv = {};    
}

/*
    organize global functions
*/

// this object stores dynamic texts created during XSL transformation
// NOTE: make sure *this* file gets loaded before appending members 
mdv.dynText = {};

mdv.common = {
    counter : 0 
};

mdv.trip = {};

mdv.request = {
    form: null
};

mdv.its = {
    widthLeftColumn : 360,
    heightNavHeader : 70,
    containerPadding: 10,
    mapMinWidth : 480,
    mapMinHeight : 360,
    iconSrcRowOpen : 'iconRowOpened.gif',
    iconSrcRowClosed : 'iconRowClosed.gif',
    debug : false
};

/*
    request functions
*/
mdv.request.getNewField = function(name, value) {
    var elem = document.createElement('input');
    elem.type = 'hidden';
    elem.name = name;
    elem.id = name;
    elem.value = value || '';
    //append new input field...
    this.form.appendChild(elem);
    //...and return a reference
    return this.form[name];
};

mdv.request.getField = function(name) {
    // try to get input field by name or id, otherwise create one
    var field = this.form[name] || (document.getElementById(name) || this.getNewField(name)); 
    return field;
};

mdv.request.setField = function(name, value) {
//debugger;
    var field = this.getField(name); 
    field.value = (typeof value !== 'undefined') ? value : '';
};

mdv.request.getLPField = function(name) {
    var lpName = 'itdLPxx_' + name;
    return this.getField(lpName);
};

mdv.request.setLPField = function(name, value) {
    var lpName = 'itdLPxx_' + name;
    this.setField(lpName, value);
};

mdv.request.changeRequest = function() {
    this.setCommand('changeRequest');
    this.form.submit();
};

mdv.request.setCommand = function() {
    if (arguments.length > 0 && typeof arguments[0]==='string') {
        this.setField('command', arguments[0]);
    } else {
        //reset
        this.setField('command');
    }
};

mdv.request.isEmptyOdv = function(usage) {
    if (!usage) {
        return false;
    }
    var bool = (mdv.request.getField('placeState_' + usage).value === 'empty' && 
        mdv.request.getField('nameState_' + usage).value === 'empty' && 
        (mdv.request.getField('place_' + usage).value !== '' || 
        mdv.request.getField('name_' + usage).value !== ''));
    
    return bool;

    };
/*
    common functions
*/

mdv.common.createElem = function(tag, id, propObj) {
    var elem = document.createElement(tag);
    if (id) {
        elem.id = id;
    }
    if (propObj) {
        if (typeof propObj === 'object') {
            for(var prop in propObj) {
                elem[prop] = propObj[prop];
            }
        }
    }
    return elem;
}; 

mdv.common.openWindow = function(url, name, params) {
    if (!url) {
        return;
    }
    var nm = name || 'new';
    var prms = params || '';
    window.open(url, nm, prms);
};

mdv.common.css = function(a, o, c1, c2)
{
    switch (a)
    {
        case'swap':
            o.className =! this.css('check',o,c1) ? o.className.replace(c2,c1) : o.className.replace(c1,c2);
            break;

        case 'add':
            if (!this.css('check',o,c1)) {    o.className += o.className ? ' ' + c1 : c1;    }
            break;

        case 'remove':
            var rep = o.className.match(' ' + c1) ? ' ' + c1 : c1;
            o.className = o.className.replace(rep,'');
            break;

        case 'check':
            return new RegExp('\\b'+c1+'\\b').test(o.className);
    }
};

mdv.common.getInnerBrowser = function() {

	var windowHeight, windowWidth;
	
	// get overall screen dimensions
	if (self.innerHeight) {
		windowHeight = self.innerHeight;
		windowWidth = self.innerWidth;
	}
	else if (document.documentElement && document.documentElement.clientHeight) {
		windowHeight = document.documentElement.clientHeight;
		windowWidth = document.documentElement.clientWidth;
	}
	else if (document.body) {
		windowHeight = document.body.clientHeight;
		windowWidth = document.body.clientWidth;
	}

	return {
		width: windowWidth,
		height: windowHeight
	}
};

mdv.common.getStyle = function(el, styleProp) {
	var y;
	if (el.currentStyle) {
		y = el.currentStyle[styleProp];
    } else if (window.getComputedStyle) {
		y = document.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
    }
	return y;
};

mdv.common.createBlockDiv = function (zIndex) {

    var div = document.createElement('div');
    div.id = 'blockInputLayer';

    mdvLib.style([div], {
        position: 'absolute',
        left: 0,
        top: 0,
        zIndex: zIndex || 99,
        width: mdv.common.getInnerBrowser().width + 'px',
        height: mdv.common.getInnerBrowser().height + 'px',
        backgroundColor: '#000',
        opacity: 0.3,
        filter: 'alpha(opacity=30)',
        display: 'block'
    });

    document.body.appendChild(div);

};
    
mdv.common.undoBlockDiv = function() {
    var blockDiv = mdvLib.$('blockInputLayer');
    if (blockDiv) {
        mdv.common.toggleElem(blockDiv);
        document.body.removeChild(blockDiv);
    }
};


mdv.common.toggleElem = function(elem) {
    
    if (!elem) { 
        return;
    }
    elem.style.display = (mdv.common.getStyle(elem, 'display') !== 'none') ? 'none' : 'block';
};

mdv.common.swapImg = function(elem, s1, s2) {
    var src = elem.src;
    elem.src = (elem.src.indexOf(s2) > -1) ? src.replace(s2, s1) : src.replace(s1, s2);
};

mdv.common.getParentDivByClass = function(el, className) {
    
    var cnt = 1, elem = el;
    while (elem.nodeName.toUpperCase() !== 'DIV' && 
            !mdv.common.css('check', elem, className) && 
            cnt < 100) { //avoid endless recursion
        elem = elem.parentNode;
        cnt += 1;
    }
    return (elem !== el) ? elem : null;
};

mdv.common.getParentDivById = function(el, id) {
    var cnt = 1, elem = el;
    while (elem.nodeName.toUpperCase() !== 'DIV' && elem.id !== id  && cnt < 100) { //avoid endless recursion
        elem = elem.parentNode;
        cnt += 1;
    }
    return (elem !== el) ? elem : null;
};

// return IE Version or -1
mdv.common.getIEVersion = function() {
  
    var ua, re, rv = -1;

    if (navigator.appName == 'Microsoft Internet Explorer') {
        ua = navigator.userAgent;
        re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null) {
            rv = parseFloat(RegExp.$1);
        }
    }
    return rv;
};

mdv.its.init = function() {
    
    var mbc = mdvLib.$('mapButtonContainer');
    
    mdv.common.ieVersion = mdv.common.getIEVersion();
    
    mdv.its.setLeftColHeight(mdv.its.getAvailDimensions().height);
    mdv.its.setRightColDim();
    mdv.its.attachRowHandlers();
    
    if (mdv.its.debug === true) {
        mdv.its.showDebugInfo();
    }
    
    // request form to operate on
    mdv.request.form = document.forms.efaRequest || null;
    
    mdv.its.mapType = mdv.request.getLPField('mapType').value;
    
    if (!mdv.request.form || (mdv.request.form && mdv.request.getField('isRoutenplaner').value === '')) {
        if (mdvLib.$('its-koop')) {
            mdvLib.$('its-koop').onclick();
            mdvLib.$('its-anachb').onclick();
            
        }
    }
    
    if (typeof isItsInit === 'string' && isItsInit !== 'yes') {
        if (mdvLib.$('its-newsportlet')) {
            mdvLib.$('its-newsportlet').style.display = 'none';
        }
    
        if (mdvLib.$('its-koop')) {
            mdvLib.$('its-koop').onclick();
            mdvLib.$('its-anachb').onclick();
        }
    }
    
    if (mdv.common.ieVersion > -1) {
        mdv.its.triggerResize();
    }
    
    // we have no maps under NEWS and ABOUT-its, 
    // so add resize handler and quit here. 
    if (/(\/news|\/ueber\-its|\/ueber\-anachb.at|\/hilfe-|\/impressum|\/symposium)/.test(window.location.pathname)) {
        attachEventListener(window,	'resize', function() { 
                            mdv.its.setMapHeight();
                            mdv.its.setRightColDim();
                            mdv.its.setLeftColHeight(mdv.its.getAvailDimensions().height);
                        }, false);
        return;
    }
    
    if (mdvLib.$('popup')) {
       openAdvancedOption(mdvLib.$('popup'), true);
    }
    
    //if (mdvLib.$('advancedOptions_elevationProfile1')) {
    //   openAdvancedOption(mdvLib.$('advancedOptions_elevationProfile1'));
    //}
    
    if (typeof onLoadMapHandler === 'function') {
        onLoadMapHandler(mdv.its.mapType);
		setMapCentreAndZoomlevel();
    }
    
    mdv.its.setMapHeight();
    
    mdv.its.roundMapControlValues();
    
    if (mbc) {
        attachEventListener(mbc, 'mouseover', function() {toggleLabelSelection('true') }, false);
        attachEventListener(mbc, 'mousemove', function() {toggleLabelSelection('true') }, false);
        attachEventListener(mbc, 'mouseout', toggleLabelSelection, true);
        attachEventListener(mdvLib.$('satelliteLabelSelection'), 'mouseout', toggleLabelSelection, true);
    }
    
    attachEventListener(window,	'resize', function() { 
                            mdv.its.setMapHeight();
                            mdv.its.setRightColDim();
                            mdv.its.setLeftColHeight(mdv.its.getAvailDimensions().height);
                        }, false);
    
};

mdv.its.unload = function() {
    if (typeof onUnloadMapHandler === 'function') {
        onUnloadMapHandler();
    }
};

mdv.its.showDebugInfo = function() {
    
    var i, fdiv, str, debugDiv = mdvLib.$('mdvDebug');
    
    if (!debugDiv) {
        return;
    }
    debugDiv.style.height = (mdv.common.getInnerBrowser().height - 20) + 'px';
    debugDiv.style.zIndex = 5001;
    debugDiv.style.display = 'block';
    debugDiv.ondblclick = function() { mdv.common.toggleElem(this); };
    
    str = '<h1>form_action</h1>';
    fdiv = document.createElement('div');
    
    for (i=0; i<document.forms.length; i++) {
        str += document.forms[i].action + '<br/>'; 
    }
    fdiv.innerHTML = str;
    debugDiv.appendChild(fdiv);
};

mdv.its.attachRowHandlers = function() {
    // rely on jquery -- use jq instead of $ in PLONE !
    var i, itsBlocks = jq('.its-blockheader');
    
    for (i=0; i<itsBlocks.length; i++) {
        itsBlocks[i].onclick = mdv.its.toggleBlock;
        itsBlocks[i].style.cursor = 'pointer';
    }
};

mdv.its.toggleBlock = function() {
    
    var getNextDiv = function(el) {
                        var cnt = 1, elem = el;
                        while (elem.nodeName.toUpperCase() !== 'DIV' && cnt < 100) { //avoid endless recursion
                            elem = elem.nextSibling;
                            cnt += 1;
                        }
                        return elem;
                    };
    var blockHeaderImg = this.getElementsByTagName('img')[0];
    var followingDiv = getNextDiv(this.nextSibling);
    
    if (blockHeaderImg) {
        mdv.common.swapImg(blockHeaderImg, mdv.its.iconSrcRowOpen, mdv.its.iconSrcRowClosed);
    }
    if (followingDiv) {
        mdv.common.toggleElem(followingDiv);
    }
};

mdv.its.setLeftColHeight = function(avHeight) {
    
    var elem = mdvLib.$('its-left-scrollable');
    
    if (!elem) {
        return;
    }
    
    elem.style.height = avHeight + 'px';
    
};

mdv.its.setRightColDim = function() {
    
    var dim, offset, topNavDelta, itsContent, elem = mdvLib.$('content');
    
    offset = (/\/ueber\-its|\/ueber\-anachb.at/.test(window.location.pathname)) ? 100 : 0;
    // top nav runs in 3 rows with a resolution <= 930
    // so correct container height for non-map contents
    topNavDelta = (mdv.common.getInnerBrowser().width < 930) ? 26 : 0;
    
    //if (mdv.common.ieVersion === 6) {
    //    topNavDelta = (mdv.common.getInnerBrowser().width <= 1000) ? 50 : 0;
    //}
    dim = mdv.its.getAvailDimensions();
    
    mdvLib.$('its-right-outer-top').style.width = dim.width + 'px';
    
    if (!elem) {
        return;
    }
    // set width on cms container 'content',
    // or header and subnav in section 'ueber-its' won't scale correctly.
    elem.style.width = dim.width + 'px';
    
    itsContent = mdvLib.$('its-body');
    // if we're in section 'ueber-its' or 'news', make sure wallpaper
    // reaches down the page
    if (itsContent) {
        itsContent.style.height = ((dim.height - offset) - topNavDelta) + 'px';
    }
};



mdv.its.getAvailDimensions = function() {
    var windowHeight, windowWidth, availHeight, availWidth;
	
	windowHeight = mdv.common.getInnerBrowser().height;
	windowWidth = mdv.common.getInnerBrowser().width;
	
    availHeight = windowHeight - (mdv.its.heightNavHeader + 3 * mdv.its.containerPadding);
    
	if (availHeight < mdv.its.mapMinHeight) {
		availHeight = mdv.its.mapMinHeight;
	}
    
    availWidth = windowWidth - (mdv.its.widthLeftColumn + 2 * mdv.its.containerPadding);
    
	if (availWidth < mdv.its.mapMinWidth) {
		availWidth = mdv.its.mapMinWidth;
	}
    
    return { width: availWidth, height: availHeight}
}; 

mdv.its.setMapHeight = function() {

    if (typeof mdvMap === 'undefined') {
        return;
    }
    
    var availDim = mdv.its.getAvailDimensions();
    var heightDelta = (mdv.common.ieVersion > -1 && mdv.common.ieVersion < 7) ? 18 : 26;
    var availWidth = availDim.width;
    //console.log(availWidth);
    var availHeight = (availWidth > 595) ? availDim.height : availDim.height-heightDelta;
    
    if (mdvMap) {
  
        mdvMap.mdvMap.viewport.style.height = availHeight + 'px';
        mdvMap.mdvMap.viewport.style.width = availWidth + 'px';
        
        mdvMap.mdvMap.resize();
        
        if (mdvMap.mdvMiniMap) {
            mdvMap.mdvMiniMap.resize();
        }
        
        if (mdvMap.rectZoom) {
            //re-initialize rectZoom after resizing of viewport
            var tp = mdv.common.getInnerBrowser().height - (availHeight + this.containerPadding);
            mdvMap.rectZoom.oMapPos = { left: this.widthLeftColumn + this.containerPadding, top: tp };
            mdvMap.rectZoom._setDimensions();
        }
        
    }
    
    if (mdvLib.$('mapButtonContainer')) {
        mdvLib.style(['mapButtonContainer'], {
            position: 'absolute',
            zIndex: 60,
            top: '10px',
            right: '10px'
        });
    }
};

mdv.its.triggerResize = function() {
	setTimeout(function() {
        mdv.its.setLeftColHeight(mdv.its.getAvailDimensions().height);
        mdv.its.setRightColDim();
    }, 500);
}

mdv.its.toggleCyclingOptions = function(divId) {
    openAdvancedOption(divId);
};

mdv.its.submitAdressPoiForm = function() {
    
    var identifiedOdv = document.getElementById('nameX_origin').value + ':' 
                        + document.getElementById('nameY_origin').value + ':' 
                        + document.getElementById('nameMapName_origin').value + ':'
                        + document.getElementById('nameText_origin').value;
                        
    var bubbleDest = mdvLib.$('name_destination_bubble') && mdvLib.$('name_destination_bubble').value;
    
    mdv.request.setField('sessionID', 0);
    mdv.request.setField('anyObjFilter_origin', 0);
    mdv.request.setField('anyType_origin', '');
    mdv.request.setField('nameState_origin', 'empty');
    mdv.request.setLPField('currentPage', 'journeyPlanner');
    
    if (mdv.its.bubbleUsage === 'destination') {
        mdv.request.setField('name_origin', identifiedOdv);
        mdv.request.setField('type_origin', 'coord');
        mdv.request.setField('name_destination', bubbleDest);
        mdv.request.setField('type_destination', 'any');
    }
    if (mdv.its.bubbleUsage === 'origin') {
        mdv.request.setField('type_origin', 'any');
        mdv.request.setField('name_origin', bubbleDest);
        mdv.request.setField('name_destination', identifiedOdv);
        mdv.request.setField('type_destination', 'coord');
    }
    
    mdv.request.form.action = '\/routenplaner';
    
    mdv.request.form.submit();
    return false;
};

mdv.its.displayTrip = function() {
    
    var idx,
        sid = mdv.request.form['sessionID'].value,
        rid = mdv.request.form['requestID'].value;
    
    mdv.its.roundMapControlValues();
    
    // satellite map has name 'ortho', street map none
    if (mdvMap && typeof mdvMap.name === 'undefined') {
        toggleLabelSelection('false');
    }
    
    if (!sid || !rid) {
        return;
    }
    
    idx = /route_(\d+)/.exec(window.location.hash) && 
          /route_(\d+)/.exec(window.location.hash)[1];
    if (idx) {
        mdvMap.displayJourney(sid, rid, idx);
    }
}; 

// attachEventListeners -- rely on mdvLib
attachEventListener(window, 'load', mdv.its.init, false);
attachEventListener(window, 'unload', mdv.its.unload, false);
attachEventListener(window,	'resize', function() {
    if (mdvLib.$('blockInputLayer')) {
        mdvLib.style(['blockInputLayer'], {
            width: mdv.common.getInnerBrowser().width + 'px',
            height:  mdv.common.getInnerBrowser().height + 'px'
        });
    }
}, false);

mdv.its.roundMapControlValues = function() {
    
    var zlArr, i;
    
    function _round(img) {
        
        var tmp = img.title.split(':')[1],
            newScale = '1:' + (Math.round(tmp/100))*100;
        
        img.title = newScale;
        img.alt = newScale;
    }
    
    // get elements by class,
    // using Plone's $ alias of jquery
    zlArr = jq('.MDVMapControl_ZoomLevel');

    if (zlArr.length && zlArr.length > 0) {
        for (i=0; i < zlArr.length; i+=1) {
            // pass the img with the title tag
            _round(zlArr[i].firstChild);
        }
    }
};




