/*
	Base file containing common functions and types
*/



var IE6;

var base_dir =  '../../global/library/';
var base_includedfiles = new Array();
var base_includedcss = new Array();
var _debug = true;
var browser = null;


var loadEvents = 0;
var onCompleteLoad = function() { }

var load = false;

var unload_old = window.onload;
window.onload = function() { load = true; }

function addLoadEvent(func) {
  loadEvents++;
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();

      loadEvents--;
      if (load == true && loadEvents == 0) {
      	onCompleteLoad();
      }
    }
  }
}
if (unload_old) {
	addLoadEvent(unload_old);
}





if (navigator.userAgent.indexOf('MSIE 6') > -1) browser = {'type': 'IE', 'version': 6};
else if (navigator.userAgent.indexOf('MSIE 5')  > -1) browser = {'type': 'IE', 'version': 5};
else if (navigator.userAgent.indexOf('MSIE 7')  > -1) browser = {'type': 'IE', 'version': 7};
else if (navigator.userAgent.indexOf('MSIE 8')  > -1) browser = {'type': 'IE', 'version': 8};
else if (navigator.userAgent.indexOf('Firefox/1') > -1) browser = {'type': 'Firefox', 'version': 1};
else if (navigator.userAgent.indexOf('Firefox/2') > -1) browser = {'type': 'Firefox', 'version': 2};
else if (navigator.userAgent.indexOf('Firefox/3') > -1) browser = {'type': 'Firefox', 'version': 3};
else if (navigator.userAgent.indexOf('Opera')  > -1) browser = {'type': 'Opera', 'version': 1};
else if (navigator.userAgent.indexOf('Chrome') > -1) browser = {'type': 'Chrome', 'version': 1};
else if (navigator.userAgent.indexOf('Safari') > -1) browser = {'type': 'Safari', 'version': 1};;

var OO = {}
OO.extend = function(subClass, baseClass) {
   function inheritance() {}
   inheritance.prototype = baseClass.prototype;

   subClass.prototype = new inheritance();
   subClass.prototype.constructor = subClass;
   subClass.baseConstructor = baseClass;
   subClass.superClass = baseClass.prototype;
   subClass._parent = baseClass.prototype;
}
//
//function get_class(obj) {
//	return ''.concat(obj.constructor).replace(/^.*function\s+([^\s]*|[^\(]*)\([^\x00]+$/, '$1') || 'anonymous';
//}
//

var DF_MYSQL = 1;
var DF_DDMMYYYY = 2;
var DF_DDMMYYYY = 2;


function makeDate(mysqldate, format) {
	if (!format) format = DF_MYSQL;
	if (!mysqldate || mysqldate == '') return new Date(0);
	
	if (format == DF_MYSQL) {		
		var date = mysqldate.split(' ')[0];
		var time = mysqldate.split(' ')[1];
		
		var fromMonth = (date.split('-')[1].indexOf('0') == 0) ? parseInt(date.split('-')[1].split('0')[1])-1 : parseInt(date.split('-')[1])-1;
		var dateObj = new Date(date.split('-')[0], fromMonth, date.split('-')[2]);
		
		if (time) {
			dateObj.setHours(time.split(':')[0]);
			dateObj .setMinutes(time.split(':')[1]);
		}
	}
	else if (format == DF_DDMMYYYY) {
		var date = mysqldate.split(' ')[0];
		var parts = date.split('/');
		
		var dateObj = new Date(parts[2], (parts[1]-1), parts[0]);
		//alert(parts);
	}
	return dateObj;
}


//convert query string to array same as php $_GET
var _GET = new Object();
//Get query string
var qs = window.location.href.split('?')[1];
if (qs) {
	qs = qs.split('#')[0];
	qs = qs.split('&');
	for(var i=0;i<qs.length;i++) {
		var vars = qs[i].split('=');
		_GET[vars[0]] = vars[1];
	}
}

function emptyElement(element) {
	if (element) {
		while (element.hasChildNodes()) element.removeChild(element.firstChild);
	}
}

//IE hack. Dynamically created forms do not appear correctly in document.forms, though they are listed by index.
//So instead of document.forms['formname'] use getForm('forname'); to get the form by name
function getForm(name) {
	for (var i = 0; i < document.forms.length; i++) {
		if (document.forms[i].name == name) return document.forms[i];
	}
}

function disableForm(form) {
	for (var i = 0; i < form.elements.length; i++) {
		form.elements[i].disabled = true;
	}
}

function enableForm(form) {
	for (var i = 0; i < form.elements.length; i++) {
		form.elements[i].disabled = false;
	}
}

function html_entity_decode(str) {
  var tempDiv = document.createElement('div');
   tempDiv.innerHTML = str;
   return tempDiv.firstChild.nodeValue;

}

function stripHTML(html) {
	if (!html) return '';
	return html.replace(/\<[^>]+\>/g, '');
}

function cloneObject(obj) {
	var res = new Object();
	for (var x in obj) {
		res[x] = obj[x];
	}
	return res;
}

//needs fixing, doesn't work too well.
function include(file) {
	if (!isIncluded(file)) {
		var script = document.createElement('script');
		script.setAttribute('src', base_dir + file);
		script.setAttribute('language', 'javascript');
  		script.setAttribute('type','text/javascript');
		document.getElementsByTagName('head')[0].appendChild(script);
	}
}

function includeCSS(file,print) {
	if (!isCssIncluded(file)) {
		var link = document.createElement('link');
		link.href = base_dir + file;
		link.setAttribute('rel', 'stylesheet');
		link.setAttribute('type', 'text/css');
		link.setAttribute('media', (print) ? 'print' : 'screen');
		document.getElementsByTagName('head')[0].appendChild(link);
	}
}

function getIncludedCSS() {
	base_includedcss = new Array();
	for (var i=0;i<document.getElementsByTagName('link').length;i++) {
		if (document.getElementsByTagName('link')[i].type == 'text/css') {
			base_includedcss[base_includedcss.length] = document.getElementsByTagName('link')[i].href;
		}
	}
}

function isCssIncluded(file) {
	if (base_includedcss.length == 0) getIncludedCSS();
	for (var i=0;i<base_includedcss.length;i++) {
		if (base_includedfiles[i].indexOf(file) > -1) {
			return true;
			break;
		}
	}
	return false;
}

function getIncludedFiles() {
	base_includedfiles = new Array();
	for (var i=0;i<document.getElementsByTagName('script').length;i++) {
		if (document.getElementsByTagName('script')[i].src != null && document.getElementsByTagName('script')[i].src != '') {
			base_includedfiles[base_includedfiles.length] = document.getElementsByTagName('script')[i].src;
		}
	}
	return base_includedfiles;
}

function isIncluded(file) {
	getIncludedFiles();
	if (base_includedfiles.length == 0) getIncludedFiles();
	for (var i=0;i<base_includedfiles.length;i++) {
		if (base_includedfiles[i].indexOf(file) > -1) {
			return true;
			break;
		}
	}
	return false;
}

function stringToDate(string) {
	return new Date(string.split('/')[2], string.split('/')[1]-1, string.split('/')[0]);
}

function dateToString(date) {
	return !isNaN(date.getTime()) ? ((date.getDate() < 10) ? '0' : '') + date.getDate()+'/'+(((date.getMonth()+1) < 10) ? '0' : '') +(date.getMonth()+1)+'/'+date.getFullYear() : '';
}

function timeToFloat(time) {
	if (time.charAt(0) == '0' && time.charAt(1) != ':') time = time.substring(1);
	return parseInt(time.split(':')[0])+(parseInt(time.split(':')[1])/60);
}



function in_array(needle, haystack) {
    for (var i = 0; i < haystack.length; i++) {
        if (haystack[i] == needle) {
            return true;
        }
    }
    return false;
}


function asc(chr) {
	return chr.charCodeAt(0);
}


function stringToChar(str) {
	var chr = new Array();
	for (var i=0;i<str.length;i++) {
		chr[i] =  str.charAt(i);
	}
	return chr;
}


function charToString(chr) {
	var str = '';
	for (var i=0;i<chr.length;i++) {
		str += chr[i];
	}
	return str;
}

//taken out by Leighton as in _base.js 24/04/09
//function onlyNumbers(ev) {
//	ev = ev || window.event;
//	var k = ev.keyCode || ev.which;
//
//	//Non numeric keypresses to allow
//	var controlChars = new Array(8,  //Backspace
//								 9,  //Tab
//							 	 37, //Left arrow
//							 	 39, //Right arrow
//						 	 	 46, //Delete
//							 	 190, 110, //Dot
//							 	 109	//minus
//							 	 );
//
//	return ((k >= 48 && k <= 57) || (k >= 96 && k <= 105) || in_array(k, controlChars));
//}


//Should be redundant on dev3
function createRadioButton(name) {
	//needed due to IE radio bug.
	var radio = (navigator.appName.indexOf('Explorer') > -1) ? document.createElement('<input type="radio" name="' + name + '" />') : document.createElement('input');
	radio.type = 'radio';
	if (name) radio.name = name;
	return radio;
}

//Same as empty(el);
function removeAllChildren(node) {
	if (node) {
		while (node.hasChildNodes()) {
			node.removeChild(node.firstChild);
		}
	}
}

function timeFromDate(date) {
	return ((date.getHours() < 10) ? '0' : '') + date.getHours() + ':' + ((date.getMinutes() < 10) ? '0' : '') + date.getMinutes();
}

function sqlDateToDate(sqldatein) {
	var sqldate = sqldatein.split(' ')[0];
	var date = new Date(sqldate.split('-')[0], sqldate.split('-')[1]-1, sqldate.split('-')[2]);
	if (sqldatein.split(' ')[1]) {
		date.setHours(sqldatein.split(' ')[1].split(':')[0]);
		date.setMinutes(sqldatein.split(' ')[1].split(':')[1]);
	}
	return date;
}


function createLink(title, onclick, id, image) {
	var link  = document.createElement('a');
	link.onclick = onclick;
	link.id = id;

	link.href = 'javascript:void(0);';
	var container = document.createElement('span');
	if (image) {
		var img = document.createElement('img');
		img.src = '../../global/images/icons/Icons/' + image + '.png';
		img.style.border = '0';
		container.appendChild(img);
	}

	container.appendChild(document.createTextNode('\u00A0' + title)); //uses non breaking space so image and text are always on the same line
	link.appendChild(container);
	return link;
}


function formatSqlDate(datein) {
	var date = datein.split(' ')[0];
	return (date.split('-')[2]) ? date.split('-')[2] + '/' + date.split('-')[1] + '/' + date.split('-')[0] : ' ';
}

function getElementPosition(element) {
	if (element) {
	  var selectedPosX = 0;
	  var selectedPosY = 0;
	  var ewidth = element.offsetWidth;
	  var eheight = element.offsetHeight;

	do {
		selectedPosX += element.offsetLeft;
	    selectedPosY += element.offsetTop;
	} while (element = element.offsetParent);
	 
	 /* while(element != null) {
	    selectedPosX += element.offsetLeft;
	    selectedPosY += element.offsetTop;
	    element = element.offsetParent;
	  }*/
	  return {left : selectedPosX ,top : selectedPosY, width: ewidth, right: selectedPosX + ewidth, bottom: selectedPosY + eheight, height: eheight}
	}
	else return {left : 0 ,top : 0, width: 0, right:0, bottom:0, height:0}
}


function $t(text) {
	return document.createTextNode(text);
}

function $e(el) {

	var forms = new Array('checkbox', 'password', 'submit', 'button', 'radio', 'text');

	if (in_array(el, forms)) {
		if (el == 'radio') this.element = createRadioButton();
		else this.element = document.createElement('input');
		this.element.type = el;
	}
	else {
		this.element = document.createElement(el);
	}


	this.element.add = function(e) {
		if (typeof(e) == 'string') {
			this.appendChild($t(e));
		}
		else {
			this.appendChild(e);
		}
	}

	this.element.setStyle = function(style) {
		for (var s in style) {
			this.style[s] = style[s];
		}

	}

	this.element.empty = function() {
		while (this.hasChildNodes()) {
			this.removeChild(this.firstChild);
		}
	}
	return this.element;
}

Link.imageBase = '/uk/library/img/icons/Icons/';
Link.prototype.imageBase = Link.imageBase;
Link.prototype.element = null;

function Link(title, onclick, image) {
	var link = document.createElement('a');
	this.element = link;

	if (typeof(onclick) == 'function') {
		link.onclick = function(ev) { onclick(ev, this); };
		link.href = 'javascript:void(0);';
	}
	else {
		link.href = onclick;
	}


	var container = document.createElement('span');
	if (image) {
		var img = document.createElement('img');
		img.src = this.imageBase + image + '.png';
		img.style.border = '0';
		container.appendChild(img);
	}

	container.appendChild(document.createTextNode('\u00A0' + title)); //uses non breaking space so image and text are always on the same line
	link.appendChild(container);

}


Link.prototype.appendToElement = function(element) {
	element.appendChild(this.element);
}



function getElementStyle(el,styleProp) {
	if (el.currentStyle) var style = el.currentStyle[styleProp];
	else if (window.getComputedStyle) var style = document.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
	return style;
}


//supports elements with multiple classNames separated by  - or space.
function getElementsByClassName(element, tagName, className) {
	tagName = (tagName == '') ? '*': tagName;
	var elements = (tagName == '*' && element.all) ? element.all : element.getElementsByTagName(tagName);
	var foundElements = new Array();
	className = className.replace(/\-/g, '\\-');
	var regExp = new RegExp('(^|\\s|-)' + className + '(\\s|-|$)');

	for (var i = 0; i < elements.length; i++) {
		if (regExp.test(elements[i].className) || elements[i].className == className) {
			foundElements.push(elements[i]);
		}
	}
	return foundElements;
}



function $(el) {
	if (window.Garbage) { //if mootools
    if (!el) {
        return null;
    }
    if (el.htmlElement) {
        return Garbage.collect(el);
    }
    if ([window, document].contains(el)) {
        return el;
    }
    var type = $type(el);
    if (type == "string") {
        el = document.getElementById(el);
        type = el ? "element" : false;
    }
    if (type != "element") {
        return null;
    }
    if (el.htmlElement) {
        return Garbage.collect(el);
    }
    if (["object", "embed"].contains(el.tagName.toLowerCase())) {
        return el;
    }
    $extend(el, Element.prototype);
    el.htmlElement = function () {};
    return Garbage.collect(el);

	}
	else return document.getElementById(el);
}


function getElementsByName(element, tagName, name) {
	tagName = (tagName == '') ? '*': tagName;
	var elements = (tagName == '*' && element.all) ? element.all : element.getElementsByTagName(tagName);

	var foundElements = new Array();
	
	
	//name = name.replace(/\-/g, '\\-');
	//var regExp = new RegExp('(^|\\s|-)' + name + '(\\s|-|$)');

	for (var i = 0; i < elements.length; i++) {
		if (elements[i].name == name) {
			foundElements.push(elements[i]);
		}
	}
	return foundElements;
}



function killEvent(eventObject) {
	//IE
	if (window.event) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}

	if (eventObject) {
		if (eventObject.stopPropagation) eventObject.stopPropagation();
		if (eventObject.preventDefault) eventObject.preventDefault();
		if (navigator.appName.indexOf('Firefox') == 0) {
			if (eventObject.preventCapture) eventObject.preventCapture();
    		if (eventObject.preventBubble) eventObject.preventBubble();
		}
		eventObject.cancelBubble = true;
		eventObject.returnValue = false;
	}
	return false;
}

function assignEvent(element, eventName, func, stopBubble) {
	if (!element.events) element.events = new Array();
	if (!element.events[eventName]) element.events[eventName] = new Array();



	var f = function(e) { e = e || window.event; func(e); if (stopBubble) killEvent(e);};

	if (navigator.appName == 'Opera') {
	//	var f = func;
	}
	if (_GET['jobid']) {
		if (_GET['jobid'] == 725114) {



		//	var f = function(e) { e = e || window.event; alert(func(e)); if (stopBubble) killEvent(e);};

		}
	}


	element.events[eventName][element.events.length] = f;

	//if (element.addEventListener) element.addEventListener(eventName, f, false);
	//else if (element.attachEvent) element.attachEvent('on' + eventName, f);

	//Swapped around. Opera supports both but only allows onload to work with attachEvent (http://dotnetslackers.com/Ajax/re-28191_r_a_d_controls_Event_handing_Atlas_and_Opera.aspx)
	//if (element.addEventListener) element.addEventListener(eventName, f, false);
	//else if (element.attachEvent) element.attachEvent('on' + eventName, f);

	if (element.attachEvent) element.attachEvent('on' + eventName, f);
	else if (element.addEventListener) element.addEventListener(eventName, f, false);

	return f;
}

function removeEvent(element, eventName, func) {
	if (element.removeEventListener) element.removeEventListener(eventName, func, false);
	else if (element.detachEvent) element.detachEvent('on' + eventName, func);
}

function removeAllEvents(element, eventName) {
	if (element.events && element.events[eventName]) {
		for (var i =0; i < element.events[eventName].length; i++) {
			removeEvent(element, eventName, element.events[eventName][i]);
		}
	}
}

function isAncestorOf(element, check) {
	while (element.parentNode) {
		if (element.parentNode == check) return true;
		element = element.parentNode;
	}
	return false;
}

function isAncestorOfType(element, name) {
	while (element.parentNode) {
		if (element.parentNode.tagName == name) return true;
		element = element.parentNode;
	}
	return false;
}


function getAncestorOfType(element, type) {
	while (element.parentNode) {
		if (element.parentNode.tagName && element.parentNode.tagName.toLowerCase() == type.toLowerCase()) return element.parentNode;
		element = element.parentNode;
	}
	return false;

}


function getAncestorOfClass(element, type) {
	while (element.parentNode) {
		if (element.parentNode.tagName && element.parentNode.className.toLowerCase().indexOf(type.toLowerCase()) > -1) return element.parentNode;
		element = element.parentNode;
	}
	return false;

}


String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,'');
}

String.prototype.trim2 = function() {
	return this.replace(/^\s+|\s+|\�$/g,'');
}

function htmlentities(s) {
    var div = document.createElement('div');
    var text = document.createTextNode(s);
    div.appendChild(text);
    return div.innerHTML;
}

function unhtmlentities(html) {
	html = html.replace(/&gt;/g, '>');
	html = html.replace(/&lt;/g, '<');
	html = html.replace(/&quot;/g, '"');
	html = html.replace(/&apos;/g, '\'');
	return html;
}


function cancelSelect() {
	cancelReselect = true;
}


var cancelReselect = false;


function purge(d) {
	var a = d.attributes, i, l, n;
	if (a) {
		l = a.length;
		for (i = 0; i < l; i += 1) {
			n = a[i].name;
			if (typeof d[n] === 'function') {
				d[n] = null;
			}
		}
	}
	a = d.childNodes;
	if (a) {
		l = a.length;
		for (i = 0; i < l; i += 1) {
			purge(d.childNodes[i]);
		}
	}
}

function removeChildSafe(el) {
	//http://javascript.crockford.com/memory/leak.html
	//Stop memory leaks, according to this site the issue was fixed with an IE6 patch. Looks like they didn't move it to IE7.
	purge(el);
    el.parentNode.removeChild(el);
}





/*

	Use Timeouts to avoid long loops with complex code making the browser freeze.
	Timeouts use a separate thread


	new Loop(0, 100, function(i) {
		alert(i);
	});

*/



function Lang() {
	this.text = new Object();

	this.addText = function(label, text) {
		this.text[label] = text;
	}

	this.get = function(label, replacements) {
		if (replacements) {
			var txt = this.text[label];
			for (var i in replacements) {
				var regex = new RegExp('\\[\\[' + i + '\\]\\]', 'g');
				txt = txt.replace(regex, replacements[i]);
			}
			return txt;
		}
		else {
			return this.text[label];
		}
	}
}

if (!window['lang']) var lang = new Lang();



function is_array(myVar) {
    var key = '';
 
    if (!myVar) return false;
     
    if (typeof myVar === 'object') { 
        if (myVar.hasOwnProperty) {
            for (key in myVar) {
                if (myVar.hasOwnProperty(key) === false) {
                    return false;
                }
            }
        } 
        return true;
    } 
    return false;
}

