var sUserAgent = navigator.userAgent;
var fAppVersion = parseFloat(navigator.appVersion);

function compareVersions(sVersion1, sVersion2) {

    var aVersion1 = sVersion1.split(".");
    var aVersion2 = sVersion2.split(".");
    
    if (aVersion1.length > aVersion2.length) {
        for (var i=0; i < aVersion1.length - aVersion2.length; i++) {
            aVersion2.push("0");
        }
    } else if (aVersion1.length < aVersion2.length) {
        for (var i=0; i < aVersion2.length - aVersion1.length; i++) {
            aVersion1.push("0");
        }    
    }
    
    for (var i=0; i < aVersion1.length; i++) {
 
        if (aVersion1[i] < aVersion2[i]) {
            return -1;
        } else if (aVersion1[i] > aVersion2[i]) {
            return 1;
        }    
    }
    return 0;

}

var isOpera = sUserAgent.indexOf("Opera") > -1;
var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;
var isChrome = sUserAgent.indexOf("Chrome") > -1;

if (isOpera) {
    var fOperaVersion;
    if(navigator.appName == "Opera") {
        fOperaVersion = fAppVersion;
    } else {
        var reOperaVersion = new RegExp("Opera (\\d+\\.\\d+)");
        reOperaVersion.test(sUserAgent);
        fOperaVersion = parseFloat(RegExp["$1"]);
    }

    isMinOpera4 = fOperaVersion >= 4;
    isMinOpera5 = fOperaVersion >= 5;
    isMinOpera6 = fOperaVersion >= 6;
    isMinOpera7 = fOperaVersion >= 7;
    isMinOpera7_5 = fOperaVersion >= 7.5;
}

var isKHTML = sUserAgent.indexOf("KHTML") > -1 
              || sUserAgent.indexOf("Konqueror") > -1 
              || sUserAgent.indexOf("AppleWebKit") > -1; 
              
var isMinSafari1 = isMinSafari1_2 = false;
var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;
var isSafari;
if (isKHTML) {
    isSafari = sUserAgent.indexOf("AppleWebKit") > -1;
    isKonq = sUserAgent.indexOf("Konqueror") > -1;

    if (isSafari) {
        var reAppleWebKit = new RegExp("AppleWebKit\\/(\\d+(?:\\.\\d*)?)");
        reAppleWebKit.test(sUserAgent);
        var fAppleWebKitVersion = parseFloat(RegExp["$1"]);

        isMinSafari1 = fAppleWebKitVersion >= 85;
        isMinSafari1_2 = fAppleWebKitVersion >= 124;
    } else if (isKonq) {

        var reKonq = new RegExp("Konqueror\\/(\\d+(?:\\.\\d+(?:\\.\\d)?)?)");
        reKonq.test(sUserAgent);
        isMinKonq2_2 = compareVersions(RegExp["$1"], "2.2") >= 0;
        isMinKonq3 = compareVersions(RegExp["$1"], "3.0") >= 0;
        isMinKonq3_1 = compareVersions(RegExp["$1"], "3.1") >= 0;
        isMinKonq3_2 = compareVersions(RegExp["$1"], "3.2") >= 0;
    } 
    
}

var isIE = sUserAgent.indexOf("compatible") > -1 
           && sUserAgent.indexOf("MSIE") > -1
           && !isOpera;
           
var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = false;

if (isIE) {
    var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
    reIE.test(sUserAgent);
    var fIEVersion = parseFloat(RegExp["$1"]);
	
    isMinIE4 = fIEVersion >= 4;
    isMinIE5 = fIEVersion >= 5;
    isMinIE5_5 = fIEVersion >= 5.5;
    isMinIE6 = fIEVersion >= 6.0;
	isMinIE7 = fIEVersion >= 7.0;
	isMinIE8 = fIEVersion >= 8.0;

}

var isMoz = sUserAgent.indexOf("Gecko") > -1
            && !isKHTML;

var isMinMoz1 = sMinMoz1_4 = isMinMoz1_5 = false;

if (isMoz) {
    var reMoz = new RegExp("rv:(\\d+\\.\\d+(?:\\.\\d+)?)");
    reMoz.test(sUserAgent);
    isMinMoz1 = compareVersions(RegExp["$1"], "1.0") >= 0;
    isMinMoz1_4 = compareVersions(RegExp["$1"], "1.4") >= 0;
    isMinMoz1_5 = compareVersions(RegExp["$1"], "1.5") >= 0;
	isMinMoz1_8 = compareVersions(RegExp["$1"], "1.8") >= 0;		//mainly used by firefox 2.0
	isMinMoz1_9 = compareVersions(RegExp["$1"], "1.9") >= 0;		//mainly used by firefox 3.0
}

var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML 
            && (sUserAgent.indexOf("Mozilla") == 0) 
            && (navigator.appName == "Netscape") 
            && (fAppVersion >= 4.0 && fAppVersion < 5.0);

var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = false;

if (isNS4) {
    isMinNS4 = true;
    isMinNS4_5 = fAppVersion >= 4.5;
    isMinNS4_7 = fAppVersion >= 4.7;
    isMinNS4_8 = fAppVersion >= 4.8;
}

var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") 
            || (navigator.platform == "Macintosh");

var isUnix = (navigator.platform == "X11") && !isWin && !isMac;

var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;
var isMac68K = isMacPPC = false;
var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = false;

if (isWin) {
    isWin95 = sUserAgent.indexOf("Win95") > -1 
              || sUserAgent.indexOf("Windows 95") > -1;
    isWin98 = sUserAgent.indexOf("Win98") > -1 
              || sUserAgent.indexOf("Windows 98") > -1;
    isWinME = sUserAgent.indexOf("Win 9x 4.90") > -1 
              || sUserAgent.indexOf("Windows ME") > -1;
    isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 
              || sUserAgent.indexOf("Windows 2000") > -1;
    isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 
              || sUserAgent.indexOf("Windows XP") > -1;
    isWinNT4 = sUserAgent.indexOf("WinNT") > -1 
              || sUserAgent.indexOf("Windows NT") > -1 
              || sUserAgent.indexOf("WinNT4.0") > -1 
              || sUserAgent.indexOf("Windows NT 4.0") > -1 
              && (!isWinME && !isWin2K && !isWinXP);
} 

if (isMac) {
    isMac68K = sUserAgent.indexOf("Mac_68000") > -1 
               || sUserAgent.indexOf("68K") > -1;
    isMacPPC = sUserAgent.indexOf("Mac_PowerPC") > -1 
               || sUserAgent.indexOf("PPC") > -1;  
}

if (isUnix) {
    isSunOS = sUserAgent.indexOf("SunOS") > -1;

    if (isSunOS) {
        var reSunOS = new RegExp("SunOS (\\d+\\.\\d+(?:\\.\\d+)?)");
        reSunOS.test(sUserAgent);
        isMinSunOS4 = compareVersions(RegExp["$1"], "4.0") >= 0;
        isMinSunOS5 = compareVersions(RegExp["$1"], "5.0") >= 0;
        isMinSunOS5_5 = compareVersions(RegExp["$1"], "5.5") >= 0;
    }
}


var EventUtil = new Object;

EventUtil.addEventHandler = function (oTarget, sEventType, fnHandler) {
    if (oTarget.addEventListener) {
		if(isMoz && sEventType == "mousewheel"){
			oTarget.addEventListener("DOMMouseScroll", fnHandler, false);
		}
		else
		{
        	oTarget.addEventListener(sEventType, fnHandler, false);
		}
    } else if (oTarget.attachEvent) {
        oTarget.attachEvent("on" + sEventType, fnHandler);
    } else {
        oTarget["on" + sEventType] = fnHandler;
    }
};
        
EventUtil.removeEventHandler = function (oTarget, sEventType, fnHandler) {
    if (oTarget.removeEventListener) {
        oTarget.removeEventListener(sEventType, fnHandler, false);
    } else if (oTarget.detachEvent) {
        oTarget.detachEvent("on" + sEventType, fnHandler);
    } else { 
        oTarget["on" + sEventType] = null;
    }
};

EventUtil.formatEventForIE = function (oEvent) {
    if (isIE && isWin) {
        oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
        oEvent.eventPhase = 2;
        oEvent.isChar = (oEvent.charCode > 0);
		
		oEvent.pageX = oEvent.clientX + document.documentElement.scrollLeft;
		oEvent.pageY = oEvent.clientY + document.documentElement.scrollTop;
		
        oEvent.preventDefault = function () {
            this.returnValue = false;
        };

        if (oEvent.type == "mouseout") {
            oEvent.relatedTarget = oEvent.toElement;
        } else if (oEvent.type == "mouseover") {
            oEvent.relatedTarget = oEvent.fromElement;
        }
		oEvent.relativeX = oEvent.x;
		oEvent.relativeY = oEvent.y;
		oEvent.mouseDelta = -oEvent.wheelDelta / 120;
		
        oEvent.stopPropagation = function () {
            this.cancelBubble = true;
        };

        oEvent.target = oEvent.srcElement;
        oEvent.time = (new Date).getTime();
    }
	
    return oEvent;
};

EventUtil.formatEventForDOMCompilant = function (oEvent) {
	// this is written for a bug in firefox 2.0. DomMouseScroll returns the right coordinates using screenX instead of pageX.
	if(oEvent.type == "DOMMouseScroll" && isMoz && !isMinMoz1_9){		
		if (AnkhUsefulMethods.getStyle(oEvent.currentTarget, "overflow") == "hidden") {
			//this is required if overflow = hidden
			oEvent.relativeX = oEvent.screenX + window.pageXOffset - this.findPosX(oEvent.currentTarget);
			oEvent.relativeY = oEvent.screenY + window.pageYOffset - this.findPosY(oEvent.currentTarget);
		}
		else {			//this is required if overflow = auto. Not tested with scroll yet.
			oEvent.relativeX = oEvent.screenX + window.pageXOffset;
			oEvent.relativeY = oEvent.screenY + window.pageYOffset;
		}
	}
	else{
		oEvent.relativeX = oEvent.pageX - this.findPosX(oEvent.currentTarget) ;		
		oEvent.relativeY = oEvent.pageY - this.findPosY(oEvent.currentTarget) ;
	}
	if(isMoz){
		oEvent.mouseDelta = oEvent.detail / 3;
	}else if(isKHTML) {
		oEvent.mouseDelta = -oEvent.wheelDelta / 120;
	}		
	else if(isOpera) {
		oEvent.mouseDelta = oEvent.wheelDelta / 120;
	}
	return oEvent;
};

EventUtil.findPosY = function(obj) {
	var curtop = 0;	
	if (obj != null) {
		if (obj.offsetParent != null) {
			while (obj.offsetParent) {
				curtop += obj.offsetTop
				obj = obj.offsetParent;
			}
		}
		else 
			if (obj.y) {
				curtop += obj.y;
			}
	}
	return curtop;
};

EventUtil.findPosX =function(obj) {
	var curleft = 0;
	if (obj != null) {
		if (obj.offsetParent != null) {
			while (obj.offsetParent) {
				curleft += obj.offsetLeft
				obj = obj.offsetParent;
			}
		}
		else 
			if (obj.x) {
				curleft += obj.x;
			}
	}
	return curleft;
};

EventUtil.getEvent = function(iframe) {
    if (isIE) {
		if(window.event){
        	return this.formatEventForIE(window.event);
		}
		else{
			return this.formatEventForIE(iframe.contentWindow.event);	
		}
    }
	else {
        return this.formatEventForDOMCompilant(EventUtil.getEvent.caller.arguments[0]);
    }
};

/**
 * Purpose: Draw Sprite
 * @param {String} spriteImg
 * @param {Int} width
 * @param {Int} height
 * @param {Object} normSrcXY - {x,y} object
 * @param {Object} mouseOverSrcXY  - {x,y} object
 * @param {Object} mouseDownSrcXY  - {x,y} object
 * @param {Boolean} selected  - currently mouse-down
 * @param {Boolean} onceDownAlwaysDown - once mouse down, it will forever be mouse down
 */
Sprite = function(spriteImg,width,height,normSrcXY,mouseOverSrcXY,mouseDownSrcXY,selected,onceDownAlwaysDown){
	var sprite = document.createElement('div');		
	sprite.mouseOverSrcXY = mouseOverSrcXY;
	sprite.normSrcXY = normSrcXY;
	sprite.mouseDownSrcXY = mouseDownSrcXY;
	sprite.selected = selected;
	sprite.isMouseOver = selected;
	var x;
	var y;
	if (sprite.selected) {
		x = -mouseDownSrcXY.x;
		y = -mouseDownSrcXY.y;	
	}
	else{
		x = -normSrcXY.x;
		y = -normSrcXY.y;	
	}
	sprite.style.background = "url('" + spriteImg + "') "+x+"px"+" "+y+"px "+" no-repeat";		
	sprite.style.width = width + "px";
	sprite.style.height = height + "px";		
	
	if (normSrcXY && mouseOverSrcXY && mouseDownSrcXY) {
		EventUtil.addEventHandler(sprite, "mouseover", function x(){
			if (!EventUtil.getEvent().target.selected && EventUtil.getEvent().target.mouseOverSrcXY) {
				var x = -EventUtil.getEvent().target.mouseOverSrcXY.x;
				var y = -EventUtil.getEvent().target.mouseOverSrcXY.y;			
				if (isIE) {
					EventUtil.getEvent().target.style.backgroundPositionX = x + "px";
					EventUtil.getEvent().target.style.backgroundPositionY = y + "px";
				}
				else {
					EventUtil.getEvent().target.style.background = "url('" + spriteImg + "') " + x + "px" + " " + y + "px " + " no-repeat";
				}
				sprite.isMouseOver = true;				
			}
		});
	
		EventUtil.addEventHandler(sprite, "mouseout", function x(){
			if (!EventUtil.getEvent().target.selected && EventUtil.getEvent().target.normSrcXY) {								
				var x = -EventUtil.getEvent().target.normSrcXY.x;
				var y = -EventUtil.getEvent().target.normSrcXY.y;				
				if (isIE) {
					EventUtil.getEvent().target.style.backgroundPositionX = x + "px";
					EventUtil.getEvent().target.style.backgroundPositionY = y + "px";
				}
				else {
					EventUtil.getEvent().target.style.background = "url('" + spriteImg + "') " + x + "px" + " " + y + "px " + " no-repeat";
				}
				sprite.isMouseOver = false;				
			}
		});
			
		EventUtil.addEventHandler(sprite, "mousedown", function x(){
			
			if((EventUtil.getEvent().button == 1 && isIE) || (EventUtil.getEvent().button == 0 && !isIE)){			//if left mouse button
				if (!EventUtil.getEvent().target.selected && EventUtil.getEvent().target.mouseDownSrcXY) {				
					var x = -EventUtil.getEvent().target.mouseDownSrcXY.x;
					var y = -EventUtil.getEvent().target.mouseDownSrcXY.y;			
					if (isIE) {
						EventUtil.getEvent().target.style.backgroundPositionX = x + "px";
						EventUtil.getEvent().target.style.backgroundPositionY = y + "px";
					}
					else {
						EventUtil.getEvent().target.style.background = "url('" + spriteImg + "') " + x + "px" + " " + y + "px " + " no-repeat";
					}
				}
				if(onceDownAlwaysDown){
					EventUtil.getEvent().target.selected = true;
				}
			}
		});
		if (!onceDownAlwaysDown) {
			EventUtil.addEventHandler(sprite, "mouseup", function x(){
				if (!EventUtil.getEvent().target.selected) {
					var x = -EventUtil.getEvent().target.normSrcXY.x;
					var y = -EventUtil.getEvent().target.normSrcXY.y;					
					if (isIE) {
						EventUtil.getEvent().target.style.backgroundPositionX = x + "px";
						EventUtil.getEvent().target.style.backgroundPositionY = y + "px";
					}
					else {
						EventUtil.getEvent().target.style.background = "url('" + spriteImg + "') " + x + "px" + " " + y + "px " + " no-repeat";
					}
				}
			});
		}
	}
	sprite.activateMouseOver = function(){
		if (!sprite.selected) {
			var x = -sprite.mouseOverSrcXY.x;
			var y = -sprite.mouseOverSrcXY.y;			
			if (isIE) {
				sprite.style.backgroundPositionX = x + "px";
				sprite.style.backgroundPositionY = y + "px";
			}
			else {
				sprite.style.background = "url('" + spriteImg + "') " + x + "px" + " " + y + "px " + " no-repeat";
			}
			sprite.isMouseOver = true;
		}
	};
	sprite.activateMouseOut = function(){
		if (!sprite.selected) {								
			var x = -sprite.normSrcXY.x;
			var y = -sprite.normSrcXY.y;				
			if (isIE) {
				sprite.style.backgroundPositionX = x + "px";
				sprite.style.backgroundPositionY = y + "px";
			}
			else {
				sprite.style.background = "url('" + spriteImg + "') " + x + "px" + " " + y + "px " + " no-repeat";
			}
			sprite.isMouseOver = false;
		}
	};
	sprite.activateMouseClick = function(){
		if (!sprite.selected) {								
			var x = -sprite.mouseDownSrcXY.x;
			var y = -sprite.mouseDownSrcXY.y;				
			if (isIE) {
				sprite.style.backgroundPositionX = x + "px";
				sprite.style.backgroundPositionY = y + "px";
			}
			else {
				sprite.style.background = "url('" + spriteImg + "') " + x + "px" + " " + y + "px " + " no-repeat";
			}
			sprite.isMouseOver = false;
		}
	};
	return sprite;
};
