/**
* @file:identifycode.js
* @version:1.0
* @author:戴剑峰
* @last modified date:2007-10-29
* @brief:实现图形验证码*
*
*/

function $(element) 
{
   if (typeof element=='string')
    element=document.getElementById(element);
  return element;
}

var baseclass=function(){
	this.createElement=function(type, parent) {
		var el=null;
		if (document.createElementNS) {
			// use the XHTML namespace; IE won't normally get here unless
			// _they_ "fix" the DOM2 implementation.
			el=document.createElementNS("http://www.w3.org/1999/xhtml", type);
		} else {
			el=document.createElement(type);
		}
		if (typeof parent!="undefined") {
			parent.appendChild(el);
		}
		return el;
	};
	this.addEvent=function (element,name,observer,useCapture){
		useCapture = useCapture || false;
	    if (element.addEventListener)element.addEventListener(name, observer, useCapture);
	     else if (element.attachEvent)element.attachEvent('on' + name, observer);
	};	
}

identifyimage=function(params){
	function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };
	param_default("image",null);
	param_default("resetbutton",null);
	param_default("inputfield",null);
	param_default("cover_size",60);
	param_default("cover_color","#f00");
	param_default("resetcallback",null);
	baseclass.apply(this,new Array(params));
	this.cover=this.createElement("div");
	this.img=$(params["image"]);
	this.resetbutton=$(params["resetbutton"]);
	this.resetbutton.targetid=params["image"];
	this.info=$(params["inputfield"]);
	this.cover_size=params["cover_size"];
	this.resetcallback=params["resetcallback"];
	var s=this.cover.style;
	s.position = "absolute";
	s.background = params["cover_color"];
	s.border="1px solid Black";
	s.left=s.top="0px";
	s.width = s.height = params["cover_size"]+"px";
	s.z_index="100";
	s.filter="alpha(opacity=50)";
	s._moz_opacity="0.5";
	s.opacity="0.5";
	s.display="none";

	document.body.appendChild(this.cover);
	if(this.img)this.addEvent(this.img,"click",identifyimage.onclick,false);
	if(this.resetbutton)this.addEvent(this.resetbutton,"click",identifyimage.onreset,false);
	this.setinfo("0,0");
	
	window.identifyimage[params["image"]]=this;
}

identifyimage.prototype.coverat=function (x, y) {
	var s = this.cover.style;
	s.left = x + "px";
	s.top = y + "px";
	s.display="";
}

identifyimage.prototype.hide=function(){
	var s = this.cover.style;
	s.left=s.top="0px";
	s.display="none";
}

identifyimage.prototype.setinfo=function (str) {
	this.info.value=str;
}

identifyimage.onclick=function(ev){
	ev=ev||window.event;
	var el=ev.target||ev.srcElement;
	var idimage=window.identifyimage[el. id];
	mouseOffset=idimage.getMouseOffset(ev);
	var str=mouseOffset.x+','+mouseOffset.y;
	idimage.setinfo(str);
	idimage.coverat(mouseOffset.px-idimage.cover_size/2,mouseOffset.py-idimage.cover_size/2);
}

identifyimage.onreset=function(ev){
	ev=ev||window.event;
	var el=ev.target||ev.srcElement;
	var idimage=window.identifyimage[el.targetid];
	idimage.hide();
	idimage.setinfo("0,0");
	if(idimage.resetcallback)idimage.resetcallback(ev);
}

identifyimage.prototype.mouseCoords=function(ev){
	if(ev.pageX || ev.pageY)	return {x:ev.pageX, y:ev.pageY};
	return {x:ev.clientX+document.body.scrollLeft-document.body.clientLeft,y:ev.clientY+document.body.scrollTop-document.body.clientTop};
}

identifyimage.prototype.getPosition=function(e){
	var left=0;
	var top=0;

	while (e.offsetParent)
	{
		left+=e.offsetLeft;
		top+=e.offsetTop;
		e=e.offsetParent;
	}

	left+=e.offsetLeft;
	top+=e.offsetTop;

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

identifyimage.prototype.getMouseOffset=function(ev){
	var docPos=this.getPosition(this.img);
	var mousePos=this.mouseCoords(ev);
	return {x:mousePos.x-docPos.x, y:mousePos.y-docPos.y,px:mousePos.x,py:mousePos.y};
}
