/*
 * $Id: utils.js $
 */

Cookies = {
    get: function(cookie_name) {
        var results = document.cookie.match('(^|;) ?'+cookie_name+'=([^;]*)(;|$)');
        
        if (results) {
            return (unescape(results[2]));
        }
        else {
            return undefined;
        }
    },
    set: function(name, value, exp_y, exp_m, exp_d, path, domain, secure) {
        var cookie_string = name + "=" + escape(value);
        
        if (exp_y) {
            var expires = new Date(exp_y, exp_m, exp_d);
            cookie_string += "; expires=" + expires.toGMTString();
        }

        if (path) {
            cookie_string += "; path=" + escape(path);
        }
        if (domain) {
            cookie_string += "; domain=" + escape(domain);
        }
        if (secure) {
            cookie_string += "; secure";
        }
        document.cookie = cookie_string;
    },
    del: function(cookie_name) {
        var cookie_date = new Date();  // current date & time
        cookie_date.setTime(cookie_date.getTime()-1);
        document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString();
    }
};

var BrowserDetect = {
    init: function () {
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
        || this.searchVersion(navigator.appVersion)
        || "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
    },
    searchString: function (data) {
        for (var i=0;i<data.length;i++)	{
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
                if (dataString.indexOf(data[i].subString) != -1)
                    return data[i].identity;
            }
            else if (dataProp)
                return data[i].identity;
        }
    },
    searchVersion: function (dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index == -1) return;
        return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
    },
    dataBrowser: [
        {
            string: navigator.userAgent,
            subString: "OmniWeb",
            versionSearch: "OmniWeb/",
            identity: "OmniWeb"
        },
        {
            string: navigator.vendor,
            subString: "Apple",
            identity: "Safari"
        },
        {
            prop: window.opera,
            identity: "Opera"
        },
        {
            string: navigator.vendor,
            subString: "iCab",
            identity: "iCab"
        },
        {
            string: navigator.vendor,
            subString: "KDE",
            identity: "Konqueror"
        },
        {
            string: navigator.userAgent,
            subString: "Firefox",
            identity: "Firefox"
        },
        {
            string: navigator.vendor,
            subString: "Camino",
            identity: "Camino"
        },
        {		// for newer Netscapes (6+)
            string: navigator.userAgent,
            subString: "Netscape",
            identity: "Netscape"
        },
        {
            string: navigator.userAgent,
            subString: "MSIE",
            identity: "Explorer",
            versionSearch: "MSIE"
        },
        {
            string: navigator.userAgent,
            subString: "Gecko",
            identity: "Mozilla",
            versionSearch: "rv"
        },
        { 		// for older Netscapes (4-)
            string: navigator.userAgent,
            subString: "Mozilla",
            identity: "Netscape",
            versionSearch: "Mozilla"
        }
    ],
    dataOS : [
        {
            string: navigator.platform,
            subString: "Win",
            identity: "Windows"
        },
        {
            string: navigator.platform,
            subString: "Mac",
            identity: "Mac"
        },
        {
            string: navigator.platform,
            subString: "Linux",
            identity: "Linux"
        }
    ]
    
};
BrowserDetect.init();

function toggleVisible(elem) {
    toggleElementClass("invisible", elem);
}

function makeVisible(elem) {
    removeElementClass(elem, "invisible");
}

function makeInvisible(elem) {
    addElementClass(elem, "invisible");
}

function isVisible(elem) {
    return !hasElementClass(elem, "invisible");
};

function isIE6() {
    return ((BrowserDetect.version == '6' || BrowserDetect.version == '5.5') && BrowserDetect.browser=='Explorer');
}

function isIE(){
    return (BrowserDetect.browser=='Explorer');
}

function Location(dplace) {
    var _address_full = '';
    var _address_hint = '';
    var _address_struct = [];
    var _x92 = null;
    var _y92 = null;
    var that = this;
    var _forced = false;
    
    this.update = function(ndata) {
        var s_ndata = ndata;
        if (ndata.serialize!=undefined && (typeof (ndata.serialize) == 'function')) {
            s_ndata = ndata.serialize();
            s_ndata.address_hint = ndata.getAddressHint();
        }
        _address_full  = s_ndata.address_full;
        _address_hint  = s_ndata.address_hint;
        _x92 = s_ndata.x92;
        _y92 = s_ndata.y92;
        if (s_ndata.address_struct != undefined) {
            _address_struct = s_ndata.address_struct;
        }
        else {
            _address_struct = []
        }
        _forced = (s_ndata.forced == true);
    }

    this.setAsForced = function() {
        _forced = true;
    }
    
    this.getAddressFull = function() {
        return _address_full
    };
    
    this.getAddressHint = function() {
        return _address_hint;
    }
    
    this.getX92 = function() {
        return _x92; 
    }

    this.getY92 = function() {
        return _y92;
    }

    this.isEmpty = function(){
        if ((_address_full == '') || (_address_full == undefined)) {
            return true;
        }
        else {
            return false;
        }
    }
    
    this.clear = function() {
        _address_full = '';
        _address_hint = '';
        _x92 = null;
        _y92 = null;
        _address_struct = [];
    }

    this.clone = function(nloc) {
        that.update(nloc.serialize());
        _address_hint = nloc.getAddressHint();
    }

    this.serialize = function() {
        if (_forced) {
            return {x92: _x92,
                    y92: _y92,
                    address_full: _address_full,
                    address_struct: _address_struct,
                    forced: true
                   }
        }
        else {
            return {x92: _x92,
                    y92: _y92,
                    address_full: _address_full,
                    address_struct: _address_struct
                   }
        }
    }

    this.serializeSWF = function (label,offset) {
        if (_x92>0 && _y92>0) {
            return [_x92,
                    _y92,
                    label,
                    offset];
        }
    }

    // real constructor
    if (dplace != undefined) {
        this.update(dplace);
    }
}

function Locations(names) {
    this.locations_keys = names;

    var swf_mappings = {};
    var that = this;
    for (var nameidx in names) {
        this[names[nameidx]] = new Location();
    }

    this.setSWFmapping = function(label,offset) {
        swf_mappings[label] = offset;
    }

    this.serializeSWF = function() {
        var result = [];
        var iteration = 0;
        for( loc_kid in that.locations_keys) {
            var kname = that.locations_keys[loc_kid];
            result[iteration] = 
                that[kname].serializeSWF(kname,
                                         (swf_mappings[kname]!=undefined) ? swf_mappings[kname] : iteration);
            iteration++;
        }
        return result;
    }
}

function EventMapper() {
    var listeners = {};
    var that = this;
    this.setListener = function(action,listener) {
        listeners[action] = listener;
    }
    this.getListener = function(action) {
        while (action.length>0) {
            if (listeners[action]!=undefined)
                return listeners[action];
            var test = action.match(/.*\..*/);
            if (action.match(/.*\..*/)) {
                action = action.replace(/\.[^\.]*$/i,'');
            }
            else {
                return;
            }
        }
    }
}

var selectPosition = null;

function setIE6SelectBoxCoverVisible(selectbox, state, hint_body) {
    
    if (isIE6() || (BrowserDetect.version == '7' && BrowserDetect.browser=='Explorer')) {
        
        if (state==true) {
            /*
                var margin = 0;
                if (hint_body == 'search_nearest_alt_addresses') {
                    //margin = 10;
                    //$(hint_body).parentNode.style.marginTop = - margin + 'px';
                } else if (hint_body == 'trace_route_from_alt_addresses_box' 
                    || hint_body == 'trace_route_to_alt_addresses_box'
                    || hint_body == 'trace_route_via_1_alt_addresses_box'
                    || hint_body == 'trace_route_via_2_alt_addresses_box'
                    || hint_body == 'trace_route_via_3_alt_addresses_box') {
                    //margin = 10
                    //$(hint_body).style.marginTop = -margin + 'px';
                } else if (hint_body == 'search_nearest_alt_addresses_box') {
                    //margin = 0
                    //$(hint_body).style.marginTop = margin + 'px';
                } else {
                    //margin = 0;
                    //$(hint_body).parentNode.style.marginTop = margin + 'px';
                }
            */
            var hint_bodySize = elementDimensions(hint_body);
            var hint_bodyPosition = elementPosition(hint_body);
            
            if (!selectPosition) {
                selectPosition = elementPosition(selectbox);	
            }
            
            if ((hint_pos = hint_bodySize.h + hint_bodyPosition.y) >= selectPosition.y) {
                makeInvisible(selectbox);
            }else {
                makeVisible(selectbox);
            }
        }
        else {
            makeVisible(selectbox);
        }
    }
    
}
