﻿//Copyright Set-Soft A.Ş.
//http://www.set-soft.com 

///<reference path="Type.js" />

TYPE.registerNamespace('Web.Core');

Web.Core.Browser=function()
{
    this.appName=window.navigator.appName;
    this.name='';
    this.version=0;
    
    this.getCookieEnabled=function()
    {
        return window.navigator.cookieEnabled;
    }
    
    this.__initialize=function()
    {
        var userAgentStr = window.navigator.userAgent;
        var s = new String();
        s = userAgentStr;
        if(s.indexOf('MSIE 6.0',0) != -1)
        {
            this.name = "IE";
            this.version = '6';
        }
        else if(s.indexOf('MSIE 7.0',0) != -1)
        {
            this.name="IE";
            this.version = '7';
        }
        else if (s.indexOf('MSIE 8.0', 0) != -1) {
            this.name = "IE";
            this.version = '8';
        }
        else if(s.indexOf('Firefox',0) != -1)
        {
            this.name='Firefox';
            this.version=s.substr(s.indexOf('Firefox') + 8,3); 
        }
        else if(s.indexOf('Opera',0) != -1)
        {
            this.name='Opera';
            this.version=s.substr(s.indexOf('Opera') + 6,3); 
        }
    }
    
    this.is=function(name,vers)
    {
        return this.name == name && this.version == vers;
    }
    
    this.__initialize();
}

Web.Core.BrowserManager=function()
{
    this.browser=new Web.Core.Browser();
    
    this.statiscs={};
    this.statiscs.totalCreatedDomElementCount=0;
    this.statiscs.totalAttachedEventCount=0;
    this.statiscs.totalDetachedEventCount=0;
    this.statiscs.totalPreLoadedImageCount=0;
    
    this.getElementById=function(id)
    {
        return document.getElementById(id);    
    }
    
    this.createElement=function(tagName)
    {
        this.statiscs.totalCreatedDomElementCount++;
        return document.createElement(tagName);
    }
    
    this.findElementPos=function(coord,obj)
    {
        try
        {
              var curleft = 0;
              if (obj.offsetParent){
                while (obj.offsetParent){
                  if (coord == 'x') {curleft += obj.offsetLeft;}
                  else {curleft += obj.offsetTop}
                  obj = obj.offsetParent;
                }
              }
              else if (obj.coord)
              {
                  curleft += obj.coord;
              }
        }
        catch(ex)
        {
            alert(ex.message);
        }   
	
	    return curleft;
    }
    
    this.attachEvent=function(element,eventName,targetFunction)
    {
        if(navigator.appName.indexOf('Netscape') != -1)
        {
            if(eventName.substr(0,2)=='on')
                eventName = eventName.substr(2,eventName.length-2);
            
            element.addEventListener(eventName,targetFunction, true);
        }
        else
        {
            if(eventName.substr(0,2)!='on')
                eventName = 'on' + eventName;
            element.attachEvent(eventName,targetFunction);
        }
        this.statiscs.totalAttachedEventCount++;
    }
    
    this.detachEvent=function(element,eventName,targetFunction)
    {
        if(navigator.appName.indexOf('Netscape') != -1)
        {
            if(eventName.substr(0,2)=='on')
                eventName = eventName.substr(2,eventName.length-2);
            
            element.removeEventListener(eventName,targetFunction,true);
        }
        else
        {
            if(eventName.substr(0,2)!='on')
                eventName = 'on' + eventName;
            element.detachEvent(eventName,targetFunction);
        }
        this.statiscs.totalDetachedEventCount++;
    }
    
    this.setCookie=function(name,value)
    {
        document.cookie = name+"="+value;  
    }
    
    this.getCookie=function(name)
    {
        var search = name + "="
	    var returnvalue = "";
	
	    if (document.cookie.length > 0) {
		    offset = document.cookie.indexOf(search)

		    if (offset != -1) { 
			    offset += search.length
    	
			    end = document.cookie.indexOf(";", offset);
    	
			    if (end == -1) end = document.cookie.length;
				    returnvalue=unescape(document.cookie.substring(offset, end));
		    }
	    }
        return returnvalue;
    }
    
    this.preLoadImage=function(src)
    {
        var img = new Image();
        img.src=src;
    }
}

Web.Core.Error=function(message)
{
    this.message=message;
}

Web.Core.Error.prototype.toString=function()
{
    return this.message;
}

Web.Core.EventHandlerInfo = function(object,handler)
{
    this.obj = object;
    this.handler = handler;
    this.isMatch=function(obj,hnd)
    {
        return (this.obj === obj && this.handler === hnd);
    }
}

Web.Core.CancelEventArgs = function(args)
{
    this.cancel = false;
    this.cancelBubble = false;
    this.args = args;
}

Web.Core.Event = function(owner,cancelable)
{
    this.ownerObj = owner;
    this.cancelable = (cancelable == true) ? true : false;
    this.handlers = new Array();
    
    this.addHandler = function(obj,handler)
    {
        if(this.handlerExists(obj,handler)==-1)
            this.handlers.push(new Web.Core.EventHandlerInfo(obj,handler));
    }
    
    this.removeHandler = function(obj,handler)
    {
        if(this.handlerExists(obj,handler) != -1)
            this.handlers.splice(this.handlerExists(obj,handler),1);
    }
    
    this.handlerExists=function(obj,handler)
    {
        for(var s=0;s<this.handlers.length;s++)
            if(this.handlers[s].isMatch(obj,handler))
                return s;
        return -1;
    }
    
    this.fire = function(args)
    {
        if(this.handlers.length != 0)
        {
            var cancelled = false;
            try
            {
                for(var i=0;i<this.handlers.length;i++)
                {
                    var info = this.handlers[i];
                    if(this.cancelable)
                    {
                        var e = new Web.Core.CancelEventArgs(args);
                        info.handler.call(info.obj,this.ownerObj,e);
                        cancelled = e.cancel;
                        if(e.cancelBubble==true)
                        {
                            return e.cancel;
                        }
                    }
                    else
                    {
                        info.handler.call(info.obj,this.ownerObj,args);
                    }
                }
            }
            catch(ex)
            {
            }
            if(this.cancelable)return cancelled; 
        }    
    }
    
    this.dispose = function()
    {
        this.handlers=null;
        this.ownerObj = null;
    }
}

Web.Core.Event.generalEvents = new Array();

Web.Core.Event.GeneralEventInfo = function(name)
{
    this.handlers = new Array();
    this.name = name;
}

Web.Core.Event.getEventIndex=function(eventName)
{
    for(var i=0;i<Web.Core.Event.generalEvents.length;i++)
    {
        if(Web.Core.Event.generalEvents[i].name == eventName)
            return i;
    }
    return -1;
}

Web.Core.Event.getOrCreateEvent = function(name)
{
    var targetEvent = null;
    if(Web.Core.Event.getEventIndex(name) == -1)
    {
        var evt = new Web.Core.Event.GeneralEventInfo(name);
        Web.Core.Event.generalEvents.push(evt);
        targetEvent = evt;
    }
    else
    {
        targetEvent = Web.Core.Event.generalEvents[Web.Core.Event.getEventIndex(name)];
    }
    return targetEvent;
}

Web.Core.Event.addHandler=function(name,object,handler)
{
    var targetEvent = Web.Core.Event.getOrCreateEvent(name);
    var handler = new Web.Core.EventHandlerInfo(object,handler);
    for(var i=0;i<targetEvent.handlers.length;i++)
        if(targetEvent.handlers[i].isMatch(object,handler))
            return;
    targetEvent.handlers.push(handler);
}

Web.Core.Event.fire=function(name,sender,args)
{
    var targetEvent = Web.Core.Event.getOrCreateEvent(name);
    for(var i=0;i<targetEvent.handlers.length;i++)
    {
        var handler = targetEvent.handlers[i];
        try{handler.handler.call(handler.obj,sender,args);}catch(ex){};
    }    
}


