/**
 * http.js: utilities for scripted HTTP requests
 *
 * From the book JavaScript: The Definitive Guide, 5th Edition,
 * by David Flanagan. Copyright 2006 O'Reilly Media, Inc. (ISBN: 0596101996)
 */

var HTTP;
if (HTTP && (typeof HTTP != "object" || HTTP.NAME))
    throw new Error("Namespace 'HTTP' already exists");

HTTP = {};
HTTP.NAME = "HTTP";    // The name of this namespace
HTTP.VERSION = 1.0;    // The version of this namespace

HTTP._factories = [
    function() {
        return new XMLHttpRequest();
    },
    function() {
        return new ActiveXObject("Msxml2.XMLHTTP");
    },
    function() {
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
    ];

HTTP._factory = null;
HTTP.newRequest = function() {
    if (HTTP._factory != null) return HTTP._factory();

    for(var i = 0; i < HTTP._factories.length; i++) {
        try {
            var factory = HTTP._factories[i];
            var request = factory();
            if (request != null) {
                HTTP._factory = factory;
                return request;
            }
        }
        catch(e) {
            continue;
        }
    }
    HTTP._factory = function() {
        throw new Error("XMLHttpRequest not supported");
    }
    HTTP._factory(); // Throw an error
}


HTTP.redirect = function(where){
    window.location = where;
}

HTTP.getText = function(url, callback, div, div2, scroll) {
    var request = HTTP.newRequest();
    if(url.indexOf("?")>=0){
        url +=  "&dummy=" + new Date().getTime();
    }else{
        url += "?dummy=" + new Date().getTime();
    }
    request.onreadystatechange = function() {
        if (request.readyState == 4 && true){
            if(callback == populateDiv2){
                callback(request.responseText, div, div2, scroll);
            }else if(callback == jsonPopulate){
                callback(request.responseText);
            } else{
                callback(url,request.responseText, div, scroll);
            }
        }
    }
    request.open("GET", url);
    request.send(null);
};

function loadMap(where){
    if(map==null){
        startMap(where);
    }else{
        geo.getLatLng(where,function(point)
        {
            if (!point){
            }else{
                // center map
                map.setCenter(point,15);

                // clear markers
                map.clearOverlays();

                // marker
                var marker = new GMarker(point); 
                map.addOverlay(marker);
                map.addControl(new GLargeMapControl());

                document.getElementById('gps').innerHTML = '<b>GPS</b> '+point.lat()+'&deg; '+point.lng()+'&deg;';
                document.forms.templateForm.gps.value = point.lat()+', '+point.lng();
                var search = document.getElementById('map_search').innerHTML.replace('id="templateForm"', 'id="directionForm"');
                marker.openInfoWindowHtml(search);
                GEvent.addListener(marker, "click", function()
                {
                    marker.openInfoWindowHtml(search);
                });
            }
        });
    }
}

function printMap(from){
    var width=730;var height=600;
    var totalWidth=700;var totalHeight=600;
    if(self.innerHeight){
        totalWidth=self.innerWidth;
        totalHeight=self.innerHeight;
    }else{
        if(document.documentElement && document.documentElement.clientHeight){
            totalWidth=document.documentElement.clientWidth;
            totalHeight=document.documentElement.clientHeight;
        }else{
            if(document.body){
                totalWidth=document.body.clientWidth;
                totalHeight=document.body.clientHeight;
            }
        }
    }
    var top=(totalHeight/2)-(height/2)-15;
    if(top<0){
        top=0;
    }
    var left=(totalWidth/2)-(width/2)-35;
    if(left<0){
        left=0;
    }
    var url = "/user.do?method=printMap&id="+document.forms.directionForm.id.value+"&cid="+document.forms.directionForm.cid.value;
    if(from){
        url+="&from="+escape(from);
        url+="&to="+Base64.encode(document.forms.directionForm.gps.value);
    }
    window.open(url,"print","menubar=no, toolbar=no, location=no, scrollbars=yes, resizable=yes, status=no, width="+width+", height="+height+", left="+left+", top="+top);
}

var gDirections = null;
function getDirection(){
    try{    
        if( gDirections == null){
            gDirections = new GDirections(map, document.getElementById('dir'));
            GEvent.addListener(gDirections, "error", function () {
                alert('Nie znaleziono adresu pocz\u0105tkowego ('+gDirections.getStatus().code+').');
                document.getElementById('printd').innerHTML = '&nbsp;';
            } );
            GEvent.addListener(gDirections, "load", function () {
                document.getElementById('printd').innerHTML =
                '<a href="javascript:void()" onclick="printMap(\''+unescape(document.forms.directionForm.where.value)+'\')" class="img"><img src="/grafika/gui/mapa/d_dojazd_f.jpg" alt=""></a>';
            } );
        }
        var from = document.forms.directionForm.from.value;
        var where = document.forms.directionForm.where.value;

        if(from==null){
            return false;
        }
        if (where == ''){
            return false;
        }else{
            
            
            var query = "from: "+document.forms.directionForm.gps.value+" to: "+unescape(where);
            gDirections.load(query, {
                "getPolyline": true,
                "getSteps": true,
                "locale": "pl_PL"
            } );
        }
        return false;
    }catch (e) { }
    return false
}

var map = null;
var geo = null;
var map_where = null;
function startMap(where){
    try{
        // load script
        map_where = where;
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAnu9vnu1yIVFy4UzvfIhxuRRz3CY1mRrzGtyVM_ujNBUNcbRU7BTk2v2u84bW1YWWFTdJAxD7_afmNg&sensor=false&async=2&callback=map_callback&hl=pl";
        document.getElementsByTagName("head")[0].appendChild(script);
    }catch(e){
        alert(e);
    }
}

function map_callback(){
    if(GBrowserIsCompatible())        {
        map = new GMap2(document.getElementById("mp"));
        geo = new GClientGeocoder();
        loadMap(map_where);
    }
}

function populateImage(url,text,div,scroll){
    document.getElementById(div).innerHTML = text;
    if(scroll){
        window.scrollTo(0, 0);
    }
    if (!document.getElementsByTagName){
        return;
    }
    var anchors = document.getElementsByTagName("a");

    // loop through all anchor tags
    for (var i=0; i<anchors.length; i++){
        var anchor = anchors[i];

        if (anchor.getAttribute("href") && (anchor.getAttribute("rel") == "lightbox")){
            anchor.onclick = function () {
                showLightbox(this); return false;
            }
        }
    }
}

function populateDiv(url,text, div, scroll){
    document.getElementById(div).innerHTML = text;
    updateURL(url);
    if(scroll){
        window.scrollTo(0, 0);
    }
}

function updateURL(url){
    var base = getBase(url);
    var links = document.getElementsByName(base);
    if(links.length>0){
        var address = getAddress(document.location.hash);
        for(i=0;i<links.length;++i){
            if(links[i].href.indexOf(address)>0){
                links[i].href = getAddress(links[i].href) + ','+randomString(4);
            }
        }
    }
}

function getBase(url){
    if(url[0]=='/' || url[0]=='#'){
        url = url.substring(1);
    }
    var idx = url.search('[^a-zA-Z_]');
    if(idx>0){
        url = url.substring(0,idx);
    }
    return url;
}

function getAddress(url){
    var idx = url.indexOf(",");
    if(idx>0){
        return url.substring(0,idx);
    }
    return url;
}

function randomString(length) {
    var chars = "0123456789abcdefghiklmnopqrstuvwxyz";
    var randomstring = '';
    for (var i=0; i<length; ++i) {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum,rnum+1);
    }
    return randomstring;
}



function populateDiv2(text, div, div2){
    window.scroll(0, 0);
    var element =
    document.getElementById(div);
    if(element){
        element.innerHTML = text;
        initTE();
    }
}

var rte_krf = null;
function initTE(noScroll){
    var element = document.getElementById("pre_rte");
    if(element != null){
        text = element.innerHTML;
    }
    if(rte_krf==null){
        try{
            // load script
            var script = document.createElement("script");
            script.type = "text/javascript";
            rte_krf = "loaded";
            script.onload= function () {
                initRTEDIV(text, '', "rte_div", noScroll);
            }
            script.onreadystatechange = function() {
                if (this.readyState == 'complete') {
                    initRTEDIV(text, '', "rte_div", noScroll);
                }
            }
            script.src = "/js/richtext.js";
            document.getElementsByTagName("head")[0].appendChild(script);
        }catch(e){
        }
    }else{
        initRTEDIV(text, '', "rte_div", noScroll);
    }
}

HTTP.getHeaders = function(url, callback, errorHandler) {
    var request = HTTP.newRequest();
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if (true) {
                callback(HTTP.parseHeaders(request));
            }
            else {
                if (errorHandler) errorHandler(request.status,
                    request.statusText);
                else callback(null);
            }
        }
    }
    request.open("HEAD", url);
    request.send(null);
};

HTTP.parseHeaders = function(request) {
    var headerText = request.getAllResponseHeaders();  // Text from the server
    var headers = {}; // This will be our return value
    var ls = /^\s*/;  // Leading space regular expression
    var ts = /\s*$/;  // Trailing space regular expression

    var lines = headerText.split("\n");
    for(var i = 0; i < lines.length; i++) {
        var line = lines[i];
        if (line.length == 0) continue;  // Skip empty lines
        var pos = line.indexOf(':');
        var name = line.substring(0, pos).replace(ls, "").replace(ts, "");
        var value = line.substring(pos+1).replace(ls, "").replace(ts, "");
        headers[name] = value;
    }
    return headers;
};

HTTP.search = function(v, c, t, cg){
    var request = HTTP.newRequest();
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            var base = deHash(document.location.href);
            populateDiv(base,HTTP._getResponse(request), 'content', 1);
        }
    }

    request.open("POST", 'search.do?method=set');
    request.setRequestHeader("Content-Type",
        "application/x-www-form-urlencoded");
    var v1 = "";
    var form = document.getElementById('sortForm');
    if(form){
        v1 = HTTP.encodeFormElements(form.elements);
    }
    form = document.getElementById('search_form');
    if(form){
        var v2 = HTTP.encodeFormElements(form.elements);
        if(v2.length>0 && v1.length>0){
            v1 += '&';
        }
        v1 += HTTP.encodeFormElements(form.elements);
    }
    if(v >= 0){
        if(v1.indexOf("s_vv")>=0){
            v1 = v1.replace(/s_vv=\d+/, "s_vv="+v);
        }else{
            if(v1.length>0){
                v1 += '&';
            }
            v1 += "s_vv="+v;
        }
    }
    if(c >= 0){
        if(v1.length>0){
            v1 += '&';
        }
        v1 += "s_ct="+c;
    }
    if(t >= 0){
        if(v1.length>0){
            v1 += '&';
        }
        v1 += "trade="+t;
    }
    if(cg >= 0){

        if(v1.length>0){
            v1 += '&';
        }
        v1 += "cid="+cg;
    }
    request.send(v1);
    return false;
}

HTTP.post = function(url, values, callback, div, div2, scroll) {
    var request = HTTP.newRequest();
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if(callback == populateDiv2){
                callback(HTTP._getResponse(request),div ,div2);
            }else if(callback==jsonPopulate){
                jsonPopulate(HTTP._getResponse(request));
            }else{
                callback(url,HTTP._getResponse(request), div, scroll);
                document.getElementById(show).style.display="block"
            }
        }
    }

    request.open("POST", url);
    request.setRequestHeader("Content-Type",
        "application/x-www-form-urlencoded");
    values = document.getElementById(values).elements;
    request.send(HTTP.encodeFormElements(values));
    return false;

};

HTTP.postFile = function(url, values, callback, div, errorHandler, show) {
    var request = HTTP.newRequest();
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if (true) {
                callback(HTTP._getResponse(request), div, 1);
                document.getElementById(show).style.display="block"
            }
            else {
                if (errorHandler) errorHandler(request.status,
                    request.statusText);
                else callback(null);
            }
        }
    }

    request.open("POST", url);
    request.setRequestHeader("Content-Type",
        "multipart/form-data");
    values = document.getElementById(values).elements;
    request.send(HTTP.encodeFormElements(values));

    return false;

};
HTTP.encodeFormElements = function(elements) {
    var pairs = [];
    var regexp = /%20/g;
    for(i = 0; i < elements.length; i++) {
        var name = elements[i].name;
        var value = elements[i].value;
        if (!value || (elements[i].type=='radio' && elements[i].checked == false)){
            continue;
        }
        if(elements[i].type=='checkbox' ){
            if(elements[i].checked == false){
                continue;
            }
        }
        if(!name || name == '' || (elements[i].type=='text' && value=='' )){
            continue;
        }
        var pair = encodeURIComponent(name).replace(regexp,"+") + '=' +
        encodeURIComponent(value).replace(regexp,"+");
        pairs.push(pair);
    }
    return pairs.join('&');
};
HTTP.encodeFormData = function(data) {
    var pairs = [];
    var regexp = /%20/g; 

    for(var name in data) {
        var value = data[name].toString();
        var pair = encodeURIComponent(name).replace(regexp,"+") + '=' +
        encodeURIComponent(value).replace(regexp,"+");
        pairs.push(pair);
    }
    return pairs.join('&');
};

HTTP._getResponse = function(request) {
    return request.responseText;
};

function jsonPopulate(json){
    var object = json_parse(json);
    if(object){
        var redirect = object.redirect;
        if(redirect){
            document.location = redirect;
            return;
        }
        var div = object.div;
        if(div){
            var id = div.id;
            var val = div.val;
            if(div && val){
                id = document.getElementById(id);
                if(id){
                    id.innerHTML=val;
                }
            }
        }

    }
}