var XHRFactory = (function(){
 // static private member
 var stack = new Array();
 var poolSize = 10;
 
 var nullFunction = function() {}; // for nuking the onreadystatechange
 
 // private static methods
 
 function createXHR() {
  if (window.XMLHttpRequest) {
       return new XMLHttpRequest();
     } else if (window.ActiveXObject) {
       return new ActiveXObject('Microsoft.XMLHTTP')
     }
    }

 // cache a few for use
 for (var i = 0; i < poolSize; i++) {
  stack.push(createXHR());
 }
 
 // shared instance methods
 return ({
  release:function(xhr){
   xhr.onreadystatechange = nullFunction;
   stack.push(xhr);
  },
  getInstance:function(){
   if (stack.length < 1) {
    return createXHR();
   } else {
    return stack.pop();
   }
  },
  toString:function(){
   return "stack size = " + stack.length;
  }
 });
})();

function show_related(){
	var xhr = XHRFactory.getInstance();
	var url = "./index.php?act=06";
	xhr.open("GET", url, true);
	xhr.onreadystatechange = function() {
		if (xhr.readyState==1) {
			var divHTML = '<div align="center"><b>Processing your request</b><br/><img src="images/loading.gif"></div>';
			make_responce(divHTML);		
		}
		else if (xhr.readyState==4) {
			if (xhr.status==200) {
				update_responce(xhr.responseText);
			}
			XHRFactory.release(xhr);
		}
	};
	xhr.send("");
}

function update_responce(arg){
	document.getElementById('Results').innerHTML = arg;
}


function make_responce(arg){
	document.getElementById('Results').innerHTML = arg;
	document.getElementById('pop').style.display = 'block';
}


var Drag = {
obj : null,
init : function(o, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper){
o.onmousedown	= Drag.start;
o.hmode			= bSwapHorzRef ? false : true ;
o.vmode			= bSwapVertRef ? false : true ;
o.root = oRoot && oRoot != null ? oRoot : o ;

if (o.hmode  && isNaN(parseInt(o.root.style.left  ))) o.root.style.left   = "0px";
if (o.vmode  && isNaN(parseInt(o.root.style.top   ))) o.root.style.top    = "0px";
if (!o.hmode && isNaN(parseInt(o.root.style.right ))) o.root.style.right  = "0px";
if (!o.vmode && isNaN(parseInt(o.root.style.bottom))) o.root.style.bottom = "0px";

o.minX	= typeof minX != 'undefined' ? minX : null;
o.minY	= typeof minY != 'undefined' ? minY : null;
o.maxX	= typeof maxX != 'undefined' ? maxX : null;
o.maxY	= typeof maxY != 'undefined' ? maxY : null;

o.xMapper = fXMapper ? fXMapper : null;
o.yMapper = fYMapper ? fYMapper : null;

o.root.onDragStart	= new Function();
o.root.onDragEnd	= new Function();
o.root.onDrag		= new Function();
},

start : function(e){
var o = Drag.obj = this;
e = Drag.fixE(e);

var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );

o.root.onDragStart(x, y);
o.lastMouseX	= e.clientX;
o.lastMouseY	= e.clientY;
if (o.hmode){
	if (o.minX != null)	o.minMouseX	= e.clientX - x + o.minX;
	if (o.maxX != null)	o.maxMouseX	= o.minMouseX + o.maxX - o.minX;
} else {
	if (o.minX != null) o.maxMouseX = -o.minX + e.clientX + x;
	if (o.maxX != null) o.minMouseX = -o.maxX + e.clientX + x;
}
if (o.vmode) {
	if (o.minY != null)	o.minMouseY	= e.clientY - y + o.minY;
	if (o.maxY != null)	o.maxMouseY	= o.minMouseY + o.maxY - o.minY;
} else {
	if (o.minY != null) o.maxMouseY = -o.minY + e.clientY + y;
	if (o.maxY != null) o.minMouseY = -o.maxY + e.clientY + y;
}

document.onmousemove	= Drag.drag;
document.onmouseup		= Drag.end;
return false;
},

drag : function(e){
e = Drag.fixE(e);

var o   = Drag.obj;
var ey	= e.clientY;
var ex	= e.clientX;
var y   = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
var x   = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
var nx, ny;

if (o.minX != null) ex = o.hmode ? Math.max(ex, o.minMouseX) : Math.min(ex, o.maxMouseX);
if (o.maxX != null) ex = o.hmode ? Math.min(ex, o.maxMouseX) : Math.max(ex, o.minMouseX);
if (o.minY != null) ey = o.vmode ? Math.max(ey, o.minMouseY) : Math.min(ey, o.maxMouseY);
if (o.maxY != null) ey = o.vmode ? Math.min(ey, o.maxMouseY) : Math.max(ey, o.minMouseY);

nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));
ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));

if (o.xMapper)		nx = o.xMapper(y)
else if (o.yMapper)	ny = o.yMapper(x)

Drag.obj.root.style[o.hmode ? "left" : "right"] = nx + "px";
Drag.obj.root.style[o.vmode ? "top" : "bottom"] = ny + "px";
Drag.obj.lastMouseX	= ex;
Drag.obj.lastMouseY	= ey;

Drag.obj.root.onDrag(nx, ny);
return false;
},

end : function(){
document.onmousemove = null;
document.onmouseup   = null;
Drag.obj.root.onDragEnd(	parseInt(Drag.obj.root.style[Drag.obj.hmode ? "left" : "right"]), 
parseInt(Drag.obj.root.style[Drag.obj.vmode ? "top" : "bottom"]));
Drag.obj = null;
},

fixE : function(e){
if (typeof e == 'undefined') e = window.event;
if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
return e;
}
};


function update_size(){
	var xhr = XHRFactory.getInstance();
	var url = "./index.php?act=04";
	xhr.open("GET", url, true);
	xhr.onreadystatechange = function() {
		if (xhr.readyState==4) {
			//document.getElementById('totalSize').innerHTML = document.forms[0].totalSize.value;
			if (xhr.status==200) {
				//document.forms[0].totalSize.value = xhr.responseText;
				document.getElementById('totalSize').innerHTML = xhr.responseText;
			}
			XHRFactory.release(xhr);
		}
	};
	xhr.send("");
}

function update_entries(){
	var xhr = XHRFactory.getInstance();
	var url = "./index.php?act=01";
	xhr.open("GET", url, true);
	xhr.onreadystatechange = function() {
		if (xhr.readyState==4) {
			//document.getElementById('totalNumber').innerHTML = document.forms[0].totalNum.value;
			if (xhr.status==200) {
				//document.forms[0].totalNum.value = xhr.responseText;
				document.getElementById('totalNumber').innerHTML = xhr.responseText;
			}
			XHRFactory.release(xhr);
		}
	};
	xhr.send("");
}

function update_load(){
	var xhr = XHRFactory.getInstance();
	var url = "./index.php?act=05";
	xhr.open("GET", url, true);
	xhr.onreadystatechange = function() {
		if (xhr.readyState==4) {
			if (xhr.status==200) {
				document.getElementById('loadcontainer').innerHTML = xhr.responseText;
			}
			XHRFactory.release(xhr);
		}
	};
	xhr.send("");
}

function update_total(){
	update_entries();
	update_size();
	update_load();
}


function make_md5(){
	var phrase = document.getElementById('makemd5').value;
	var xhr = XHRFactory.getInstance();
	var url = "./index.php?act=02&phrase="+phrase;
	xhr.open("GET", url, true);
	xhr.onreadystatechange = function() {
		if (xhr.readyState==1) {
			var divHTML = '<div align="center"><b>Processing your request</b><br/><img src="images/loading.gif"></div>';
			make_responce(divHTML);		
		}
		else if (xhr.readyState==4) {
			if (xhr.status==200) {
				update_responce(xhr.responseText);
			}
			XHRFactory.release(xhr);
		}
	};
	xhr.send("");
}




function decode_md5(){
	var phrase = document.getElementById('decode_md5').value;
	var xhr = XHRFactory.getInstance();
	var url = "./index.php?act=03&phrase="+phrase;
	xhr.open("GET", url, true);
	xhr.onreadystatechange = function() {
		if (xhr.readyState==1) {
			var divHTML = '<div align="center"><b>Processing your request</b><br/><img src="images/loading.gif"></div>';
			make_responce(divHTML);		
		}
		else if (xhr.readyState==4) {
			if (xhr.status==200) {
				update_responce(xhr.responseText);
			}
			XHRFactory.release(xhr);
		}
	};
	xhr.send("");
}


function close_error(){
	document.getElementById('pop').style.display = 'none';
}


function fjs_focus(id){
	document.getElementById(id).style.color = "#000000";
	if(document.getElementById(id).value == "Phrase to encode"){
		document.getElementById(id).value = "";
	}else if(document.getElementById(id).value == "Phrase to decode"){
		document.getElementById(id).value = "";
	}
}


function fjs_blur(id){
	if(document.getElementById(id).value == ""){
		document.getElementById(id).value = "Phrase to encode";
		document.getElementById(id).style.color = "#CFCFCF";
		if(id == 'decode_md5'){
			document.getElementById(id).value = "Phrase to decode";
			document.getElementById(id).style.color = "#CFCFCF";
		}			
	}
}


function fjs_mouseout(id){
	document.getElementById(id).style.border = "1px solid #CFCFCF";
}


function fjs_mouseovr(id){
	document.getElementById(id).style.border = "1px solid #6F6F6F";
}


function load(){
	document.getElementById('pop').style.marginLeft = (screen.width - 320) / 2 + 'px';
	document.getElementById('pop').style.marginTop = "130px";
	var handle = document.getElementById('handle');
	var root = document.getElementById('pop');
	Drag.init(handle, root);
	window.setInterval('update_total()', 5000);
}