VendorsDataProvider.TRACE_DEEP_LIMIT = 3;
VendorsDataProvider.TRACE_DEEP_DELIMITER = "#";
VendorsDataProvider.VIDEOS_PER_PAGE = 8;
VendorsDataProvider.PICS_PER_PAGE = 8;
function VendorsDataProvider(baseUrl) {
    this.baseUrl = baseUrl;
    
    this._resetCategory();
    this._resetVendor();
}
VendorsDataProvider.prototype = new DXMLHttpRequestShell();
VendorsDataProvider.constructor = VendorsDataProvider;
VendorsDataProvider.prototype.deepTrace = function(data, depth) {
    depth = (depth)? depth : 0;
    var result = "";
    
    if (typeof(data) == "object" || typeof(data) == "array") {
	    if (depth <= VendorsDataProvider.TRACE_DEEP_LIMIT) {
		    for (var i in data) {
		        if (data[i]) {
			        try {
			            for (var j = 0; j < depth; j++) {
			               result += VendorsDataProvider.TRACE_DEEP_DELIMITER;
			            }
				        result += i + " :: " + ((typeof(data[i]) == "function")? "function()" : data[i]) + "\n";
				        if (typeof(data[i]) == "object" || typeof(data[i]) == "array") {
				            result += this.deepTrace(data[i], depth + 1);
				        }
			        } catch (e) {
			           //alert(e.message);
			        }
		        }
		    }
	    }
    } else {
        result = data;
    }
    
    return result;
}
VendorsDataProvider.prototype._resetVendorTabs = function() {
    changeTab("tabCompany");    
}
VendorsDataProvider.prototype._resetCategory = function() {
    this.categoryId = null;
    this.preSelectedVendor = null;
}
VendorsDataProvider.prototype._resetVendor = function() {
    this._firstVendorId = null;

    this.vendorId = null;
    this.vendorCompany = {};
    this.vendorServices = {};
    this.vendorVideos = [];
    this.vendorPics = [];
    
    this.vendorVideoPage = null;
    this.vendorPicPage = null;
}
VendorsDataProvider.prototype.onLoad = function() {
    var result = this.getResponseXML();
//    document.write(this.getResponseText());
//    alert(this.getResponseText());
    var rootNode = null;
    
    if (document.all) {
        rootNode = result.firstChild.nextSibling;
    } else {
        rootNode = result.firstChild;
    }
    
    if (rootNode.nodeName == "vendors") {
        var versionPass = false;
        var action = null;
	    for (var i = 0; i < rootNode.attributes.length; i++) {
	        if (rootNode.attributes[i].name == "version" && rootNode.attributes[i].value == "1.0") {
	           versionPass = true;
	        } else if (rootNode.attributes[i].name == "content") {
	           action = rootNode.attributes[i].value;
	        }
	    }
	    
	    if (versionPass) {
	       if (action == "list") {
	           var list = null;
	           var positioning = null;
	           for (var i = 0; i < rootNode.childNodes.length; i++) {
	               if (rootNode.childNodes[i].nodeName == "list") {
	                   list = rootNode.childNodes[i]; 
	               } else if (rootNode.childNodes[i].nodeName == "positioning") {
	                   positioning = rootNode.childNodes[i];
	               }
	           }
	           if (list != null) {
	               this._resetVendor();
	               this._handleList(list);
	           }
	           if (positioning != null) {
	               this._handlePages(positioning);
	           }
			   var vendorsExisting = 0;
			   if (list) {
				   for (var i = 0; i < list.childNodes.length; i++) {
				       if (list.childNodes[i].nodeName == "vendor") {
				           var vendorNode = list.childNodes[i];
				           
				           vendorsExisting++;
				       }
				   }
			   }
	           
	           if (positioning != null) {
	           	   if (vendorsExisting != 0) {
	                   this._handlePages(positioning);
	               } else {
	                   document.getElementById("vendor_pages").innerHTML = "<strong style=\"color: red; font-size: 13px;\">No Results Found!</strong>";
	               }
	           }	           
	       } else if (action == "view") {
	           var id = null;
	           var company = null;
	           var services = null;
	           var videos = null;
	           var pics = null;
               for (var i = 0; i < rootNode.childNodes.length; i++) {
                   if (rootNode.childNodes[i].nodeName == "id") {
                       id = rootNode.childNodes[i]; 
                   } else if (rootNode.childNodes[i].nodeName == "company") {
                       company = rootNode.childNodes[i];
                   } else if (rootNode.childNodes[i].nodeName == "services") {
                       services = rootNode.childNodes[i];
                   } else if (rootNode.childNodes[i].nodeName == "videos") {
                       videos = rootNode.childNodes[i];
                   } else if (rootNode.childNodes[i].nodeName == "pics") {
                       pics = rootNode.childNodes[i];
                   }
               }
               document.getElementById("videosCount").innerHTML = 0;
               document.getElementById("subPaneVideos").innerHTML = "";
               document.getElementById("picturesCount").innerHTML = 0;
               document.getElementById("subPanePictures").innerHTML = "";
               document.getElementById("subPanePages").innerHTML = "";
	           
	           if (id != null) {
	               this._resetVendorTabs();
	           
	               this._handleVendorId(id);
	               
	               this._populateVendorVideosPlayer();
	               
	               if (company != null) {
	                   this._handleVendorCompany(company);
	               }
	               if (services != null) {
	                   this._handleVendorServices(services);
	               }
                   if (pics != null) {
                       this._handleVendorPics(pics);
                   }
	               if (videos != null) {
	                   this._handleVendorVideos(videos);
	               }
	           }
	       }
	    }
    }
}
VendorsDataProvider.prototype._handleVendorId = function(xmlNodeCollection) {
    if (xmlNodeCollection) {
        this.vendorId = xmlNodeCollection.firstChild.nodeValue;
    }
}
VendorsDataProvider.prototype._handleVendorCompany = function(xmlNodeCollection) {
	for (var i = 0; i < xmlNodeCollection.childNodes.length; i++) {
	    var xmlNode = xmlNodeCollection.childNodes[i];
	    if (xmlNode.firstChild) {
	       this.vendorCompany[xmlNode.nodeName] = xmlNode.firstChild.nodeValue;
	    }
	}
	
	this._populateVendorCompanyPane();
}
VendorsDataProvider.prototype._populateVendorCompanyPane = function() {
    var resultHTML = "";
    document.getElementById("vendorsCompanyPane").innerHTML = "";

    resultHTML += ((this.vendorCompany.company)? this.vendorCompany.company : "") + "<br/><br/>";
    resultHTML += ((this.vendorCompany.addr)? this.vendorCompany.addr + "<br/>" : "") ;
    resultHTML += ((this.vendorCompany.addr2)? this.vendorCompany.addr2  + "<br/>" : "");
    resultHTML +=
        ((this.vendorCompany.city)? this.vendorCompany.city : "") +
        ((this.vendorCompany.city)? ", " : "") +
        ((this.vendorCompany.state)? this.vendorCompany.state : "") +
        " " +
        ((this.vendorCompany.zip)? this.vendorCompany.zip : "") +
        "<br/><br/>"
    ;
    resultHTML += ((this.vendorCompany.phone)? this.vendorCompany.phone  + "<br/>" : "");
    resultHTML += ((this.vendorCompany.name)? this.vendorCompany.name + "<br/><br/>" : "");
    if (this.vendorCompany.webaddr) {
        resultHTML += "<a href=\"" + ((this.vendorCompany.webaddr.indexOf("http") == "-1")? "http://" + this.vendorCompany.webaddr : this.vendorCompany.webaddr) + "\" target=\"_blank\">" + this.vendorCompany.webaddr + "</a>";
    }
    
    /*
    for (var i in this.vendorCompany) {
        resultHTML += 
            (
                (i == "webaddr")?
                ("<a href=\"" + ((this.vendorCompany[i].indexOf("http") == "-1")? "http://" + this.vendorCompany[i] : this.vendorCompany[i]) + "\" target=\"_blank\">" + this.vendorCompany[i] + "</a>")
                :
                this.vendorCompany[i]
            )
            + "<br/>";
    }
    */
    
    document.getElementById("vendorsCompanyPane").innerHTML += resultHTML; 
}
VendorsDataProvider.prototype._handleVendorServices = function(xmlNodeCollection) {
    for (var i = 0; i < xmlNodeCollection.childNodes.length; i++) {
        var xmlNode = xmlNodeCollection.childNodes[i];
        if (xmlNode.firstChild) {
           this.vendorServices[xmlNode.nodeName] = xmlNode.firstChild.nodeValue;
        }
    }
    
    this._populateVendorServicesPane();
}
VendorsDataProvider.prototype._populateVendorServicesPane = function() {
    var resultHTML = "";
    document.getElementById("vendorsServicesPane").innerHTML = "";
    
    for (var i in this.vendorServices) {
        resultHTML += this.vendorServices[i] + "<br/>";
    }
    
    document.getElementById("vendorsServicesPane").innerHTML += resultHTML; 
}
VendorsDataProvider.prototype._handleVendorVideos = function(xmlNodeCollection) {
    for (var i = 0; i < xmlNodeCollection.childNodes.length; i++) {
        var xmlNode = xmlNodeCollection.childNodes[i];
        if (xmlNode.firstChild) {
	        var parameters = [];
	        for (var j = 0; j < xmlNode.childNodes.length; j++) {
	            if (xmlNode.childNodes[j].firstChild) {
	                parameters[xmlNode.childNodes[j].nodeName] = xmlNode.childNodes[j].firstChild.nodeValue;
	            }
	        }
	        
           this.vendorVideos.push(parameters);
        }
    }
    
    this.populateVendorVideosPane(1);
}
VendorsDataProvider.prototype.populateVendorVideosPane = function(page) {
    if (page) {
        this.vendorVideoPage = page;
    } else {
        page = this.vendorVideoPage;
    }
    
    if (!page) {
        return;
    }

    this._populateVendorVideosPane(page);
}
VendorsDataProvider.prototype._populateVendorVideosPane = function(page) {
    document.getElementById("videosCount").innerHTML = this.vendorVideos.length;
    
    var resultHTML = "";
    document.getElementById("subPaneVideos").innerHTML = "";

    for (var i = (page - 1) * VendorsDataProvider.VIDEOS_PER_PAGE, index = 0; i < (page) * VendorsDataProvider.VIDEOS_PER_PAGE && i < this.vendorVideos.length; i++, index++) {
        resultHTML += "<div id=\"vendor_video_" + index + "\" style=\"background: url('files/dealermov/" + this.vendorVideos[i].pic + "') no-repeat center;\" onclick=\"selectVideo(this, '" + i + "')\"></div>";
    }
    
    document.getElementById("subPaneVideos").innerHTML = resultHTML;
    
    
    var pagesHTML = "";
    var pagesCount = Math.ceil(this.vendorVideos.length / VendorsDataProvider.VIDEOS_PER_PAGE);
    if (pagesCount > 1) {
	    pagesHTML += "<ul class=\"center pages\">";
	    
	    var startPage = parseInt(page / 10) * 10;
	    
	    if (page > 1) {
	        pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoVideoPage(" + (page - 1) + ")\">&lt;&lt;</a></li>";
	    }
	    
	    var pagesCount = Math.ceil(this.vendorVideos.length / VendorsDataProvider.VIDEOS_PER_PAGE);
	    
	    for (var i = startPage; i < startPage + 10 && i < pagesCount + 1; i++) {
	        if (i > 0) {
		        if (i == page) {
		            pagesHTML += "<li id=\"pg_act\">[" + i + "]</li>";
		        } else {
		            pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoVideoPage(" + (i) + ")\">" + i + "</a></li>";
		        }
	        }
	    }
	    
	    if (page < pagesCount) {
	        pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoVideoPage(" + (page + 1) + ")\">&gt;&gt;</a></li>";
	    }
	    
	    pagesHTML += "</ul>";
    }
    document.getElementById("subPanePages").innerHTML = pagesHTML;
}
VendorsDataProvider.prototype._populateVendorVideosPlayer = function() {
    try {
        var player = document.getElementById("Zoom");
        player.farCallLoadXML(this.baseUrl + "vendors/getvideos/" + this.vendorId + ".xml");
    } catch (e) {
        alert("Cannot locate flash Player! Please check that you have the last available flash player for your configuration and have flash enabled in the browser!");
    }
}
VendorsDataProvider.prototype._handleVendorPics = function(xmlNodeCollection) {
    for (var i = 0; i < xmlNodeCollection.childNodes.length; i++) {
        var xmlNode = xmlNodeCollection.childNodes[i];
        if (xmlNode.firstChild) {
            var parameters = [];
            for (var j = 0; j < xmlNode.childNodes.length; j++) {
                if (xmlNode.childNodes[j].firstChild) {
                    parameters[xmlNode.childNodes[j].nodeName] = xmlNode.childNodes[j].firstChild.nodeValue;
                }
            }
            this.vendorPics.push(parameters);
        }
    }
    
    this.populateVendorPicsPane(1);
}
VendorsDataProvider.prototype.populateVendorPicsPane = function(page) {
    if (page) {
        this.vendorPicPage = page;
    } else {
        page = this.vendorPicPage;
    }
    
    if (!page) {
        return;
    }

    this._populateVendorPicsPane(page);
}
VendorsDataProvider.prototype._populateVendorPicsPane = function(page) {
    document.getElementById("picturesCount").innerHTML = this.vendorPics.length;
    
    var resultHTML = "";
    document.getElementById("subPanePictures").innerHTML = "";

    for (var i = (page - 1) * VendorsDataProvider.PICS_PER_PAGE, index = 0; i < (page) * VendorsDataProvider.PICS_PER_PAGE && i < this.vendorPics.length; i++, index++) {
        resultHTML += "<div id=\"vendor_pic_" + index + "\" style=\"background: url('files/dealerpic/" + this.vendorPics[i].pic + "') no-repeat center;\" onclick=\"selectPic(this, '" + parseInt(this.vendorVideos.length + i) + "')\"></div>";
    }
    
    document.getElementById("subPanePictures").innerHTML = resultHTML;
    
    var pagesHTML = "";
    var pagesCount = Math.ceil(this.vendorPics.length / VendorsDataProvider.PICS_PER_PAGE);
    if (pagesCount > 1) {
	    pagesHTML += "<ul class=\"center pages\">";
	    
	    var startPage = parseInt(page / 20) * 20;
	    
	    if (page > 1) {
	        pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoPicPage(" + (page - 1) + ")\">&lt;&lt;</a></li>";
	    }
	    
	    
	    
	    for (var i = startPage; i < startPage + 20 && i < pagesCount + 1; i++) {
	        if (i > 0) {
	            if (i == page) {
	                pagesHTML += "<li id=\"pg_act\">[" + i + "]</li>";
	            } else {
	                pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoPicPage(" + (i) + ")\">" + i + "</a></li>";
	            }
	        }
	    }
	    
	    if (page < pagesCount) {
	        pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoPicPage(" + (page + 1) + ")\">&gt;&gt;</a></li>";
	    }
	    
	    pagesHTML += "</ul>";
	}
	document.getElementById("subPanePages").innerHTML = pagesHTML;
}
VendorsDataProvider.prototype._handlePages = function(xmlNodeCollection) {
    var totalPages = 0;
    var currentPage = 0;
    var shownPages = 0;
    document.getElementById("vendor_pages").innerHTML = "";
    
    if (xmlNodeCollection) {
        for (var i = 0; i < xmlNodeCollection.childNodes.length; i++) {
            var xmlNode = xmlNodeCollection.childNodes[i];
            if (xmlNode.nodeName == "page") {
                if (xmlNode.firstChild) {
                    currentPage = xmlNode.firstChild.nodeValue;
                }
            } else if (xmlNode.nodeName == "pages") {
                if (xmlNode.firstChild) {
                    totalPages = xmlNode.firstChild.nodeValue;
                }
            }
        }
        
        var pagesHTML = "";
        if(totalPages > 1) {
	        pagesHTML += "<ul class=\"pages\">";
	        var startPage = parseInt(currentPage / 10) * 10;
	        if (currentPage > 1) {
	            pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoPage(" + (currentPage - 1) + ")\">&lt;&lt;</a></li>";
	        }
	        
	        for (var i = startPage; i < startPage + 10; i++) {
	            if (i > 0 && i != currentPage && i < totalPages - -1) {
	                pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoPage(" + i + ")\">" + i + "</a></li>";
	            } else if (i == currentPage){
	                pagesHTML += "<li id=\"pg_act\">[" + i + "]</li>";
	            }
	        }
	        if (currentPage - totalPages < 0) {
	            pagesHTML += "<li><a href=\"javascript:void(0);\" onclick=\"gotoPage(" + (currentPage - -1) + ")\">&gt;&gt;</a></li>";
	        }
	        
	        pagesHTML += "</ul>";
	     } else {
	     	pagesHTML += "<div style=\"height: 14px\"></div>";
	     }
    } else {
        var pagesHTML = "";
        pagesHTML += "<ul class=\"pages\">";
        pagesHTML += "<li id=\"pg_act\">[<em>...loading...</em>]</li>";
        pagesHTML += "</ul>";
    }
    
    document.getElementById("vendor_pages").innerHTML = pagesHTML;
}
VendorsDataProvider.prototype._handleList = function(xmlNodeCollection) {
    var vendorsExisting = 0;
    document.getElementById("vendor_list_container").innerHTML = "";
    
    if (xmlNodeCollection) {
	    for (var i = 0; i < xmlNodeCollection.childNodes.length; i++) {
	        if (xmlNodeCollection.childNodes[i].nodeName == "vendor") {
	            var vendorNode = xmlNodeCollection.childNodes[i];
	            document.getElementById("vendor_list_container").innerHTML += this._generateVendorHTMLFromXML(vendorNode, vendorsExisting);
	            
	            vendorsExisting++;
	        }
	    }
    }
    
    for (var i = vendorsExisting; i < 10; i++) {
        document.getElementById("vendor_list_container").innerHTML += this._generateVendorHTMLFromXML(null, null);
    }
    
    if (this.preSelectedVendor) {
        var position = this._findVendorPositionById(xmlNodeCollection, this.preSelectedVendor);
        try {
            selectVendor(
                position,
                this.preSelectedVendor
            );
        } catch (e) {}
        
    } else {
        if (this._firstVendorId) {
            selectVendor(0, this._firstVendorId);
        }
    }
}
VendorsDataProvider.prototype._findVendorPositionById = function(xmlNodeCollection, id) {
    if (xmlNodeCollection) {
        var index = 0;
        for (var i = 0; i < xmlNodeCollection.childNodes.length; i++) {
            if (xmlNodeCollection.childNodes[i].nodeName == "vendor") {
                index++;
                var vendorNode = xmlNodeCollection.childNodes[i];
                if (this._getVendorId(vendorNode) == id) {
                   return index - 1;
                }
            }
        }
    }
    
    return 0;
}
VendorsDataProvider.prototype._getVendorId = function(xmlNode) {
    if (xmlNode != null) {
        var result = "";

        var name = "";
        var file = "";
        var id = "";
        for (var i = 0; i < xmlNode.childNodes.length; i++) {
            if (xmlNode.childNodes[i].nodeName == "name") {
                if (xmlNode.childNodes[i].firstChild) {
                    name = xmlNode.childNodes[i].firstChild.nodeValue;
                }
            } else if (xmlNode.childNodes[i].nodeName == "file") {
                if (xmlNode.childNodes[i].firstChild) {
                    file = xmlNode.childNodes[i].firstChild.nodeValue;
                }
            } else if (xmlNode.childNodes[i].nodeName == "id") {
                if (xmlNode.childNodes[i].firstChild) {
                    id = xmlNode.childNodes[i].firstChild.nodeValue;
                }
            }
        }
        
        return id;
    } else {
        return "<div class=\"one_vendor_bg\"></div>";
    }
}
VendorsDataProvider.prototype._generateVendorHTMLFromXML = function(xmlNode, index) {
    if (xmlNode != null) {
        var result = "";

        var name = "";
        var file = "";
        var id = "";
        for (var i = 0; i < xmlNode.childNodes.length; i++) {
            if (xmlNode.childNodes[i].nodeName == "name") {
                if (xmlNode.childNodes[i].firstChild) {
                    name = xmlNode.childNodes[i].firstChild.nodeValue;
                }
            } else if (xmlNode.childNodes[i].nodeName == "file") {
                if (xmlNode.childNodes[i].firstChild) {
                    file = xmlNode.childNodes[i].firstChild.nodeValue;
                }
            } else if (xmlNode.childNodes[i].nodeName == "id") {
                if (xmlNode.childNodes[i].firstChild) {
                    id = xmlNode.childNodes[i].firstChild.nodeValue;
                }
            }
        }
        
        if (!this._firstVendorId) {
            this._firstVendorId = id;
        }
        
        if (file) {
            result = "<div class=\"one_vendor_bg\" style=\"background:url('" + this.baseUrl + file + "') no-repeat center;\" id=\"vendor_" + index + "\"  onclick=\"selectVendor(" + index + ", " + id + ")\">";
        } else {
            result = "<div class=\"one_vendor_bg\" id=\"vendor_" + index + "\"  onclick=\"selectVendor(" + index + ", " + id + ")\">";
        }
        
        result += "<div class=\"white_bg_title\"></div>";
        result += "<div class=\"vendor_title\">" + name + "</div>";
        result += "<div class=\"one_vendor_border\" id=\"vendor_border_" + index + "\" style=\"visibility: hidden;\"></div>";
        result += "</div>";
        
        return result;
    } else {
        return "<div class=\"one_vendor_bg\"></div>";
    }
}
VendorsDataProvider.prototype.getList = function(category, searchText, page) {
    if (category) {
        this.categoryId = category;
    }
    
    if (this.categoryId) {
	    this.init();
	    this._handleList();
	    this._handlePages();
	    var requestString = "category=" + this.categoryId + "&searchText=" + searchText + "&page=" + page;
	    
	    this.fastPostUrl(this.baseUrl + "vendors/getlist.xml", requestString);
    }
}
VendorsDataProvider.prototype.getListAtVendor = function(category, vendor) {
    this.categoryId = category;
    
    this.preSelectedVendor = vendor;
    
    this.init();
    this._handleList();
    this._handlePages();
    
    var requestString = "category=" + this.categoryId + "&vendor=" + vendor;
    
    this.fastPostUrl(this.baseUrl + "vendors/getlist.xml", requestString);
}
VendorsDataProvider.prototype.getVendor = function(id) {
    this._resetVendor();
    this.preSelectedVendor = null;
    
    this.init();
    var requestString = "id=" + id;
    this.fastPostUrl(this.baseUrl + "vendors/getvendor.xml", requestString);
}