﻿
/* © 2008 by NT World 
 * Author : Phan Hoang Nhat
 * Address: K160/87 Tran Cao Van street, Danang city, Vietnam
 * Phone  : +84 934 782 003
 * Email  : hoangnhat1412@gmail.com
 * Version: 1.0
 */
/* --------- SPECIFICATION ---------
 * Phần này hoạt động HOÀN TOÀN ĐỘC LẬP và không phụ thuộc vào thư viện nào khác
 * Đây là hàm điều quản sự kiện cho bằng javascript.
 * Namespace : $event
 * Các thao tác thực hiện trên dom object.
 * Giao diện sử dụng :
 *      - add       : thêm một sự kiện
 *      - remove    : gỡ bỏ sự kiện
 *      - enable    : cho phép sự kiện hoạt động
 *      - disable   : không cho phép sự kiện hoạt động
 *      - addLoader : thêm vào hàm chạy lúc khởi động, CHÚ Ý: xem hàm loadExec
 * Các hàm hỗ trợ
 *      - createArgs: tạo đối tượng args
 *      - loadExec  : phải chạy ở vị trí cuối cùng trong trang dạng $event.loadExec nếu có dùng addLoader
 */
var $event={};
$event.add=function(target,eventType,handler,isSort){if(!target.events)target.events={};var obj=target.events[eventType];if(!obj)target.events[eventType]=obj=[];var index=obj.length;var nextID=-1;for(var i=0;i<index;i++){if(obj[i]==null){nextID=i;break;}}if(nextID==-1)nextID=index;var valid=true;for(var i=0; i<index; i++){if(obj[i]!=null&&obj[i].handler===handler){valid=false;break;}}if(valid){var manager;if(target.addEventListener){manager=function(e){var eObj=target.events[eventType];if(eObj[nextID].enable) return handler(target,$event.createArgs(e,target,false));};target.addEventListener(eventType,manager,false);}else if(target.attachEvent){manager=function(e){var eObj=target.events[eventType];if(eObj[nextID].enable)return handler(target,$event.createArgs(window.event,target,true));
};if(isSort==undefined)isSort=false;target.attachEvent("on"+eventType,manager);if(isSort){var events=obj;for(var i=0,l=obj.length;i<l-1;i++){for(var j=i+1;j<l;j++){if(events[i].index<events[j].index){var tmp=events[i];events[i]=events[j];events[j]=tmp;}}}for(var i=0,l=events.length;i<l;i++){target.detachEvent("on"+eventType,obj[i].manager);target.attachEvent("on"+eventType,events[i].manager);}}}obj[nextID]={enable:true,handler:handler,index:index,manager:manager};}};
$event.remove=function(target,eventType,handler){var manager=null;var obj=target.events[eventType];for(var i=0,l=obj.length;i<l;i++){if(obj[i]!=null&&obj[i].handler===handler){manager=obj[i].manager;break;}}if(manager!=null){if(target.removeEventListener)target.removeEventListener(eventType,manager,false);else if(target.detachEvent)target.detachEvent("on"+eventType,manager);obj[i]=null;}}
$event.disable=function(target,eventType,handler){var obj=target.events[eventType];for(var i=0,l=obj.length;i<l;i++){if(obj[i]!=null&&obj[i].handler===handler){obj[i].enable=false;break;}}};
$event.enable=function(target,eventType,handler){var obj=target.events[eventType];for(var i=0,l=obj.length;i<l;i++){if(obj[i]!=null&&obj[i].handler===handler){obj[i].enable=true;break;}}};
$event.addLoader=function(handler,index){var objs=window.loaders;if(!objs)window.loaders=objs=[];if(!index)index=objs.length;objs[objs.length]={handler:handler,index:index};};
$event.loadExec=function(isRemove){var objs=window.loaders;if(objs){for(var i=0,l=objs.length;i<l-1;i++){for(var j=i+1;j<l;j++){if(objs[i].index>objs[j].index){var tmp=objs[i];objs[i]=objs[j];objs[j]=tmp;}}}for(var i=0,l=objs.length;i<l;i++){objs[i].handler();}if(isRemove==undefined)isRemove=true;if(isRemove)window.loaders=undefined;}};
$event.buildArgs=function(args,target,browser){
if(browser.IE){
args.rightButton=false;args.leftButton=false;args.scrollButton=false;
var button=args.button;
if(button==2){args.rightButton=true;args.mouseButton=2;}
else if(button==4){args.scrollButton=true;args.mouseButton=1;}
else{args.leftButton=true;args.mouseButton=0;}
args.viewX=args.clientX;
args.viewY=args.clientY;
var tmp;
if(typeof document.documentElement.scrollTop!="undefined"&&document.documentElement.scrollTop>0){
tmp=[document.documentElement.scrollLeft,document.documentElement.scrollTop];
}else if(typeof document.body.scrollTop!="undefined") {tmp=[document.body.scrollLeft,document.body.scrollTop];}args.pageX=args.viewX + tmp[0];args.pageY=args.viewY + tmp[1];tmp=[0,0];var e=target;while(e!=null){tmp[0]+=e.offsetLeft;tmp[1]+=e.offsetTop;e=e.offsetParent;}
args.innerX=args.viewX-tmp[0];args.innerY=args.viewY-tmp[1];}else{args.rightButton=false;args.leftButton=false;args.scrollButton=false;args.mouseButton=args.button;
if(args.button==2)args.rightButton=true;else if(args.button==1)
args.scrollButton=true;else args.leftButton=true;args.viewX=args.clientX;
args.viewY=args.clientY;var tmp=[0,0];var e=target;while(e!=null){tmp[0]+=e.offsetLeft;tmp[1]+=e.offsetTop;e=e.offsetParent;}args.innerX=args.viewX-tmp[0];
args.innerY=args.viewY-tmp[1];}return args;};$event.createArgs=function(event,target,isIE){
event.stopUpper=function(){if(typeof event.stopPropagation != "undefined") {
event.stopPropagation();}else{event.cancelBubble = true;}};
event.stopDefault=function(){event.returnValue = false;if(typeof event.preventDefault!="undefined"){event.preventDefault();}};
event.build=function(){if(isIE)event=$event.buildArgs(event,target,{version:"",IE:true,FF:false,CH:false,OP:false,SF:false});
else{var x=window.navigator.userAgent.toLowerCase();
if(x.indexOf("firefox")!=-1)event=$event.buildArgs(event,target,{version:"",IE:false,FF:true,CH:false,OP:false,SF:false});
else if(x.indexOf("chrome")!=-1)event=$event.buildArgs(event,target,{version:"",IE:false,FF:false,CH:true,OP:false,SF:false});
else if(x.indexOf("opera")!=-1)event=$event.buildArgs(event,target,{version:"",IE:false,FF:false,CH:false,OP:true,SF:false});
else if(x.indexOf("safari")!=-1)event=$event.buildArgs(event,target,{version:"",IE:false,FF:false,CH:false,OP:false,SF:true});
else if(x.indexOf("msie")!=-1)event=$event.buildArgs(event,target,{version:"",IE:true,FF:false,CH:false,OP:false,SF:false});
else event=$event.buildArgs(event,target,{version:"",IE:false,FF:true,CH:false,OP:false,SF:false});
}};return event;}; 
