var docMap = function() {
    this.init(arguments);
}

function chooseDoctor(company_id) {
    window.location.replace('http://' + document.domain + '/patient-financing/apply_platinum.php?company_id=' + company_id);
}

$.extend(docMap.prototype, {
    mapPages: {},
    currentPage: 1,
    perPage: 0,
    map: false,
    origin: {},
    bounds: {},
    infoWin: new google.maps.InfoWindow(),
    totalResults: 0,
    miniMap: {},
    markerListeners: [],
    letterIcons: [],
    smallIcon: new google.maps.MarkerImage('/images/mapicons/mapsmall.png', new google.maps.Size(11, 11)),
    smallShadow: new google.maps.MarkerImage('/images/mapicons/shadow.png', new google.maps.Size(38, 34)),
    docIcon: new google.maps.MarkerImage('/images/mapicons/doctor.png', new google.maps.Size(32, 37)),
    init : function() {
        if (arguments.length == 1) {
            var clientGEO = arguments[0][0];
            var dm = this;
            if (clientGEO) {
                $.ajax({ type: "POST", url: "/patient-financing/applyajax.php", data: 'clientlat=' + clientGEO.latitude + '&clientlon=' + clientGEO.longitude , dataType: 'json', success: function(t){
                    dm.bounds = new google.maps.LatLngBounds(),        
                    dm.handleResponse(t);
                }});
            }
        }
        var loader = new Image(); 
        loader.src = '/images/ajax-loader.gif';
        $('#postal_code').focus();
        this.setLetterIcons();
        this.setObservers();
    },
    setLetterIcons: function() {
        var letters = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
        for (var i = 0, len = letters.length; i < len; ++i) {
            this.letterIcons.push(new google.maps.MarkerImage('/images/mapicons/paleblue_Marker' + letters[i] + '.png', new google.maps.Size(20, 34)));
        }
        letters = null;
    },
    setObservers: function() {
        var dm = this;
        $('.docprev').click(function(){ return dm.switchPage('prev'); });
        $('.docnext').click(function(){ return dm.switchPage('next'); });
        $('#docsubmit').click(function(){ return dm.doSubmit(this);});
        $('#docsearchform').keypress(function(e) {
            c = e.which ? e.which : e.keyCode;
            if (c == 13) {
                return dm.doSubmit(e);
            }
        });
    },
    validateSubmit: function() {
        var noerror = true;
        var postalcode = $('#docsearchform [name=postal_code]').val();
        var distance = $('#docsearchform [name=distance]').val();
        var postallen = postalcode.length;
        var distlen = distance.length;
        if ((postallen > 0) && (distlen > 0)) {
            if (distance > 50) { distance = 5; }
            if ((postallen < 5) || (postallen > 5)) {
                alert('Invalid Zip Code, please try again!');
                noerror = false;
            }
        }
        else {
            alert('Please enter a Zip Code to find a doctor!');
            noerror = false;
        }
        return noerror;
    },
    resetResults: function() {
        this.totalResults = 0;
        $('#searcherr').hide();
        $('#toomany').hide();
        $('#resultrow').hide();
        $('#doclist').hide();
        $('#doctormap').hide();
        $('#dserror').hide();
        this.infoWin.close();
    },
    handleResponse: function(resp) {
        if (resp.records.length == 0) {
            $('#dserror').html('No doctors found, please try again').show();
            $('#resultholder').hide();
            this.hideProgress();
        }
        else {
            if ((resp.maxreached == 1) && (resp.clientrun == 0)) {
                $('#toomany').html('Your search results have been limited to the 100 closest providers in Zip Code ' + resp.zip + '.<br />').show();
            }
            this.totalResults = resp.records.length;
            $('#resultholder').show();
            $('#doclist').show();
            $('#doctormap').show();
            $('#resultrow').show();
            if (resp.records.length <= resp.perpage) {
                $('#doclist').css({'overflow': 'hidden'});
            }
            else {
                $('#doclist').css({'overflow-x': 'hidden','overflow-y': 'scroll'});
            }
            var origin = new google.maps.LatLng(resp.origin.lat, resp.origin.lon);
            if (!this.map) {
    		    var options = {
    	    	    zoom: 12,
	    	    	center: origin,
                    mapTypeControl: false,
			        mapTypeId: google.maps.MapTypeId.ROADMAP
				}; 
				this.map = new google.maps.Map(document.getElementById('doctormap'),options);
            }
            this.currentPage = 1;
            this.perPage = resp.perpage;
            this.origin = resp.origin;
            this.parseRecords(resp.records);
            this.hideProgress();
            this.showCounts();
            this.getPrev();
            this.getNext();
            $('.pg1').show();
        }
    },
    doSubmit: function(element) {
        this.bounds = new google.maps.LatLngBounds(),
        this.resetResults();              
        if (this.validateSubmit()) {
            var dm = this;
            this.showProgress(function(){
                dm.flush();
                $.ajax({ type: "POST", url: "/patient-financing/applyajax.php", data: $("#docsearchform").serialize(), dataType: 'json', success: function(t){
                    dm.handleResponse(t);
                }});
            });
        }
        else {
            $('#postal_code').focus().select();
        }
        return false;
    },
    parseRecords: function(records) {
        var lettcount = 0;
        var dm = this;
        for (var i = 0, len = records.length; i < len; ++i) {
            if(lettcount == dm.perPage) {
                lettcount = 0;
            }
            var rec = records[i];
            var page = (Math.floor(i / dm.perPage) + 1);
            var point = new google.maps.LatLng(rec.lat,rec.lon);
            var markeropts = {
                position: point,  
                map: dm.map  
            };
            if (page > 1) {
                markeropts.icon = dm.smallIcon;
            }
            else {
                markeropts.icon = dm.letterIcons[i];
                markeropts.shadow = dm.smallShadow;
            }
            var marker = new google.maps.Marker(markeropts);
            marker.pg = page;
            marker.letter = lettcount;
            marker.company = rec.company_id;
            if (!dm.mapPages[page - 1]) {
                dm.mapPages[page - 1] = [];
                dm.markerListeners[page - 1] = [];
            }
            var currentRec = {
                mkr: marker,
                compname: rec.company_name,
                compid: rec.company_id,
                dist: rec.dist,
                geo: [rec.lat,rec.lon]
            };
            dm.mapPages[page - 1].push(currentRec);
            dm.bounds.extend(point);
            $('#doclist').append('<li style="display: none;" class="companymarker pg' + page + '" id="' + rec.company_id + '"></li>');
            $('#' + rec.company_id).html('<p class="firstdoc"><img class="doclett" src="' + dm.letterIcons[lettcount].url + '" width="20px" height="34px" /><span class="compname">' + rec.company_name + "</span> (" + rec.dist + ' Miles)</p><ul class="docdata"></ul>');
            jQuery.each([rec.industry_display_html,rec.address,rec.phone], function(i){
                if (this.length > 0) {
                    var elid = rec.company_id + 'itm' + i;
                    $('#' + rec.company_id + ' .docdata').append('<li id="' + elid + '"></li>');
                    $('#' + rec.company_id + ' .docdata #' + elid).html(this.toString());
                }
            });
            $('#' + rec.company_id).click(function(){ dm.docFoc(this); });
            var lt = google.maps.event.addListener(marker, "click", function(){
                dm.clearMini();
                dm.mkFoc(this);
                var rec = dm.getDoc(this.pg,this.company);        
                dm.showDoc(rec);
            });
            dm.markerListeners[page - 1].push(lt);
            lettcount++;            
        }
        this.map.fitBounds(this.bounds);
    },
    clearMini: function() {
        this.miniMap = null;
        $('#minimap').remove();
    },
    showDoc: function(rec) {
        var minibounds = new google.maps.LatLngBounds();
        $('#' + rec.compid).after('<li style="width: 300px; height: 100px; margin-left: 10px; clear: both;" id="minimap"></li>');
        var origin = new google.maps.LatLng(rec.geo[0], rec.geo[1]);
        var options = {
	        zoom: 12,
		    center: origin,
            mapTypeControl: false,
			mapTypeId: google.maps.MapTypeId.ROADMAP
		};
        minibounds.extend(origin);
        this.miniMap = new google.maps.Map(document.getElementById('minimap'),options);
        var marker = new google.maps.Marker({  
            position: origin,  
            icon: this.docIcon,
            map: this.miniMap
        });
        this.miniMap.fitBounds(minibounds);
        this.miniMap.setZoom(15);
        var pScroll = $('#' + rec.compid).offset().top - $('#doclist').offset().top;
        $('#doclist').animate({scrollTop: '+=' + pScroll + 'px'}, 1000, 'easeOutBounce');
    },
    getDoc: function(page, id) {
        var doc = {};
        var totalpages = Math.floor(this.totalResults / this.perPage);
        for (var i = 0; i <= totalpages; ++i) {
            for (var j = 0, jlen = this.mapPages[i].length; j < jlen; ++j) {
                if (this.mapPages[i][j].compid == id) {
                    doc = this.mapPages[i][j];
                    break;
                }
            }
        }
        return doc;
    },
    showCounts: function() {
        var begin = (this.currentPage == 1) ? 1 : (this.perPage * (this.currentPage -1)) + 1;
        var end = ((this.perPage * this.currentPage) > this.totalResults) ? this.totalResults : this.perPage * this.currentPage;
        $('#resultcounts p').html('Displaying ' + begin + ' - ' + end + ' of ' + this.totalResults);        
    },
    getPrev: function() {
        var dm = this;
        jQuery.each($('.docprev'), function(){
            if (dm.currentPage == 1) { $(this).hide(); }
            else { $(this).show(); }
        });
    },
    getNext: function() {
        var dm = this;
        jQuery.each($('.docnext'), function(){
            if((dm.currentPage * dm.perPage) >= dm.totalResults) { $(this).hide(); }
            else { $(this).show(); }
        });
    },
    switchPage: function(page) {
        this.clearMini();
        this.infoWin.close();        
        $('.pg' + this.currentPage).hide();
        var requestedPage = 1;
        var pgtype = typeof(page);
        if (pgtype == 'number') {
            requestedPage = page;
        }
        else if (pgtype == 'string') { 
            requestedPage = (page == 'prev') ? this.currentPage - 1 : this.currentPage + 1;
        }
        $('.pg' + requestedPage).show();
        for (var i = 0, len = this.markerListeners[this.currentPage - 1].length; i < len; ++i) {
            google.maps.event.removeListener(this.markerListeners[this.currentPage - 1][i]);
        }
        for (var i = 0, len = this.markerListeners[requestedPage - 1].length; i < len; ++i) {
            google.maps.event.removeListener(this.markerListeners[requestedPage - 1][i]);
        }
        this.markerListeners[this.currentPage - 1] = [];
        this.markerListeners[this.requestedPage - 1] = [];
        for (var i = 0, len = this.mapPages[this.currentPage - 1].length; i < len; ++i) {
            this.switchMarker(this.currentPage - 1, i, true);          
        }
        for (var i = 0, len = this.mapPages[requestedPage - 1].length; i < len; ++i) {
            this.switchMarker(requestedPage - 1, i, false);          
        }
        this.currentPage = requestedPage;
        $('#doclist').animate({scrollTop: '0px'}, 1000, 'easeOutBounce');
        this.map.fitBounds(this.bounds);        
        this.showCounts();
        this.getPrev();
        this.getNext();
    },
    switchMarker: function(page,index,icon) {
        var oldmarker = this.mapPages[page][index].mkr;
        var pg = oldmarker.pg;
        var company = oldmarker.company;
        var letter = oldmarker.letter;
        var origposition = oldmarker.getPosition();
        oldmarker.setMap(null);
        var iconopts = {
            position: origposition,
            map: this.map
        }
        if (icon) {
            iconopts.icon = this.smallIcon;
        }
        else {
            iconopts.icon = this.letterIcons[letter];
            iconopts.shadow = this.smallShadow;
        }
        var newmarker = new google.maps.Marker(iconopts);
        newmarker.pg = pg;
        newmarker.company = company;
        newmarker.letter = letter;
        this.mapPages[page][index].mkr = newmarker;
        var dm = this;
        var lt = google.maps.event.addListener(newmarker, "click", function(){
                dm.clearMini();
                dm.mkFoc(this);
                var rec = dm.getDoc(this.pg,this.company);        
                dm.showDoc(rec);
        });
        this.markerListeners[page].push(lt);
        oldmarker = null;
    },
    mkFoc: function(marker) {
        if (marker.pg != this.currentPage) {
            this.switchPage(marker.pg); 
        }
        var rec = this.getDoc(marker.pg,marker.company);
        this.doInfo(rec);
    },
    doInfo: function(rec) {
        this.infoWin.close();
        this.infoWin.setContent('<b>' + rec.compname + '</b> (' + rec.dist + ' Miles)<br /><img class="choosedoc" width="110px;" height="23px" src="/images/choose_doctor.jpg" onclick="chooseDoctor(' + rec.compid + ');" />');
        this.infoWin.open(this.map,rec.mkr);
    },
    docFoc: function(element) {
        this.clearMini();
        var pg = $(element).attr('class').match(/pg(\d)$/).pop();
        var rec = this.getDoc(pg,$(element).attr('id'));
        this.showDoc(rec);
        this.doInfo(rec);
    },
    flush: function() {
        var dm = this;
        jQuery.each(dm.mapPages, function(i) {
            for (var j = 0, jlen = dm.mapPages[i].length; j < jlen; ++j) {
                dm.mapPages[i][j].mkr.setMap(null);
                dm.mapPages[i][j].mkr = null;
                dm.mapPages[i][j] = null;
            }
        });
        dm.mapPages = {};
        var doclist = $('#doclist li');
        if (doclist.length > 0) {
            jQuery.each(doclist, function() {
                $(this).unbind('click');
                $(this).remove();
            });
        }
    },
    showProgress: function(func) {
        $('#docsubmit').slideUp('slow', function(){
            $('#docprog').slideDown('slow', func);        
        });
    },
    hideProgress: function() {
        $('#docprog').slideUp('slow', function(){
            $('#docsubmit').slideDown('slow');            
        });
    }
});
