// #################
// ## AJAX        ##
// #################
var AJAX = {};

AJAX = function () {
	this.req = {};
};

AJAX.prototype.makeRequest = function (url, method, onComp, onErr) {	
	if (method != "POST")
		method = "GET";
	
	this.onComplete = onComp;
	this.onError    = onErr;
	
	// native XMLHttpRequest
	if (window.XMLHttpRequest){
		this.req = new XMLHttpRequest();
		this.req.onreadystatechange = function () { this.ReqChange() };
		this.req.open("GET", url, true); //
		this.req.send(null);
    
	// IE/Windows ActiveX
	} else if (window.ActiveXObject) {
		this.req = new ActiveXObject("Microsoft.XMLHTTP");
		if (this.req) {
			this.req.onreadystatechange = function () { this.ReqChange() };
			this.req.open(method, url, true);
			this.req.send();
		}
	}
};

AJAX.prototype.ReqChange = function() {	
	// Loaded
	if (this.req.readyState == 4) {
		// Complete
		if (this.req.status == 200)	{
			this.onComplete( this.req );
		} else {
			this.onError( this.req.status );
		}
	}
};



// #################
// ## DOM         ##
// #################
var DOM = {};

DOM.support = function() {
  return document.getElementsByTagName;
}

DOM.create = function(type, attributes, content, isHTML) {
	var ne = document.createElement(type);
	if (!ne)
		return 0;
		
	for (var a in attributes)
		ne[a] = attributes[a];
	
	var t = typeof(content);
	
	if (t == "string" && !isHTML)
		ne.appendChild( document.createTextNode(content) );
	else if (t == "string" && isHTML)
		ne.innerHTML = content;
	else if (t == "object")
		ne.appendChild(content);
    
	return ne;
};

DOM.get = function(ele) {
	var t=typeof(ele);
  
	if (t == "undefined") {
		return 0;
  }	else if (t == "string")	{
		var re = document.getElementById(ele);
		if (!re)
			return 0;
		else if (typeof(re.appendChild) != "undefined" )
			return re;
		else
			return 0;
	} else if (typeof(e.appendChild) != "undefined") {
		return ele;
  }	else {
		return 0;
  }
};

DOM.getByClass = function(name, type) {
	if (type == null)	
    type = '*';

	var eles    = document.getElementsByTagName(type);
	var pattern = new RegExp("(^|\\\\s)"+name+"(\\\\s|$)");

	var classElements = new Array();
	for (var i=0, j=0; i< eles.length; i++) {
		if (pattern.test(eles[i].className) ) {
			classElements[j] = eles[i];
			j++;
		}
	}
	return classElements;
}

DOM.remove = function(ele) {
	var e = this.get(ele);
	
	if (!e)
		return 0;
	else if (e.parentNode.removeChild(e))
		return true;
	else
		return 0;
};

DOM.pos = function(ele) {
	var e = this.get(ele);
  
	var obj = e;
	var left = 0;
	if (obj.offsetParent)	{
		while (obj.offsetParent) {
			left += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	} else if (obj.x) {
		left += obj.x;
	}
  
	var obj = e;	
	var top = 0;
	if (obj.offsetParent)	{
		while (obj.offsetParent) {
			top += obj.offsetTop;
			obj = obj.offsetParent;
		}
	} else if (obj.y) {
		top += obj.y;
  }

	return {x:left, y:top};
};



// #################
// ## Fader       ##
// #################
var Fader = function(ele, start, end, duration, callback) {	
	if (!ele)
		return 0;
	
	this.e    = ele;	
	this.start= start;
	this.end  = end;	
	this.cb   = callback;	
	this.nDur = duration;		
	this.nTime= 0;
	this.nStep= 50;
	
	var self = this;
	this.nID = setInterval(function() { self._fade() }, this.nStep);
};

Fader.prototype._fade = function() {
	this.nTime += this.nStep;
	
	var opie= Math.round( this._tween(this.nTime, this.start, this.end, this.nDur) * 100 );
	var op  = opie / 100;
	
  // IE
	if (this.e.filters) {
		try	{
			this.e.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opie;
		} catch (e) {
			this.e.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+opie+')';
		}
  // Good Browsers
	} else {
		this.e.style.opacity = op;
	}	
	
	if (this.nTime == this.nDur) {
		clearInterval(this.nID);
		if (this.cb != undefined)
			this.cb();
	}
};

Fader.prototype._tween = function(t, b, c, d) {
	return b + ( (c-b) * (t/d) );
};



// #################
// ## Valid Input ##
// #################
var InputValidator = function () {	
  var self = this;

  var objs = DOM.getByClass("number", "input");	
	for (var i = 0; i < objs.length; i++ )
		objs[i].onkeyup = function() { self.typeInt(this); };

  var objs = DOM.getByClass("currency", "input");	
	for (var i = 0; i < objs.length; i++ )
		objs[i].onkeyup = function() { self.typeCurrency(this); };

  var objs = DOM.getByClass("hex", "input");	
	for (var i = 0; i < objs.length; i++ )
		objs[i].onkeyup = function() { self.typeHex(this); };
}

InputValidator.prototype.typeInt = function(ele) {
  ele.value = ele.value.replace(/[^0-9]/, "");
}

InputValidator.prototype.number_format = function(number, decimals, dec_point, thousands_sep) { 
  var n = number
  var prec = decimals;
  n = !isFinite(+n) ? 0 : +n;
  prec = !isFinite(+prec) ? 0 : Math.abs(prec);
  var sep = (typeof thousands_sep == "undefined") ? ',' : thousands_sep;
  var dec = (typeof dec_point == "undefined") ? '.' : dec_point;

  var s = (prec > 0) ? n.toFixed(prec) : Math.round(n).toFixed(prec); 

  var abs = Math.abs(n).toFixed(prec);

  if (abs >= 1000) {
    var spl = abs.split(/\D/);
    var i = spl[0].length % 3 || 3;

    spl[0] = s.slice(0,i + (n < 0)) + spl[0].slice(i).replace(/(\d{3})/g, sep+'$1');

    s = spl.join(dec);
  } else {
    s = s.replace('.', dec);
  }
  return s;
}

InputValidator.prototype.typeCurrency = function(ele) {
  var val = ele.value;
  val = val.replace(/[^0-9\.,]/, "");
  val = val.replace(/,/, ".");
   
  var spl   = val.split('.');
  if (spl.length>1)
    ele.value = this.number_format(spl[0] + "." + spl[1], 2);
  else
    ele.value = this.number_format(spl[0], 2);
}

InputValidator.prototype.typeHex = function(ele) {
  ele.value = ele.value.replace(/[^#0-9A-Fa-f]/, "");
}

MultiOnLoad(function() { new InputValidator(); });



// #################
// ## OnLoad      ##
// #################
function MultiOnLoad(newOnLoad) {
  var oldOnLoad = window.onload;

  if (typeof window.onload == 'function') {
    window.onload = function() {
      oldOnLoad();
      newOnLoad();
    };
  } else {
    window.onload = function() {
      newOnLoad();
    };
  }
}



// #################
// ## Cookies     ##
// #################
function setCookie(name, value) {
  var d = new Date(); d.setMonth(d.getMonth()+3); 
  document.cookie = name + "=" + escape(value) + "; expires=" + d.toGMTString();
}

function getCookie(name) {
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else {
    begin += 2;
  }
  var end = document.cookie.indexOf(";", begin);
  if (end == -1) end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}



// #################
// ## Misc        ##
// #################
function actionConfirm(TheMessage, TheURL) {
 	if (window.confirm(TheMessage)) 
    window.location.href = TheURL;
}  


// #################
// ## Ticker      ##
// #################
var tickerPos       = 0;
var tickerRepeat    = 5;
var tickerInterval;

function startTicker() {  
  if (!DOM.support) return;
  
  var tDelimiter = " + + + ";
  var tNews  = tDelimiter + tickerText.join( tDelimiter );
  
  for (var i=1; i<tickerRepeat; i++) {
    tNews+=tNews;
  }
  
  var DOM_ticker = DOM.create('div', {id:'ticker'}, '<table border="0" cellpadding="0" cellspacing="0" border="0"><tr><td><div><nobr><span id="tickertext" style="position:relative;" onmouseover="pauseTicker(true)" onmouseout="pauseTicker(false)">' + tNews + '</span></nobr></div></td></tr></table>', true);
  document.body.appendChild(DOM_ticker);
	
  tickerInterval = setInterval('scrollTicker()', tickerSpeed);
}
  
function scrollTicker() {
  var tObj = DOM.get('tickertext');
  
  if (Math.abs(tickerPos) > tObj.offsetWidth/tickerRepeat) 
    tickerPos = 0;
  tObj.style.left = tickerPos + 'px';
  tickerPos--;
}

function pauseTicker(pause) {
  if (pause)
    clearInterval(tickerInterval);
  else
    tickerInterval = setInterval('scrollTicker()', tickerSpeed);
}



// #################
// ## Slideshow   ##
// #################
function imgBlend(imgID, imgSrc, step, time) {
  var imgObj = DOM.get(imgID); 
  
  // Start Blending
  if (imgSrc && !imgObj.blendTrans) {
   imgObj.blendTrans=100;
   imgObj.blendStep = (step) ? step : 4;
   imgObj.blendTime = (time) ? time : 30;
  
   imgObj.parentNode.style.background="url("+imgObj.src+") no-repeat top center";
   setTransparency(imgID, imgObj.blendTrans);
   imgObj.src=imgSrc;

   window.setTimeout(function() { imgBlend(imgID); }, imgObj.blendTime);

  // Blend Image
  } else if (!imgSrc) {
    imgObj.blendTrans=Math.max(0,imgObj.blendTrans-imgObj.blendStep);
 
    if (imgObj.blendTrans>0) {
      setTransparency(imgID, imgObj.blendTrans);
      window.setTimeout(function() { imgBlend(imgID); },imgObj.blendTime);

    // Blend Finished
    } else {
      imgObj.blendTrans=0;
      setTransparency(imgID, 0);
      imgObj.parentNode.style.backgroundImage="";

      window.setTimeout('changeImages()', pageInterval)
    }
  }
}
 
function setTransparency(element, percentage) {  
  var object = DOM.get(element); 
  
  if (!object) return false;
  
  percentage = (typeof(percentage)=="undefined") ? 50 : (100 - percentage);
 
  var filterValue  = "Alpha(opacity="+percentage+")";
  var opacityValue = (percentage/100);
 
  var count = (object.length) ? object.length : 1; 
  for (var i=0; i<count; i++) {
    var objStyle = (object.length) ? object[i].style : object.style;
  
    objStyle.filter       = filterValue;
    objStyle.MozOpacity   = opacityValue;
    objStyle.KhtmlOpacity = opacityValue;
    objStyle.opacity      = opacityValue;
  }
  return true;
}

var activeImage = 0;
var ImageCache  = new Array();

function loadImages() {  
  var ImageTotal = pageImages.length;
  
  if (ImageTotal<=1) return;  

  for (var i=0; i<ImageTotal; i++)  {
    ImageCache[i] = new Image();
    ImageCache[i].src = pageImages[i];
  }
  
  window.setTimeout('checkLoaded()', 10);
}

function checkLoaded() {
  var ImageLoaded = 0;
  var ImageTotal  = ImageCache.length;

  for (var i=0; i<ImageTotal; i++) {
    if (ImageCache[i].complete) {
      ImageLoaded++;
    }
  }
  if (ImageLoaded == ImageTotal) {
    window.setTimeout('changeImages()', pageInterval);
  } else {
    window.setTimeout("checkLoaded()", 10);  
  }
}

function changeImages() {  
  activeImage++;
  if (activeImage >= ImageCache.length) activeImage = 0;
  
  if (pageBlend>0) {
    imgBlend('pageimage', ImageCache[activeImage].src, 4, pageBlend);
  } else {
    DOM.get('pageimage').src = ImageCache[activeImage].src;  
    window.setTimeout('changeImages()', pageInterval) 
  }
} 
