/**
*@Description : Draws a ShadowBox on the page
*@ver : 1.1
* @thanks : http://trentrichardson.com/Impromptu/
**/
function _$(id){ return document.getElementById(id); }
var userAgent = navigator.userAgent.toLowerCase();

var msie  , ie6 = false;

msie = /msie/.test(userAgent);
if(true == msie){ie6 = /6\.0/.test(userAgent); }
var _unsuppotred = new Array();
function getAllUnzIndexSupportedObjects(){
	var _unsub = new Array();
	var applets = 	getUnSubShowObjectsOf('applet');
	var objects =   getUnSubShowObjectsOf('object');
	_unsub = applets.concat(objects);
	//if(ie6){
	var selects =   getUnSubShowObjectsOf('select');
	_unsub = _unsub.concat(selects);
	//}
	_unsuppotred = _unsub
	getAllUnzIndexSupportedObjects = function() { return _unsuppotred;} // I will not do this again hehehe :D
	return _unsub;

}
function getUnSubShowObjectsOf(type){
	var objs = document.getElementsByTagName(type);
	var _tmp_unsub = new Array();
	for(i=0;i<objs.length;i++){
		if(false != ( sStatus = isShown(objs[i]))){
			_tmp_unsub[_tmp_unsub.length] = {unsup :objs[i] , showStatus : sStatus};
		}
	}
	return _tmp_unsub;
}

function isShown(obj){
	if(obj.style.display == 'none' || obj.style.visibility == 'hidden'){
		return false;
	}


	/**
	*@todo : Playing with style sheets classNames to sure of the visability status
	*	if(obj.className != ""){
	*	var styleSheets = document.stylesheets
	*	...........
	*	}
	**/
	return { visibility : obj.style.visibility , display : obj.style.display};
}


// getPageScroll()
// Returns array with x,y page scroll values.
// Core code from - quirksmode.org
//
function getPageScroll(){

	var yScroll,xScroll;

	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
		xScroll = self.pageXOffset;
	} else if (document.documentElement && document.documentElement.scrollTop){     // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop;
		xScroll = document.documentElement.scrollLeft;
	} else if (document.body) {// all other Explorers
		yScroll = document.body.scrollTop;
		xScroll = document.body.scrollLeft;
	}

	arrayPageScroll = new Array('',yScroll)
	return {x : xScroll , y : yScroll };
}



//
// getPageSize()
// Returns array with page width, height and window width, height
// Core code from - quirksmode.org
// Edit for Firefox by pHaez
//
function getPageSize(){

	var xScroll, yScroll;

	if (window.innerHeight && window.scrollMaxY) {
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}

	var windowWidth, windowHeight;
	if (self.innerHeight) {    // all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}

	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else {
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}



	return {pWidth : pageWidth,pHeight : pageHeight,wWidth : windowWidth, wHeight:windowHeight};
}
function showElement(id){
	var elm = _$(id);
	if(elm){
		elm.style.display = 'block';
	}
}



function hideElement(id){
	var elm = _$(id);
	if(elm){
		elm.style.display = 'none';
	}
}
function opacity(id, opacStart, opacEnd, millisec) {
	//speed for each frame
	var speed = Math.round(millisec / 100);
	var timer = 0;

	//determine the direction for the blending, if start and end are the same nothing happens
	if(opacStart > opacEnd) {
		for(i = opacStart; i >= opacEnd; i--) {
			setTimeout("changeOpac('" + id + "'," + i + ")",(timer * speed));
			timer++;
		}
	} else if(opacStart < opacEnd) {
		for(i = opacStart; i <= opacEnd; i++)
		{
			setTimeout("changeOpac('" + id + "'," + i + ")",(timer * speed));
			timer++;
		}
	}
}

//change the opacity for different browsers
function changeOpac(id , opacity) {
	var obj = _$(id)
	if(obj){
		var object = obj.style;
		object.opacity = (opacity / 100);
		object.MozOpacity = (opacity / 100);
		object.KhtmlOpacity = (opacity / 100);
		object.filter = "alpha(opacity=" + opacity + ")";
	}
}




function ShadowBox(msg , options){
	this.id = "sbox" ;
	this.shaowColor = "#000000";
	this.transHoldTime = 50;
	this.maxOpacity = "70";
	this.box = "<div style='width:300px;background-color:#ffffff'>Hello Dude</div>";
	this.boxWidth = "300px";
	this.prefix = this.id+"_msg";
	this.paddingLeft = "0";
	this.top = "30%";
	if(msg != null){
		this.box = msg;
	}
	for(option in options){
		eval("this."+option+" = '"+options[option]+"'");
	}
	var doc = document;
	if(window.frameElement != null) {
		doc = parent.document;
	}

	this.init = function (){
		var objBody = document.getElementsByTagName("body").item(0);
		// create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
		var objOverlay = document.createElement("div");
		objOverlay.setAttribute('id',this.id);
		objOverlay.style.backgroundColor = this.shaowColor;
		objOverlay.style.display = 'none';
		objOverlay.style.position = 'absolute';
		objOverlay.style.top = '0';
		objOverlay.style.left = '0';
		objOverlay.style.zIndex = '998';
		objOverlay.style.width = "100%";
		objBody.insertBefore(objOverlay, objBody.firstChild);
	}


	this.show  = function (){
		var shadowBox = _$(this.id);

		if(!shadowBox)
		{
			this.init();
		}

				/** hide all objects that can kill our Awsem ShadowBox **/
		var objects = getAllUnzIndexSupportedObjects();
		for(var i = 0 ; i<objects.length;i++){
			objects[i].unsup.style.display = 'none';
		}

		var shadowBox = _$(this.id);

		var pageHandler = getPageSize();
		var scroll = getPageScroll();
		shadowBox.style.position = 'absolute';
		shadowBox.style.top = 0;
		shadowBox.style.left = 0;
		shadowBox.style.height = pageHandler.pHeight + scroll.y + "px";
		shadowBox.style.width = "100%";

		var msgbox = document.createElement("div");
		msgbox.style.position = 'fixed';
		msgbox.id = this.prefix;
		msgbox.style.top = this.top;
		msgbox.style.left = "50%";
		msgbox.className = this.prefix;
		msgbox.style.display = 'none';
		msgbox.style.zIndex = 999;
		msgbox.innerHTML = this.box;
		msgbox.style.width = this.boxWidth;
		msgbox = document.getElementsByTagName('body')[0].appendChild(msgbox);

		msgbox.style.marginLeft=(( ( parseInt(this.paddingLeft,10)*1 + parseInt(this.boxWidth,10)*1)/2)*-1) + "px";
		if(ie6){
			msgbox.style.position  = 'absolute';
			window.onscroll = function(){
				msgbox.style.top =  (document.documentElement.scrollTop || document.body.scrollTop) + Math.round(15 * (document.documentElement.offsetHeight || document.body.clientHeight) / 100) + 'px';
			}

			shadowBox.style.width = pageHandler.pWidth + scroll.x + "px";
		}






		changeOpac(this.id,0);
		changeOpac(msgbox.id,0);
		msgbox.style.display = 'block';


		opacity(this.id,0,this.maxOpacity,this.transHoldTime);
		opacity(msgbox.id,0,100,50);
		showElement(shadowBox.id);


	}


	this.hide = function (){

		var shadowBox = _$(this.id);

		if(shadowBox != 'undefined' && shadowBox.style.display == 'block')
		{
			opacity(this.id,this.maxOpacity,0,this.transHoldTime);

			setTimeout("hideElement('"+this.id+"')",this.transHoldTime);
		}
		var msgbox = _$(this.prefix);
		if(msgbox && msgbox.style.display == 'block'){
			 document.getElementsByTagName('body')[0].removeChild(msgbox);
		}
		/** show all objects that could kill our Awsem ShadowBox **/
		//var objects = getAllUnzIndexSupportedObjects();
		for(var i = 0 ; i<_unsuppotred.length;i++){
			_unsuppotred[i].unsup.style.display =_unsuppotred[i].showStatus.display;
			_unsuppotred[i].unsup.style.visibility =_unsuppotred[i].showStatus.visibility;
		}


	}

	this.hideImmediatly = function hideImmediatly(){
		var shadowBox = _$(this.id);
		hideElement(shadowBox);
	}


}