﻿var _gameName = "";
var _gameDescription = "";

function $(ctrlID) {
  var ctrl = document.getElementById(ctrlID);
  if (!ctrl) alert("Error: Unable to locate element: " + ctrlID);
  return ctrl;
}

var _events = {"addEventListener" : function(element, eventName, eventHandler, scope) {
  var scopedEventHandler = scope ? function(e) { eventHandler.apply(scope, [e]); } : eventHandler;
  if (element.addEventListener)
    element.addEventListener(eventName, scopedEventHandler, false);
  else if (element.attachEvent)
    element.attachEvent("on"+eventName, scopedEventHandler);
  return scopedEventHandler;
  }
}

//***Cross browser attach event function. For 'evt' pass a string value with the leading "on" omitted
//***e.g. AttachEvent(window,'load',MyFunctionNameWithoutParenthesis);
function AttachEvent(obj, evt, fnc){
	if (obj.addEventListener){
		obj.addEventListener(evt, fnc, false);
		return true;
	} else if (obj.attachEvent) return obj.attachEvent("on"+evt, fnc);
} 

function DetachEvent(obj, evt, fnc) {
  if (obj.removeEventListener) {
    obj.removeEventListener(evt, fnc, false);
    return true;
  }
  else if (obj.detachEvent) return obj.detachEvent("on"+evt, fnc);
  return false;
}

var _intervals = {"addInterval" : function(eventHandler, ticks, scope) {
  var scopedEventHandler = scope ? function(e) { eventHandler.apply(scope, [e]); } : eventHandler;
  return setInterval(scopedEventHandler, ticks);
  }
}

function ClassExists(obj, name) {
  if (typeof obj == 'undefined' || obj == null || !RegExp) return false;
  var re = new RegExp("(^|\\s)" + name + "(\\s|$)");
  if (typeof(obj) == "string") return re.test(obj);
  else if (typeof(obj) == "object" && obj.className) return re.test(obj.className);
  return false;
}
function ClassAdd(ctrl, name) {
	if (!ClassExists(ctrl,name)) {
	  if ("" == ctrl.className) ctrl.className = name;
    else ctrl.className += " " + name;
	}
}
function ClassRemove(ctrl, name) {
	var rep = ctrl.className.match(" " + name) ? " " + name : name;
	ctrl.className = ctrl.className.replace(rep, "");
}

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(elt /*, from*/) {
    var len = this.length;
    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from) : Math.floor(from);
    if (from < 0) from += len;
    for (; from < len; from++) {
      if (from in this && this[from] === elt)
        return from;
    }
    return -1;
  };
}

if (!Array.prototype.contains) {
  Array.prototype.contains = function(obj) {
    var i, len = this.length;
    for (var i = 0; i < len; i++) {
      if (this[i] === obj) return true;
    }
    return false;
  };
}

/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/	
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

function GetUrlParam(name) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if (!results) return "";
  else return results[1];
}

function replaceTextNode(ctrlParent, value) {
  var ctrl;
  ctrl = ctrlParent.childNodes[0];
  while ( ctrl && (3 != ctrl.nodeType) ) ctrl = ctrl.nextSibling;
  if (ctrl) ctrl.nodeValue = value;
  ctrl = null;
}

function cookieEnabled() {
  if (typeof window.navigator.cookieEnabled == "undefined") {
    document.cookie = "testcookie=val";
    return (document.cookie.indexOf("testcookie=") != -1);
  } else {
    return window.navigator.cookieEnabled;
  }
}

function cookieCreate(name, value, days) {
  var cookie_string = name + "=" + escape(value);
  if (days) {
    date = new Date();
    date.setTime(date.getTime() + (days*24*60*60*1000));
    cookie_string += "; expires=" + date.toGMTString();
  }
  cookie_string += "; path=/";
  document.cookie = cookie_string;
}

function cookieRead(name) {
  var results = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
  if (results)
    return (unescape(results[2]));
  else
    return null;
}

function cookieErase(name) {
	cookieCreate(name, "", -1);
}
function setOpacity(ctrl, opacity) {
  opacity = (opacity == 100) ? 99.999 : opacity;
  ctrl.style.filter = "alpha(opacity:"+opacity+")";  // IE/Win
  ctrl.style.KHTMLOpacity = opacity/100;             // Safari<1.2, Konqueror
  ctrl.style.MozOpacity = opacity/100;               // Older Mozilla and Firefox
  ctrl.style.opacity = opacity/100;                  // Safari 1.2, newer Firefox and Mozilla, CSS3
}

function GetEventCtrl(e) {
  var ctrl;
  if (!e) e = window.event;
  ctrl = e.target || e.srcElement;
  if (ctrl.nodeType == 3) ctrl = ctrl.parentNode;     // defeat Safari bug
  return ctrl;
}
function GetXmlDoc(fileName) {
  var xmlDoc;
  try {
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  }
  catch(e) {
    try {
      xmlDoc = document.implementation.createDocument("", "", null);
    }
    catch(e) {
      alert(e.message);
      return null;
    }
  }
  xmlDoc.async = false;
  xmlDoc.load(fileName);
  return xmlDoc;
}

if (!Object.prototype.clone) {
  Object.prototype.clone = function () {
    function F() {}
    F.prototype = this;
    return new F();
  };
}

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(elt /*, from*/) {
    var len = this.length;
    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from) : Math.floor(from);
    if (from < 0) from += len;
    for (; from < len; from++) {
      if (from in this && this[from] === elt)
        return from;
    }
    return -1;
  };
}

Array.prototype.size = function () {
  var l = this.length ? --this.length : -1;
  for (var k in this) {l++;}
  return l;
}

/*****************************************************************************/

function gameNav_Load(gameID, setID, ctrlID) {
  HttpSend("get", "Ajax.asmx/LoadNav", "gameID=" + (gameID ? gameID : 1) + "&setID=" + (setID ? setID : 0), null, ctrlID);
}

function gameNav_Game(e) {
  var ctrl, ctrl2, display;
  ctrl = GetEventCtrl(e);
  ctrl2 = ctrl.parentNode.nextSibling;
  display = "none";
  if ("none" == ctrl2.style.display) display = "block";
  while (ctrl2) {
    ctrl2.style.display = display;
    ctrl2 = ctrl2.nextSibling;
  }
  ctrl = ctrl2 = null;
}

function gameNav_Set(e) {
  var ctrl, ctrl2, display;
  ctrl = GetEventCtrl(e);
  ctrl2 = ctrl.parentNode.nextSibling.firstChild;
  display = "none";
  if ("none" == ctrl2.style.display) display = "block";
  while (ctrl2) {
    ctrl2.style.display = display;
    ctrl2 = ctrl2.nextSibling;
  }
  ctrl = ctrl2 = null;
}

function gameNav_Level(e) {
  var ctrl, levelID, setID, gameID;
  ctrl = GetEventCtrl(e);
  levelID = ctrl.id;
  if ((8 < levelID.length) && ("mdsLevel" == levelID.substr(0, 8))) {
    levelID = parseInt(levelID.substr(8));
    ctrl = ctrl.parentNode.parentNode.parentNode.firstChild.firstChild;
    setID = ctrl.id;
    if ((6 < setID.length) && ("mdsSet" == setID.substr(0, 6))) {
      setID = parseInt(setID.substr(6));
      ctrl = ctrl.parentNode.parentNode.parentNode.firstChild.firstChild;
      gameID = ctrl.id;
      if ((7 < gameID.length) && ("mdsGame" == gameID.substr(0, 7))) {
        gameID = parseInt(gameID.substr(7));
      }
    }
  }
  var intWidth = 720;
  var intHeight = 460;
  var intLeft = (screen.width-intWidth)/2;
  var intTop = (screen.height-(intHeight+10))/2; 
  function winFocus() {
    var win;
    try {
      win = window.open("game.html?game=" + gameID + "&setID=" + setID + "&levelID=" + levelID, "", "width="+intWidth+",height="+intHeight+",left="+intLeft+",Top="+intTop+",toolbar=0,menubar=0,location=0,scrollbars=0,resizable=yes");
      if (win && win.focus) win.focus();
    }
    catch(e) {
    }
  }
  setTimeout(winFocus, 100);
  ctrl = null;
}

/*****************************************************************************/

function LoadJsFile(fileName){
  Dbg_ConsoleLine("Loading: " + fileName);
  var ctrl = document.createElement("script");
  ctrl.setAttribute("src", fileName);
  ctrl.setAttribute("type", "text/javascript");
  document.getElementsByTagName("head")[0].appendChild(ctrl);
  ctrl = null;
}

var _fileCnt = 0, _loadFileHdlr = new Array();
function LoadedFile() {
  --_fileCnt;
  if ( (0 >= _fileCnt) && _loadFileHdlr) {
    _loadFileHdlr.pop()();
  }
}
function LoadJsFiles(files, hdlr) {
  _loadFileHdlr.push(hdlr);
  if ("string" === typeof(games)) {
    _fileCnt = 1;
    LoadJsFile(files);
  }
  else {
    var i;
    _fileCnt = files.length;
    for (i = 0; i < files.length; ++i) {
      LoadJsFile(files[i]);
    }
  }
}

function LoadCssFile(fileName){
  Dbg_ConsoleLine("Loading: " + fileName);
  var ctrl = document.createElement("link");
  ctrl.setAttribute("rel", "stylesheet");
  ctrl.setAttribute("type", "text/css");
  ctrl.setAttribute("href", filename);
  document.getElementsByTagName("head")[0].appendChild(ctrl);
  ctrl = null;
}

var _gameCtrlID;
function LoadGame(gameID, setID, ctrl) {
  _gameCtrlID = ctrl.id;
  HttpSend("get", "Ajax.asmx/LoadGame", "gameID=" + (gameID ? gameID : 1) + "&setID=" + (setID ? setID : 0), LoadGame_Result);
}
function LoadGame_Result(strText) {
  if ("E" != strText.substr(0, 1)) eval(strText);
  else $("lblError").innerHTML = strText;
}

function StartBOP() {
  _game = new BOP($(_gameCtrlID));
  _game.xmlFileName = "BOP/Levels/_TestSet.xml";
  _game.ctrlParent.appendChild(_game.generate());
}

/*function StartBOP() {
  mdsFrame = new Frame(_desktop);
  _desktop.add(mdsFrame);
  mdsFrame.position(_desktop.width / 4, _desktop.height / 4);
  mdsFrame.size(_desktop.width / 2, _desktop.height / 2);
  mdsFrame.contents = _game = new BOP(mdsFrame.ctrlInner);
  mdsFrame.contents.xmlFileName = _game.xmlFileName = "BOP/Levels/_TestSet.xml";
  _game.ctrlParent.appendChild(_game.generate());
}*/

/*****************************************************************************/

var _Popovers = new Array();

function ShowPopover(ctrlID) {
  var ctrl, width, height;
  ctrl = document.getElementById("divPopover" + (_Popovers.length + 1));
  if (!ctrl) {
    ctrl = document.createElement("div");
    ctrl.id = "divPopover" + (_Popovers.length + 1);
    ctrl.style.position = "absolute";
    ctrl.style.left = "0px";
    ctrl.style.top = "0px";

    if(typeof("number") == window.innerWidth) {
      width = window.innerWidth;
      height = window.innerHeight;
    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
      width = document.documentElement.clientWidth;
      height = document.documentElement.clientHeight;
    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
      width = document.body.clientWidth;
      height = document.body.clientHeight;
    }
    ctrl.style.width = width + "px";
    ctrl.style.height = height + "px";;
    ctrl.style.overflow = "hidden";
    ctrl.style.backgroundColor = "#000";
    ctrl.style.zIndex = 10000 + (_Popovers.length * 2);
    document.body.appendChild(ctrl);
    setOpacity(ctrl, 50);
  }
  ctrl.style.display = "block";
  if (ctrl = $(ctrlID)) {
    _Popovers.push(ctrlID);
    ctrl.style.zIndex = 10001 + (_Popovers.length * 2);
    ctrl.style.display = "block";
  }
  ctrl = null;
}

function HidePopover(ctrlID) {
  var ctrl, ctrl2;
  if ( (0 < _Popovers.length) && (_Popovers.contains(ctrlID)) &&
       (ctrl = $("divPopover" + _Popovers.length)) && (ctrl2 = $(ctrlID)) ) {
    ctrl.style.display = "none";
    ctrl2.style.display = "none";
    _Popovers.pop();
  }
  ctrl = null;
  ctrl2 = null;
}

/*****************************************************************************/

var StopWatch = function(ctrl) {
  this.ctrl = ctrl;
  this.startTime = null;
  this.stopTime = null;
  if (this.ctrl) this.ctrl.innerHTML = "00:00";
}

StopWatch.prototype.start = function() {
  var day = new Date();
  this.startTime = day.getTime();
  this.stopTime = null;
}

StopWatch.prototype.stop = function() {
  if (!this.startTime) return;
  var day = new Date();
  this.stopTime = day.getTime();
}

StopWatch.prototype.duration = function() {
  if (!this.startTime) return null;
  if (!this.stopTime) {
    var day = new Date();
    return day.getTime() - this.startTime;
  }
  else {
    return this.stopTime - this.startTime;
  }
}

StopWatch.prototype.toString = function(msec) {
  var result = "";
  var time = new Date();
  time.setTime(msec);
  var hr = time.getHours();
  var min = time.getMinutes();
  var sec = time.getSeconds();
  msec = (Math.round(time.getMilliseconds() * 0.1));

  if (0 < hr) result = ((hr < 10) ? " " : "") + hr + ":";
  if ( (0 < hr) || (0 < min) ) result += ((min < 10) ? "0" : "") + min + ":";
  result += ((sec < 10) ? "0" : "") + sec + ":";
  result += ((msec < 10) ? "0" : "") + msec;
  return result;
}

StopWatch.prototype.display = function(msec) {
  if (this.ctrl) {
    this.ctrl.innerHTML = this.toString(msec);
  }
}

/*****************************************************************************/

var Animate = AnimateNew;
function AnimateNew(ctrl, hdlr) {
  this.ctrl = ctrl;
  this.hdlr = hdlr;
  this.interval = 250;
  this.timer = null;
}

Animate.prototype.tick = AnimateTick;
function AnimateTick() {
  if (this.hdlr) this.hdlr(this);
}

Animate.prototype.start = AnimateStart;
function AnimateStart() {
  if (this.timer) clearInterval(this.timer);
  this.timer = _intervals.addInterval(this.tick, this.interval, this);
}

Animate.prototype.stop = AnimateStop;
function AnimateStop() {
  if (this.timer) clearInterval(this.timer);
  this.timer = null;
}

function animRandomColor(anim) {
  if (!anim.ctrl) return;
  if (!anim.tickCount) {
    anim.r1 = Math.floor(Math.random() * 256);
    anim.g1 = Math.floor(Math.random() * 256);
    anim.b1 = Math.floor(Math.random() * 256);
    anim.r2 = Math.floor(Math.random() * 256);
    anim.g2 = Math.floor(Math.random() * 256);
    anim.b2 = Math.floor(Math.random() * 256);
    anim.tickCount = 0;
    if (!anim.tickRollOver) {
      anim.tickRollOver = 8;
      anim.tickRollOverInverse = 0.125;
    }
  }
  if (anim.tickCount >= anim.tickRollOver) {
    anim.tickCount = 0;
    anim.r1 = anim.r2;
    anim.g1 = anim.g2;
    anim.b1 = anim.b2;
    anim.r2 = Math.floor(Math.random() * 256);
    anim.g2 = Math.floor(Math.random() * 256);
    anim.b2 = Math.floor(Math.random() * 256);
  }
  var r, g, b;
  r = Math.floor(anim.r1 + (anim.r2 - anim.r1) * anim.tickCount * anim.tickRollOverInverse);
  g = Math.floor(anim.g1 + (anim.g2 - anim.g1) * anim.tickCount * anim.tickRollOverInverse);
  b = Math.floor(anim.b1 + (anim.b2 - anim.b1) * anim.tickCount * anim.tickRollOverInverse);
  var color = "#" + DecimalToHex(r, 2) + DecimalToHex(g, 2) + DecimalToHex(b, 2);
  anim.ctrl.style.color = color;
  ++anim.tickCount;
}

function DecimalToHex(d, padding) {
  if (d < 0) d = 0xFFFFFFFF + d + 1;
  d = d.toString(16).toUpperCase();
  while (d.length < padding) d = "0" + d;
  return d;
}

/*****************************************************************************/

function OpenCloseWidth(e) {
  var ctrl;
  ctrl = GetEventCtrl(e);
  ctrl = ctrl.parentNode;
  ctrl.style.width = "4%";
  ctrl = $("divGame");
  ctrl.style.right = "4%";
  _game.onResize(e);
}

/*****************************************************************************/
