
//*** Singleton Class MCPaths
var MCPaths = {
	scriptPath: "http://api.movablecanvas.com/files/",
	imagePath: "http://api.movablecanvas.com/files/",
	customImagePath: "http://bluebay.movablecanvas.com/",
	apiPath: "http://api.movablecanvas.com/",
	canvasApiPath: "http://static.movablecanvas.com/"
}

//*** Singleton Class MCCommon
var MCCommon = {
	dependancyCount: 0,
	dependancyCounter: 0,
	dependancyCallback: null,
	intPid: 0,
	loadDependancies: function(arrDependancies, onload) {		
		if (typeof jQuery == "undefined") {        	
			MCCommon.getScript("http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");
			MCCommon.intPid = setTimeout(function(){ MCCommon.__loadDependancies(arrDependancies, onload); }, 100)
		} else {
			clearTimeout(MCCommon.intPid);
			MCCommon.__loadDependancies(arrDependancies, onload);
		}
	},
	__loadDependancies: function(arrDependancies, onload) {
		if (typeof jQuery == "undefined") {
			MCCommon.intPid = setTimeout(function(){ MCCommon.__loadDependancies(arrDependancies, onload); }, 100)
		} else {
			clearTimeout(MCCommon.intPid);
			
			//*** Load the dependancies.
			if (typeof arrDependancies != "object") arrDependancies = [arrDependancies];
			
			MCCommon.dependancyCount = arrDependancies.length;
			MCCommon.dependancyCounter = 0;
			MCCommon.dependancyCallback = onload;
			for (var i = 0; i < arrDependancies.length; i++) {
				if ($.browser.msie) {
					$.getScript(arrDependancies[i], function(){ MCCommon.__dependancyBackcall() });
				} else {
					MCCommon.getScript(arrDependancies[i]);
					MCCommon.__dependancyBackcall();
				}
			}
			if (arrDependancies.length == 0) {
				MCCommon.dependancyCounter--;
				MCCommon.__dependancyBackcall();
			}
		}
	},
	__dependancyBackcall: function() {
		MCCommon.dependancyCounter++;
				
		if (MCCommon.dependancyCounter == MCCommon.dependancyCount) {
			MCCommon.dependancyCallback();
		}
	},
	buildScriptInclude: function(strScript) {
		var objScript = document.createElement('script');
		objScript.type = 'text/javascript';
		objScript.src = strScript;
		
		return objScript;
	},
	parseOptions: function(baseOptions, options) {
		var objReturn = baseOptions;
		
		if (typeof options == "object") {
			for (option in baseOptions) {
				if (typeof options[option] != "undefined") objReturn[option] = options[option];
			}
		}
		
		return objReturn;
	},
	getScript: function(src) {
		document.write('<' + 'script src="' + src + '"' +' type="text/javascript"><' + '/script>');
	},
	getStyle: function(src) {
		var link = document.createElement("link");
		link.rel = "stylesheet";
		link.type = "text/css";
		link.href = src;
		$("head").append(link);
	},
	filterPNG: function(domObject, src, type) {
		domObject.style.backgroundImage = "";
		domObject.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, src='" + src + "', sizingMethod='" + type + "')";
	},
	generateUK: function() {
		return Math.floor(Math.random() * 10000000);
	},
	generateFileUri: function(strFile) {
		return MCPaths.customImagePath + "file/get/" + strFile;
	}
}

//*** Singleton Class MCCanvases
var MCCanvases = {
	dependancies: [],
	drawDependenancies: [],
	options: {},
	loaded: false,
    onLoad: function(){},
	loadQueue: [],
	clientKey: 0,
	displayMode: "interactive",
	canvases: [],
	events: [],
	init: function(clientKey) {	
		MCCanvases.clientKey = clientKey;		
		MCCanvases.__initGCanvases();
		MCCanvases.extendGmaps();
	},
	__initGCanvases: function() {
		//*** Load the GCanvases wrappers.
		var dependancies = (MCCanvases.displayMode == "draw") ? MCCanvases.dependancies.concat(MCCanvases.drawDependenancies) : MCCanvases.dependancies;
		MCCommon.loadDependancies(dependancies, function(){ MCCanvases.__initLoadCanvases() });
	},
	__initLoadCanvases: function() {
		$(function() {
			MCCanvases.loaded = true;
			
			for (var obj in MCCanvases.loadQueue) {
				MCCanvases.loadCanvas(
					MCCanvases.loadQueue[obj].canvasKey, 
					MCCanvases.loadQueue[obj].canvasElement, 
					MCCanvases.loadQueue[obj].initialZoom, 
					MCCanvases.loadQueue[obj].initialLat, 
					MCCanvases.loadQueue[obj].initialLng, 
					MCCanvases.loadQueue[obj].initialMinZoom, 
					MCCanvases.loadQueue[obj].initialMaxZoom, 
					MCCanvases.loadQueue[obj].onLoad
				);
			}

			MCCanvases.onLoad();
		});
	},
	extendGmaps: function() {
		//*** Add "getBounds" method to a Polygon.
		if (!google.maps.Polygon.prototype.getBounds) {
	        google.maps.Polygon.prototype.getBounds = function(latLng) {
                var bounds = new google.maps.LatLngBounds();
                var paths = this.getPaths();
                var path;
                
                for (var p = 0; p < paths.getLength(); p++) {
                    path = paths.getAt(p);
                    for (var i = 0; i < path.getLength(); i++) {
                            bounds.extend(path.getAt(i));
                    }
                }

                return bounds;
	        };
		}
	},
	loadCanvas: function(canvasKey, canvasElement) {
		var initialZoom = (MCCanvases.loadCanvas.arguments.length > 2) ? MCCanvases.loadCanvas.arguments[2] : null;
		var initialLat = (MCCanvases.loadCanvas.arguments.length > 3) ? MCCanvases.loadCanvas.arguments[3] : null;
		var initialLng = (MCCanvases.loadCanvas.arguments.length > 4) ? MCCanvases.loadCanvas.arguments[4] : null;
		var initialMinZoom = (MCCanvases.loadCanvas.arguments.length > 5) ? MCCanvases.loadCanvas.arguments[5] : null;
		var initialMaxZoom = (MCCanvases.loadCanvas.arguments.length > 6) ? MCCanvases.loadCanvas.arguments[6] : null;
		var onLoad = (MCCanvases.loadCanvas.arguments.length > 7) ? MCCanvases.loadCanvas.arguments[7] : null;
			
		if (MCCanvases.loaded) {
			var objCanvas = new MC_Canvas(canvasElement, {
				client: MCCanvases.clientKey,
				canvas: canvasKey,
				zoom: initialZoom,
				center: [initialLat, initialLng],
				minzoom: initialMinZoom,
				maxzoom: initialMaxZoom
			});
			MCCanvases.canvases[canvasKey] = objCanvas;
			
			if (onLoad) onLoad(objCanvas);
		} else {
			//*** Add to load queue.
			MCCanvases.loadQueue.push({canvasKey:canvasKey, canvasElement:canvasElement, initialZoom:initialZoom, initialLat:initialLat, initialLng:initialLng, initialMinZoom:initialMinZoom, initialMaxZoom:initialMaxZoom, onLoad:onLoad});
		}
	},
	getCanvasObject: function(canvasKey) {
		return MCCanvases.canvases[canvasKey];
	}
}

//*** Initialize the canvas.
MCCanvases.init("JMjcNJtZ52NQzlJazwXlUZ21VNo8OQSqw3tcDO1zHGg7TR7keXx0NtTB8aANSl3h");
