BrowserDetector = {
    FlashEnabled:function(){
        try{
            return BrowserDetector.GetFlashPlayerVersion().major > 0;
        }catch(e){
            return "Unknown";
        }
    },
    GetFlashVersion:function(){
        return BrowserDetector.GetFlashPlayerVersion().string;
    },
    GetFlashPlayerVersion:function(){
	    var PlayerVersion = new BrowserDetector.PlayerVersion([0,0,0]);
	    if(navigator.plugins && navigator.mimeTypes.length){
		    var x = navigator.plugins["Shockwave Flash"];
		    if(x && x.description) {
			    PlayerVersion = new BrowserDetector.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));
		    }
	    }else if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0){ // if Windows CE
		    var axo = 1;
		    var counter = 3;
		    while(axo) {
			    try {
				    counter++;
				    axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+ counter);
				    PlayerVersion = new BrowserDetector.PlayerVersion([counter,0,0]);
			    } catch (e) {
				    axo = null;
			    }
		    }
	    } else { // Win IE (non mobile)
		    // do minor version lookup in IE, but avoid fp6 crashing issues
		    // see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
		    try{
			    var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		    }catch(e){
			    try {
				    var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
				    PlayerVersion = new BrowserDetector.PlayerVersion([6,0,21]);
				    axo.AllowScriptAccess = "always"; // error if player version < 6.0.47 (thanks to Michael Williams @ Adobe for this code)
			    } catch(e) {
				    if (PlayerVersion.major == 6) {
					    return PlayerVersion;
				    }
			    }
			    try {
				    axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			    } catch(e) {}
		    }
		    if (axo != null) {
			    PlayerVersion = new BrowserDetector.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));
		    }
	    }
	    return PlayerVersion;
    },
    PlayerVersion:function(arrVersion){
	    this.major = arrVersion[0] != null ? parseInt(arrVersion[0]) : 0;
	    this.minor = arrVersion[1] != null ? parseInt(arrVersion[1]) : 0;
	    this.rev = arrVersion[2] != null ? parseInt(arrVersion[2]) : 0;
	    this.string = this.major + '.' + this.minor + '.' + this.rev;
    },
    GetUsingFrames:function(){
        return top.location != location;
    },
    GetCurrentDate:function(){
        var now = new Date();
        return now.toString();
    },
    GetTimeZoneOffset:function(){
        var now = new Date();
        return -now.getTimezoneOffset()/60;
    },
    GetScreenResolution:function(){
        if(screen){
            return screen.width + 'x' + screen.height;
        }
        else{
            return '';
        }
    },
    GetLanguage:function(){
        if(navigator){
            if(navigator.userLanguage){
                return navigator.systemLanguage;
            }
            else if(navigator.userLanguage){
                return navigator.userLanguage;
            }
        }
        return '';
    },
    GetPlatform:function(){
        if (navigator && typeof(navigator.platform) != "undefined" && navigator.platform != "") {
            return navigator.platform;
        }
        else return '';
    },
    IsIn:function(s,t) {
        return t.indexOf(s) >= 0;
    },
    GetBrowser:function(){
        if(navigator && navigator.userAgent){
            var ua = navigator.userAgent.toLowerCase();
            function IsIn(s,t) { return t.indexOf(s) >= 0 };
            if (IsIn('msie',ua)) return 'Internet Explorer';
            if (IsIn('konqueror', ua)) return "Konqueror";
            if (IsIn('safari', ua)) return "Safari";
            if (IsIn('omniweb', ua)) return "OmniWeb";
            if (IsIn('k-meleon', ua)) return "K-Meleon";
            if (IsIn('opera', ua)) return "Opera";
            if (IsIn('webtv', ua)) return "WebTV";
            if (IsIn('icab', ua)) return "iCab"
            if (!IsIn('compatible',ua)) {
                var browser = "Netscape Navigator"
                if (typeof(navigator.product) != "undefined") {
                    browser = "Mozilla";
                    rv = navigator.userAgent.match(/([Mozilla ]?Fire\w+)\/([\w|\+.]+)/);
                    if (rv) {
                        browser += rv[1];
                    }
                }
                return browser;
            }
        }
        return '';
    },
    GetCpuClass:function(){
        return (navigator && navigator.cpuClass) ? navigator.cpuClass : '';
    },
    GetColorDepth:function(){
        return (screen && screen.colorDepth) ? screen.colorDepth : '';
    }
};

WebMetrics = {
    Capture:function(actionType, actionData){
        var captureRequest = WebMetrics.CaptureHandler;
        captureRequest += '?action=capture';
        captureRequest += '&systemInstanceId=' + escape(WebMetrics.SystemInstanceID);
        captureRequest += '&requestId=' + escape(WebMetrics.RequestID);
        captureRequest += '&sessionId=' + escape(WebMetrics.SessionID);
        captureRequest += '&visitorId=' + escape(WebMetrics.VisitorID);
        captureRequest += '&actionType=' + escape(actionType);
        captureRequest += '&actionData=' + escape(actionData);
        WebMetrics.SendRequestToHandler(captureRequest);
    },
    CaptureClientHit:function(actionType, actionData){
        var captureRequest = WebMetrics.CaptureHandler;
        captureRequest += '?action=capture';
        captureRequest += '&systemInstanceId=' + escape(WebMetrics.SystemInstanceID);
        captureRequest += '&requestId=' + escape(WebMetrics.RequestID);
        captureRequest += '&sessionId=' + escape(WebMetrics.SessionID);
        captureRequest += '&visitorId=' + escape(WebMetrics.VisitorID);
        captureRequest += '&jsEnabled=true';
        captureRequest += '&flashEnabled=' + BrowserDetector.FlashEnabled();
        captureRequest += '&flashVersion=' + BrowserDetector.GetFlashVersion();
        captureRequest += '&usingFrames=' + BrowserDetector.GetUsingFrames();
        captureRequest += '&timezoneOffset=' + BrowserDetector.GetTimeZoneOffset();
        captureRequest += '&screenResolution=' + BrowserDetector.GetScreenResolution();
        captureRequest += '&language=' + BrowserDetector.GetLanguage();
        captureRequest += '&browser=' + BrowserDetector.GetBrowser();
        captureRequest += '&platform=' + BrowserDetector.GetPlatform();
        captureRequest += '&cpuClass=' + BrowserDetector.GetCpuClass();
        captureRequest += '&colorDepth=' + BrowserDetector.GetColorDepth();
        captureRequest += '&actionType=' + escape(actionType);
        captureRequest += '&actionData=' + escape(actionData);
        WebMetrics.SendRequestToHandler(captureRequest);
    },
    CaptureSharedObjectVisitor:function(requestID, visitorID){
			
	var captureRequest = WebMetrics.CaptureHandler;
	var actionData = '';

        captureRequest += '?action=capture';
        captureRequest += '&systemInstanceId=' + escape(WebMetrics.SystemInstanceID);
        captureRequest += '&requestId=' + escape(WebMetrics.RequestID);
        captureRequest += '&sessionId=' + escape(WebMetrics.SessionID);
        captureRequest += '&visitorId=' + escape(visitorID);
        captureRequest += '&flashVersion=' + BrowserDetector.GetFlashVersion();
        captureRequest += '&actionType=' + 'flashVisitor';
        captureRequest += '&actionData=' + escape(actionData);
        
	//alert('flashVisitor' + ', data=' + actionData + ', request=' + captureRequest);
	    
        WebMetrics.SendRequestToHandler(captureRequest);
        
        WebMetrics.ResetVisitor(visitorID);
    },	
    ResetVisitor:function(visitorID){
	//alert(visitorID);
	WebMetrics.VisitorID = visitorID;
    },
    
    CaptureException:function(systemId,type,msg,method,parameters){
        var captureRequest = WebMetrics.CaptureHandler;
            captureRequest += '?action=logerror';
            captureRequest += '&systemInstanceId=' + systemId;
            captureRequest += '&requestId=' + escape(WebMetrics.RequestID);
            captureRequest += '&sessionId=' + escape(WebMetrics.SessionID);
            captureRequest += '&visitorId=' + escape(WebMetrics.VisitorID);
            captureRequest += '&type=' + (type?type:'');
            captureRequest += '&message=' + (msg?msg:'');
            captureRequest += '&method=' + (method?method:'');
            captureRequest += '&parameters=' + (parameters?parameters:'');
            //alert('captureRequest: ' + captureRequest);
        WebMetrics.SendRequestToHandler(captureRequest);
    },
    RegisterSubmissionEvent:function(formName, elementName){
        try{
            if(!WebMetrics.HasError){
                var element = document.getElementById(elementName);
                var form = document.forms[formName];
                if(element){
                    var submitDelegate = function(){
                        var dataLabel = elementName.replace('_','.');
                        var submissionData = dataLabel + ':' + WebMetrics.RetrieveFormValues(form);
                        WebMetrics.Capture('submission', submissionData);
                    };
                    //alert('delegate: ' + submitDelegate);
                    BindEvent(element, "onclick", submitDelegate);
                }
                else{
                    if(form){
                        var formSubmitDelegate = function(){
                            var submissionData = formName + ':' + WebMetrics.RetrieveFormValues(form);
                            WebMetrics.Capture('submission', submissionData);
                        };
                        BindEvent(form, 'onsubmit', formSubmitDelegate);
                    }
                    else{
                        throw new Error('Form undefined - formName: ' + (formName?formName:''));
                    }
                }
            }
        }
        catch(e){
            var params = 'formName|' + WebMetrics.GetNonEmpty(formName) + '||elementName|' + WebMetrics.GetNonEmpty(elementName);
            WebMetrics.CaptureException(WebMetrics.SystemInstanceID, 'RegistryException', e, 'WebMetrics.RegisterSubmissionEvent', params);
        }
    },
    RegisterMappedSubmissionEvent:function(formName, elementId, dataMap){
        try{
            if(!WebMetrics.HasError){
                if(dataMap){
                    var element = document.getElementById(elementId);
                    var form = document.forms[formName];
                    if(element){
                        var submitDelegate = function(){
                            var submissionData = '<object name="' + dataMap.Name + '">' + WebMetrics.RetrieveFormValuesById(dataMap.Data) + '</object>';
                            WebMetrics.Capture('submission', submissionData);
                        };
                        BindEvent(element, "onclick", submitDelegate);
                    }
                    else{
                        if(form){
                            var formSubmitDelegate = function(){
                                var submissionData = '<object name"' + formName + '">' + WebMetrics.RetrieveFormValues(form) + '</object>';
                                WebMetrics.Capture('submission', submissionData);
                            };
                            BindEvent(form, 'onsubmit', formSubmitDelegate);
                        }
                    }
                }
                else{
                    WebMetrics.RegisterSubmissionEvent(formName, elementId);
                }   
            }
        }
        catch(e){
            var params = 'formName|' + WebMetrics.GetNonEmpty(formName) + '||elementId|' + WebMetrics.GetNonEmpty(elementId);
            WebMetrics.CaptureException(WebMetrics.SystemInstanceID, 'RegistryException', e, 'WebMetrics.RegisterSubmissionEvent', params);
        }
    },
    RegisterEvent:function(elementName, actionType, actionData){
        try{
            if(!WebMetrics.HasError){
                var link = document.getElementById(elementName);
                if(link){
                    BindEvent(link, 'onclick', function(){ WebMetrics.Capture(actionType, actionData); });
                }
            }
        }
        catch(e){
            var params = 'elementName|' + WebMetrics.GetNonEmpty(elementName) + '||actionType|' + WebMetrics.GetNonEmpty(actionType) + '||actionData|' + WebMetrics.GetNonEmpty(actionData);
            WebMetrics.CaptureException(WebMetrics.SystemInstanceID, 'RegistryException', e, 'WebMetrics.RegisterEvent', params);
        }
    },
    RetrieveFormValues:function(form){
        try{
            var submissionData = '';
            if(form){
                for(var index=0; index < form.elements.length;index++){
                    var elem = form.elements[index];
                    if(elem                             // element is defined
                    && elem.name != ''                  // element is named
                    && elem.value != ''                 // element has a value
                    && elem.name.slice(0,2) != '__'     // element is NOT MS-generated
                    && (elem.type == 'checkbox'         // element is informational
                        || elem.type == 'hidden'
                        || elem.type == 'password'
                        || elem.type == 'radio'
                        || elem.type == 'select-one'
                        || elem.type == 'select-multiple'
                        || elem.type == 'text'
                        || elem.type == 'textarea'))
                    {
                        var elemName = elem.name.replace('$','.');
                        var elemValue = elem.value;
                        if(elem.type == 'checkbox' || elem.type == 'radio'){
                            elemValue = elem.checked;
                        }
                        if((elem.type == 'select-one' || elem.type == 'select-multiple') && elemValue == 'unselected')
                        {
                            elemValue = '';
                        }
                        submissionData += '<item name="' + elemName + '">' + elemValue + '</item>';
                    }
                }
            }
            return submissionData;
        }
        catch(e){
            var params = 'form|' + GetNonEmpty(form?form.id:'');
            WebMetrics.CaptureException(WebMetrics.SystemInstanceID, 'DataRetrievalException', e, 'WebMetrics.RetrieveFormValues', params);
        }
    },
    RetrieveFormValuesById:function(map){       // map = {  [logical data name 1]:{ id:[form element id 1], name:[form element name 1] },
        var submissionData = '';                //          [logical data name 2]:{ id:[form element id 2], name:[form element name 2] },
        if(map){                                //          ...
            for(var item in map)                //       }
            {
                var val = WebMetrics.GetElementValueById(map[item].id);
                submissionData += val?'<item name="' + item + '">' + val + '</item>':'';
            }
        }
        return submissionData;
    },
    GetNonEmpty:function(str){
        return (str?str:'');
    },
    PrintObject:function(obj){
        if(typeof(obj) == "string"){
            return "'" + obj + "'";
        }
        else if(typeof(obj) == "number" || typeof(obj) == "boolean"){
            return obj;
        }
        var print = '{ ';
        for(var elem in obj){
            print += WebMetrics.PrintObject(elem);
        }
        print += ' }';
    },
    GetElementValueById:function(id){
        var elem = document.getElementById(id);
        var elemValue = '';
        if(elem){
            elemValue = elem.value;
            if(elem.type == 'checkbox' || elem.type == 'radio')
            {
                elemValue = elem.checked;
            }
            if((elem.type == 'select-one' || elem.type == 'select-multiple') && elemValue == 'unselected')
            {
                elemValue = '';
            }
        }
        return elemValue;
    },
    SendRequestToHandler:function(request){
        var handlerImage=new Image(1,1);
        var uniqueSignature = Math.random().toString().replace('.','');
        var uniqueParam = '&differ=' + escape(uniqueSignature);
        handlerImage.src=request + uniqueParam;
        handlerImage.onload=function() { WebMetrics.RequestImageOnLoadHandler(); }
    },
    RequestImageOnloadHandler:function(){
        alert('RequestImageOnloadHandler()');
        return;
    },
    CaptureHandler:'',
    SystemInstanceID:'',
    Request:'',
    IP:'',
    RequestID:'',
    SessionID:'',
    Referrer:'',
    UserAgent:'',
    VisitorID:'',
    HasError:false
};

function BindEvent(bindingObject, bindingEvent, boundDelegate){
    var bindingEventValue = new String(bindingEvent);
    if (bindingObject.attachEvent){
	    bindingObject.attachEvent(bindingEvent, boundDelegate);
    } 
    else if (bindingObject.addEventListener){
	    bindingEventValue = bindingEventValue.toLowerCase().replace("on", "");
	    bindingObject.addEventListener(bindingEventValue, boundDelegate, false);
    }
}

