﻿// Dynamis PLC - Chris Leow 2008.

function RequestList(divId, url) {
    this.div = document.getElementById(divId);
    this.url = url;
    this.ol = this.getDescendantByClass(this.div, 'requestListOL');
    this.viewLink = this.getDescendantByClass(this.div, 'requestListViewLink');
    this.noneLink = this.getDescendantByClass(this.div, 'requestListNoneMessage');
    this.maxNumberOfItems = 10;

    var self = this;
    window.onfocus = function() { self.ajaxRequest("view", "none", function(request) { self.totalRefresh(request); }); };
}

RequestList.prototype = {
    itemContents : function(franchiseName, franchiseId) {
        return '<div class="requestListLeftSide"><input type="checkbox" onclick="requestList.removeFranchise('+franchiseId+'); return false;" checked="" name="dummy"/></div><div class="requestListRightSide">'+franchiseName+'</div>';
    },
    
    shouldShowWarning : function(request) {
        var lis = request.responseXML.getElementsByTagName('li');
        var count = 0;
        for(var i=0; i<lis.length; i++) {
            if(lis[i].getAttribute('class') == 'requestListItem')
                count++;
        }
                
        if(count < this.maxNumberOfItems)
            return false;
        else
            return true;
    },

    totalRefresh : function(request) {
        // This is a little bit hacky, but JS provides no .innerXml method.  Grrrrrr.
        var text = request.responseText;
        var sPosition = text.indexOf(">", text.indexOf("<ol")) + 1;
        var ePosition = text.lastIndexOf("</ol>");
        this.ol.innerHTML = text.substring(sPosition, ePosition);
        this.correctStyleLinks(request);
        
        if(typeof(window['RequestList_onChangeComplete'])=='function') {
            window['RequestList_onChangeComplete'](this);
        }
    },

    addFranchise : function(franchiseName, franchiseId) {
        var self = this;
        this.ajaxRequest('insert', franchiseId, function(request) { self.addFranchiseComplete(request, franchiseName, franchiseId); });
    },
    
    addFranchiseComplete : function(request, franchiseName, franchiseId) {
        this.totalRefresh(request);
        if(this.shouldShowWarning(request)) {
            alert('Please enquire into franchises already on your Request List before adding more!');
        }
    },
    
    removeFranchise : function(franchiseId) {
        var self = this;
        this.ajaxRequest('delete', franchiseId, function(request) { self.removeFranchiseComplete(request, franchiseId); });    
    },
    
    removeFranchiseComplete : function(request, franchiseId) {
        var itemCandidates = document.getElementsByTagName('li');
        for(var i=0; i<itemCandidates.length; i++) {
            if(itemCandidates[i].className == 'requestListItem') {
                var itemCandidate = itemCandidates[i];
                var theClick = this.getDescendantByClass(itemCandidate, 'requestListLeftSide');
                if(theClick.innerHTML.match('(' + franchiseId + ')') != null) {
                    clearTimeout();
				    itemCandidate.style.overflow="hidden";
				    var self = this;
				    new Rico.Effect.Size(itemCandidate, null, 1, 10, 12, { complete : function() { self.totalRefresh(request); } } );
                    return;
                }
            }
        }
    },
    
    correctStyleLinks : function(request) {
        if(request.responseText.indexOf('requestListItem') > -1) {
            this.viewLink.style.display = 'block';
            this.noneLink.style.display = 'none';
        } else {
            this.viewLink.style.display = 'none';
            this.noneLink.style.display = 'block';
        }
    },
    
    ajaxRequest : function(action, franchiseId, completeFunction) {
        var self = this;
        var ajaxReader = [];
        var ajaxHelper = new net.ContentLoader(ajaxReader, this.url, "POST", ['action=' + action, 'franchiseID=' + franchiseId]);
        ajaxReader.update = function() { ajaxHelper.sendRequest(); };
        ajaxReader.ajaxUpdate = function(request) { completeFunction(request); };
        
        ajaxReader.update();        
    },
        
    getDescendantByClass : function(element, className) {
        for(var i=0; i<element.childNodes.length; i++) {
            var childNode = element.childNodes[i];
            if(childNode.nodeType == 1) {
                if(childNode.className == className)
                    return childNode;
                else {
                    var result = this.getDescendantByClass(childNode, className);
                    if(result != null)
                        return result;
                }
            }
        }
        return null;
    }
};