/**********************************************************/
/* CORE METABASE JAVASCRIPT FUNCTIONS                     */
/*                                                        */
/* METABASE JAVASCRIPT (c) 2009 Vincent E. Milum Jr.      */
/**********************************************************/



//A BASIC FUNCTION TO SEE IF A GIVEN VARIABLE NAME HAS BEEN USED OR NOT
if ((typeof isset) == "undefined") {
  function isset(varname){
    return (typeof(window[varname]) != 'undefined');
  }
}



//SET SOME DEFAULT VARIABLES, IF THEY ARE NOT ALREADY DEFINED (THESE ARE AUTO-DEFINED BY METABASE ELSEWHERE)
if (!isset('urlroot')) urlroot = '';
if (!isset('urlbase')) urlbase = '';
if (!isset('urlfull')) urlfull = '';



//PROPERLY ESCAPING TEXT SO THAT WAY IT CAN BE PASSED BACK TO THE SERVER IN A SAFE WAY
if ((typeof uriescape) == "undefined") {
  uriescape = (encodeURIComponent) ? (encodeURIComponent) : (escape);
}



//ADD SUPPORT FOR INNERTEXT PROPERTY TO BROWSERS THAT DO NOT SUPPORT IT (SUCH AS MOZILLA/FIREFOX)
try {
  if ( ((typeof HTMLElement) != "undefined")  &&  ((typeof HTMLElement.prototype.__defineGetter__) != "undefined") ) {
    HTMLElement.prototype.__defineGetter__("innerText", function () {
      var r = this.ownerDocument.createRange();
      r.selectNodeContents(this);
      return r.toString();
    }); 
    HTMLElement.prototype.__defineSetter__("innerText", function (str) {
      this.innerHTML = str.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/\n/g, "<br />\n");
    });
  }
} catch(err) {}



//ADD ABILITY TO HAVE THE FUNCTION 'INCLUDE', SO THAT WAY WE MAY PULL OTHER JAVASCRIPT FILES DYNAMICALLY FROM WITHIN CODE
if ((typeof include) == "undefined") {
  function include(filename) {
	  var head    = document.getElementsByTagName('head')[0];
	  script      = document.createElement('script');
	  script.src  = urlbase + filename;
	  script.type = 'text/javascript';
	  head.appendChild(script);
  }
}



//ADD THE FUNCTION 'TRIM' TO STRING OBJECTS - REMOVE ALL WHITESPACE FROM BEGINING AND END OF STRING, THEN RETURN THE RESULT
if ((typeof String.prototype.trim) == "undefined") {
  String.prototype.trim = function() {
    return this.replace(/^\s+/,'').replace(/\s+$/,'');
  }
}



//ADD THE FUNCTION 'INDEXOF' TO ARRAY OBJECT - RETURN THE INTEGER INDEX POSITION OF AN ITEM WITHIN THE ARRAY, OR -1 ON FAILURE
if ((typeof Array.prototype.indexOf) == "undefined") {
  Array.prototype.indexOf = function(item, start) {
    for (var i = (start || 0); i < this.length; i++) {
      if (this[i] == item) {
        return i;
      }
    }
    return -1;
  }
}



//CHECKS TO SEE IF A GIVEN OBJECT IS OF TYPE ARRAY
if ((typeof isArray) == "undefined") {
  function isArray() {
    if (typeof arguments[0] == 'object'  &&  arguments[0] != null) {
      return (arguments[0].constructor.toString().match(/array/i) != null);
    }
    return false;
  }
}



//ABILITY TO DUMP AN OBJECT'S ENTIRE CONTENTS INTO A STRING, USUALLY FOR DEBUGGING
if ((typeof var_dump) == "undefined") {
  function var_dump(obj) {
    var str='';
    for(prop in obj) {
      if (isArray(obj[prop])) {
        str += prop + ' value {\n' + var_dump(obj[prop]) + '}\n';
      } else {
        str += prop + ' value :' + obj[prop] + '\n';
      }
    }
    return str;
  }
}



//ABILITY TO PRE-LOAD AN IMAGE - USEFUL TO LOAD IMAGES USED IN HOVERING CSS STYLES SO THEY WILL BE AVAILABLE WHEN HOVER OCCURES
if ((typeof preloadImage) == "undefined") {
  function preloadImage(url) {
    var img = new Image();
    img.src = urlroot + url;
  }
}



//USED TO DECODE UTF-8 STRINGS INTO STANDARD MULTI-BYTE STRINGS
if ((typeof _utf8_decode) == "undefined") {
  function _utf8_decode(utftext) {
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;

    while ( i < utftext.length ) {
      c = utftext.charCodeAt(i);
      if (c < 128) {
        string += String.fromCharCode(c);
        i++;
      } else if((c > 191) && (c < 224)) {
        c2 = utftext.charCodeAt(i+1);
        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
        i += 2;
      } else {
        c2 = utftext.charCodeAt(i+1);
        c3 = utftext.charCodeAt(i+2);
        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        i += 3;
      }

    }

    return string;
  }
}



//ADD ABILITY FOR A JAVASCRIPT CLASS TO EXTEND ANOTHER CLASS
function mb_class() { this.obj = this; }
mb_class.prototype.extend = function(parent) { 
  for (prop in parent) { 
    if (typeof(this[prop]) == 'undefined') {
      this[prop] = parent[prop];
    }
  }
  this.obj = this;
}



if ((typeof redirect) == "undefined") {
  function redirect(url) {
    window.location = url;
  }
}

if ((typeof refresh) == "undefined") {
  function refresh() {
    window.location = window.location;
  }
}


if ((typeof parseIntX) == "undefined") {
  function parseIntX(String, radix, default_value) {
    var ret = parseInt(String, radix);
    if (isNaN(ret)) ret = (default_value ? default_value : 0);
    return ret;
  }
}


