var ofm_loaded = false;
var ofm_interval = 0;
var ofm_shape = "landscape";
var ofm_resolutions = new Array();
var ofm_default_resolution = '';
var ofm_layers = new Array();
var ofm_map_layer = '';
var ofm_prices;
var ofm_first_search = false;
var cart_resolution = '';
var cart_price = 0;
var view_name_suggest = '';
var view_name_timeout = 0;
var frame_loaded = false;
var resolutions_loaded = false;
var image_credits = [{message:"(c) Aerodata International Surveys", hyperlink:"http://www.aerodata-surveys.com"}];
var map_credits = [{message:"(c) FALK", hyperlink:"http://www.navteq.nl"}];

dojo.addOnLoad(setFrame);

//frame
function setFrame()
{
    var args = new Array();
    args['url'] = '?action=price_get&type=resolutions';
    args['handleAs'] = "json";
    args['timeout'] = 10000;
    args['load'] = function(response, ioArgs) {
		ofm_prices = response;
		frame_loaded = true;
    };
    dojo.xhrGet(args);
}

//timeout

function checkOfmTimeOut()
{
    if (document.ofm.getClientState() == 'timeout') location.href = 'index.php';
}

//ofm
var so = new SWFObject("orbit_flash/OrbitFlashMap_modern.swf", "ofm", "410", "410", "8", "#F0F8FC");
so.addParam("scale", "noscale");
so.addParam("wmode", "transparent");
so.addVariable("CONFIG", "?action=ofm_xml_config");
so.addVariable("UICONFIG", "?action=ofm_xml_uiconfig");
so.addVariable("MESSAGES", "?action=ofm_xml_messages");
so.addVariable("SKIP_FIRST_VIEW", true);
so.addVariable("LOAD_JS_GATEWAY", "true");
so.useExpressInstall('orbit_flash/expressinstall.swf');

this.publicInterfaceLoaded = function()
{
    var ofm = document.getElementById("ofm");
    ofm.setKeepAlive(800); // session timeout default is 900 seconds
    ofm.addEventListener("loadedNewView", "newViewHandler");
    ofm.addEventListener("activeModeChanged", "newModeHandler");
    this.newViewHandler = function() {
		ofmSetZoomBar();
        ofmShape(ofm_shape);
    };
    this.newModeHandler = function(mode) {ofmSetModeButtons(mode);};
	ofm_layers = ofm.getLayers();
    ofm_loaded = true;
	
}

function ofmStatus()
{
    ofm_interval = setInterval('ofmLoaded()', 100);
}

function ofmLoaded()
{
    if (ofm_loaded && frame_loaded && resolutions_loaded) {
        clearInterval(ofm_interval);
		setInterval('checkOfmTimeOut()', 60000);
        ofmSetPanButtons();
        ofmFadeIn();
        if (get_query['step'] == 'search') {
			ofmSearch(get_query);
			ofm_first_search = true;
	    }
        else if (get_query['step'] == 'view') ofmLoadView(get_query['vid'], get_query['name']);
		else document.ofm.loadNewView();
    }
}

this.resolutionsLoaded = function()
{
    resolutions_loaded = true;
}

function ofmFadeIn()
{
    fadeIn("ofm_viewing_options");
    if (dojo.byId("ofm_tabs")) fadeIn("ofm_tabs");
    fadeIn("ofm_output_container");
    dojo.query("a", "ofm_pan").forEach(
        function (pan_link) {if (pan_link.id) fadeIn(pan_link.id);}
    );
}

//mode buttons

function ofmMode(mode)
{
    document.ofm.setActiveMode(mode);
}

function ofmSetModeButtons(mode)
{
	var buttons = new Array("pan", "zoomin", "zoomout");
	dojo.forEach(buttons, function(button) {
		var style = "default";
		if (button == mode) style = "active";
		dojo.byId("ofm_mode_" + button).className = style;
	});
}

//zoom functions

function ofmZoom(scale)
{
    var button_total = 11;
    if (scale == 'in' || scale == 'out') {
        var scale_pos = Math.round(document.ofm.getScaleRangePosition() * button_total);
        scale = (scale == 'in') ? scale_pos - 1 : scale_pos + 1;
    }
    document.ofm.setScaleRangePosition(scale / button_total);
}

function ofmSetZoomBar()
{
    var button_total = 11;
	var scale = document.ofm.getScaleRangePosition();
    var scale_pos = Math.round(scale * button_total);
    dojo.query(".slider", "ofm_zoom_slider").forEach(
        function (node) {node.className = (node.getAttribute('title') == scale_pos) ? "slider active" : "slider default";}
    );
}

//tab functions

function ofmSetTab(type)
{
    if (type == 'image') {
        document.ofm.CRD_setCredits(image_credits);
 		dojo.byId('ofm_tab_image').className = "tab_active";
		dojo.byId('ofm_tab_map').className = "tab_default";
		document.ofm.setLayers(ofm_layers);
        document.ofm.loadNewView();
	}
    else if (type == 'map') {
        document.ofm.CRD_setCredits(map_credits);
		dojo.byId('ofm_tab_image').className = "tab_default";
		dojo.byId('ofm_tab_map').className = "tab_active";
		document.ofm.setLayers(ofm_map_layer);
        document.ofm.loadNewView();
	}
}

//pan functions

function ofmSetPanButtons()
{
    var ofm_flash = dojo.byId('ofm');
    var ofm_width = dojo.style(ofm_flash, "width");
    var ofm_height = dojo.style(ofm_flash, "height");
    //upleft
    dojo.style("ofm_pul", "left", "0px");
    dojo.style("ofm_pul", "top", "0px");
    dojo.style("ofm_pul", "width", "15px");
    dojo.style("ofm_pul", "height", "15px");
    //up
    dojo.style("ofm_pu", "left", "15px");
    dojo.style("ofm_pu", "top", "0px");
    dojo.style("ofm_pu", "width", (ofm_width + 15) + "px");
    dojo.style("ofm_pu", "height", "15px");
    //upright
    dojo.style("ofm_pur", "left", (ofm_width + 15) + "px");
    dojo.style("ofm_pur", "top", "0px");
    dojo.style("ofm_pur", "width", "15px");
    dojo.style("ofm_pur", "height", "15px");
    //left
    dojo.style("ofm_pl", "left", "0px");
    dojo.style("ofm_pl", "top", "15px");
    dojo.style("ofm_pl", "width", "15px");
    dojo.style("ofm_pl", "height", ofm_height + "px");
    dojo.style("ofm_pl", "lineHeight", ofm_height + "px");
    //right
    dojo.style("ofm_pr", "left", (ofm_width + 15) + "px");
    dojo.style("ofm_pr", "top", "15px");
    dojo.style("ofm_pr", "width", "15px");
    dojo.style("ofm_pr", "height", ofm_height + "px");
    //downleft
    dojo.style("ofm_pdl", "left", "0px");
    dojo.style("ofm_pdl", "top", (ofm_height + 15) + "px");
    dojo.style("ofm_pdl", "width", "15px");
    dojo.style("ofm_pdl", "height", "15px");
    //down
    dojo.style("ofm_pd", "left", "15px");
    dojo.style("ofm_pd", "top", (ofm_height + 15) + "px");
    dojo.style("ofm_pd", "width", ofm_width + "px");
    dojo.style("ofm_pd", "height", "15px");
    //downright
    dojo.style("ofm_pdr", "left", (ofm_width + 15) + "px");
    dojo.style("ofm_pdr", "top", (ofm_height + 15) + "px");
    dojo.style("ofm_pdr", "width", "15px");
    dojo.style("ofm_pdr", "height", "15px");
    //buttons
    dojo.style("ofm_pbu", "left", ((ofm_width -20) / 2) + "px");
    dojo.style("ofm_pbu", "top", "2px");
    dojo.style("ofm_pbl", "left", "2px");
    dojo.style("ofm_pbl", "top", ((ofm_height -10) / 2) + "px");
    dojo.style("ofm_pbr", "left", "3px");
    dojo.style("ofm_pbr", "top", ((ofm_height -10) / 2) + "px");
    dojo.style("ofm_pbd", "left", ((ofm_width -20) / 2) + "px");
    dojo.style("ofm_pbd", "top", "3px");
}

//shape functions

function ofmShape(shape)
{
    document.ofm.VF_setPageLayout((shape == 'square') ? 'rectangle' : shape);
    ofm_shape = shape;
    ofmSetShapeButtons();
	ofmSetResolutions();
}

function ofmSetShapeButtons()
{
    var lnds_btt = dojo.byId("ofm_shape_landscape");
    var prtr_btt = dojo.byId("ofm_shape_portrait");
    if (dojo.byId("ofm_shape_square")) var sqr_btt = dojo.byId("ofm_shape_square");
    if (ofm_shape == "landscape") {
        lnds_btt.className = "ofm_shape_landscape_active";
        prtr_btt.className = "ofm_shape_portrait_default";
        if (sqr_btt) sqr_btt.className = "ofm_shape_square_default";
    }
    else if (ofm_shape == "portrait") {
        lnds_btt.className = "ofm_shape_landscape_default";
        prtr_btt.className = "ofm_shape_portrait_active";
        if (sqr_btt) sqr_btt.className = "ofm_shape_square_default";
    }
    else if (ofm_shape == "square") {
        lnds_btt.className = "ofm_shape_landscape_default";
        prtr_btt.className = "ofm_shape_portrait_default";
        if (sqr_btt) sqr_btt.className = "ofm_shape_square_active";
    }
}

//resolution functions

function ofmSetResolutions()
{
    var site_resolutions = new Array();
	dojo.forEach(ofm_resolutions[ofm_shape], function(res) {site_resolutions[site_resolutions.length] = res['res'];});
	var orbit_resolutions = document.ofm.RI_getAvailableResolutions(site_resolutions, document.ofm.VF_getViewWidth());
    var dropdown = dijit.byId("ofm_resolution");
	var button = dijit.byId("shopping_cart_add");
	//alert('cool');
	if (orbit_resolutions.length == 0) {
		//alert('cool aa');
        dojo.byId("ofm_view_price").innerHTML = 0;
        dropdown.setLabel(ofm_resolutions['nores']);
        dropdown.setDisabled(true);
		button.setDisabled(true);
		cart_resolution = '';
	}
	else {
        dropdown.setDisabled(false);
		button.setDisabled(false);
		var menu = dijit.byId("ofm_resolution_menu");
		var items = menu.getChildren();
	    var resolution_available = false;
		dojo.forEach(items, function (item) {
 			var menu_ref = item.id.substring(item.id.lastIndexOf('_') + 1);
			var disabled = true;
            dojo.forEach(orbit_resolutions, function (orbit_res) {
				orbit_ref = ofmResolutionReference(orbit_res);
			    if (menu_ref == orbit_ref) disabled = false;
		    });
	        item.setDisabled(disabled);
			if (cart_resolution == menu_ref && !disabled) resolution_available = true;
        });
		if (cart_resolution == '' || !resolution_available) {
			var def_res = false;
            dojo.forEach(orbit_resolutions, function (orbit_res) {
				if (ofm_default_resolution == ofmResolutionReference(orbit_res)) def_res = true;
		    });
			cart_resolution = (def_res) ? ofm_default_resolution : ofmResolutionReference(orbit_resolutions[0]);
	    }
        ofmSetResolution(cart_resolution);
    }
}

function ofmResolutionReference(resolution)
{
	var width = resolution['width'];
	var height = resolution['height'];
	var ref = '';
	dojo.forEach(ofm_resolutions[ofm_shape], function(res) {
		if (res['res']['width'] == width && res['res']['height'] == height) ref = res['ref'];
    });
	return ref;
}

function ofmSetResolution(resolution)
{
	var label = '';
	dojo.forEach(ofm_resolutions[ofm_shape], function(res) {if(res['ref'] == resolution) label = res['label'];});
    dijit.byId("ofm_resolution").setLabel(label);
    dojo.byId("ofm_resolution").blur();
    cart_resolution = resolution;
    cart_price = parseFloat(ofm_prices[resolution]);
    dojo.byId("ofm_view_price").innerHTML = cart_price.toFixed(2);
    if (cartListener.id != 0) cartListener.edit();
}

//view functions

function ofmLoadView(id, name)
{
	view_name_suggest = name;
    var args = new Array();
    args['url'] = '?action=view_get&vid=' + id;
    args['handleAs'] = "json";
    args['timeout'] = 10000;
    args['load'] = function(response, ioArgs) {document.ofm.zoomToBoundingBox(response);};
    dojo.xhrGet(args);
}

//search functions

//search

function ofmSearch(searchObject)
{
    document.ofm.GC_getLatLng("lookup", searchObject, "ofmSearchHandler");
}

/**
* Asynchronous handler for geocoding requests.
* @param id Identifier of the original request.
* @param statuscode The status code of the result.
* @param detail A detailed error message.
* @param coordinate The coordinate, if the lookup was succesful.
*/

function ofmSearchHandler(id, statuscode, detail, coordinate, searchObject)
{
	if (id == "lookup") {
		if (document.ofm.GC_isFound(statuscode)) {
			if (searchObject['StreetName'] && (statuscode > 104 || statuscode < 102)) setSearchError();
			else {
				var message = '';
				if (searchObject['StreetName']) {
					message += searchObject['StreetName'];
					view_name_suggest = searchObject['StreetName'];
				}
				if (searchObject['HouseNumber'] && statuscode == 102) {message += " " + searchObject['HouseNumber'];}
				if (searchObject['StreetName'] || searchObject['HouseNumber']) message += " / "
				if (searchObject['PostalCode']) {
					message += searchObject['PostalCode'];
					view_name_suggest = searchObject['PostalCode'];
				}
				if (searchObject['AreaName']) {
					message += searchObject['AreaName'];
					if (!searchObject['StreetName']) view_name_suggest = searchObject['AreaName'];
				}
				if (site_name == 'France') ofmCheckCoverage(coordinate.x, coordinate.y);
				else document.ofm.zoomToLocation({x:coordinate.x, y:coordinate.y}, 1/2800);
			}
		}
		else setSearchError();
	}
}

function ofmCheckCoverage(x, y)
{
    var args = {};
    args['url'] = '?action=ofm_json_coverage&x=' + x + '&y=' + y;
    args['handleAs'] = "json";
    args['timeout'] = 10000;
    args['load'] = function(response, ioArgs) {
        if (response.valid == true) document.ofm.zoomToLocation({x:x, y:y}, 1/2800);
        else document.ofm.NOT_setMessage(ofm_flash_no_coverage);
    };
    //args['error'] = function(response, ioArgs) {flashBoxOpen(response);};
    dojo.xhrGet(args);
}

function setSearchError()
{
    if (ofm_first_search) {
	    ofm_first_search = false;
		document.ofm.loadNewView();
	}
	var html = "";
	document.ofm.NOT_setMessage(ofm_flash_no_result);
    searchError('search_error_no_result');
}

function ofmFullMap()
{
    if (site_name == 'France') document.ofm.zoomToBoundingBox({minX:49036,minY:1674832,maxX:1075001,maxY:2700797});
	else document.ofm.VF_zoomToExtent();
}

//cart functions

function cartAdd()
{
	dojo.byId('cart_throbber').style.display = 'block';
	var url = "step=add&name=" + view_name_suggest + cartGetUrlValues();
	cartXhrGet(url);
}

function cartEdit(cid)
{
	dojo.byId('cart_throbber').style.display = 'block';
	cartListener.id = cid;
	cartView(cid);
}

function cartRemove(cid)
{
	dojo.byId('cart_throbber').style.display = 'block';
	cartXhrGet('step=remove&cid=' + cid);
}

function cartList(cid)
{
	dojo.byId('cart_throbber').style.display = 'block';
	cartXhrGet();
}

function cartCheckOut()
{
    var url = "?action=cart_checkout";
    location.href(url);
}

function cartStoreValues(cid)
{
    clearTimeout(view_name_timeout);
	dojo.byId('cart_throbber').style.display = 'block';
    var url = "step=store&cid=" + cid + cartGetUrlValues();
	if (dojo.byId('cart_view_name_' + cid)) url += "&name=" + dojo.byId('cart_view_name_' + cid).value;
	cartXhrGet(url);
}

function viewNameListener(cid)
{
    dojo.connect(dojo.byId('cart_view_name_' + cid), 'onkeypress', function (event) {
		if (event.target.id.substr(0, 15) == 'cart_view_name_') {
			cid = event.target.id.substr(15);
    	    clearTimeout(view_name_timeout);
        	view_name_timeout = setTimeout('cartList()', 15000);
            if (event.keyCode == dojo.keys.ENTER) cartStoreValues(cid);
	    }
    });
}

var cartListener = {
    id: 0,
    edit: function() {
		var cid = this.id;
		this.id = 0;
        cartXhrGet('step=edit&cid=' + cid);
    }
};

function cartGetUrlValues()
{
	var bounds = document.ofm.getViewBoundingBox();
	var layers = document.ofm.getVisibleLayers();
	var view = document.ofm.VF_getSystemBounds();
	var resolution = new Array();
    dojo.forEach(ofm_resolutions[ofm_shape], function(res) {if(res['ref'] == cart_resolution) resolution = res['res'];});
	resolution = resolution['width'] + "x" + resolution['height'];
    url = "&bbox=" + dojo.toJson(bounds, false);
    url += "&view=" + dojo.toJson(view, false);
	url += "&layers=" + layers;
	url += "&resolution=" + resolution + "&resolution_reference=" + cart_resolution + "&price=" + cart_price;
	url += "&shape=" + ofm_shape;
	return url;
}

function cartXhrGet(url)
{
    var args = new Array();
    args['url'] = '?action=cart_list&' + url;
    args['handleAs'] = "text";
    args['timeout'] = 10000;
    args['load'] = function(response, ioArgs) {
        dojo.byId("shopping_container").innerHTML = response;
        dojo.parser.parse(dojo.byId("shopping_container"));
 		dojo.query("input", "shopping_cart").forEach(function(element) {
            cid = element.id.substr(15);
            view_name_timeout = setTimeout('cartList()', 60000);
            viewNameListener(cid);
		});
    };
    //args['error'] = function(response, ioArgs) {flashBoxOpen(response);};
    dojo.xhrGet(args);
}

function cartView(cid)
{
    var args = new Array();
    args['url'] = "?action=cart_json&cid=" + cid;
    args['handleAs'] = "json";
    args['timeout'] = 10000;
    args['load'] = function(response, ioArgs) {
        setViewOptions(response);
    };
    //args['error'] = function(response, ioArgs) {flashBoxOpen(response);};
    dojo.xhrGet(args);
}

function setViewOptions(view)
{
    ofm_shape = view["shape"];
	var res = view["resolution"].split('x');
	cart_resolution = ofmResolutionReference({width:res[0], height: res[1]});
    document.ofm.zoomToBoundingBox(view["bbox"]);
}

function cartSendDownload(key, email)
{
    var args = new Array();
    args['url'] = '?action=cart_send_download&cart_key=' + key + '&email=' + email;
    alert(args['url']);
    args['handleAs'] = "text";
    args['timeout'] = 10000;
    args['load'] = function(response, ioArgs) {
        if (response == "success") dojo.byId("cart_send_download_success").style.display = "block";
        else dojo.byId("cart_send_download_error").style.display = "block";
    };
    args['error'] = function(response, ioArgs) {dojo.byId("cart_send_download_error").style.display = "block";};
    dojo.xhrGet(args);
}

//dojo fx functions

function fadeIn(actNode)
{
    actNode = dojo.byId(actNode);
    dojo.fadeIn({
        node: actNode,
        duration: 2000,
        beforeBegin: function() {
            dojo.style(actNode, "opacity", 0);
            dojo.style(actNode, "display", "block");
        }
    }).play();
}

