/*
onEdit = function (event) {
    var target = event.target;
    var parent = target.parentNode;
    parent.editAction();
}

onOK = function (event) {
    var target = event.target;
    var parent = target.parentNode;
    parent.okAction();
}
*/





/**********************************
*
* Graph Templates
*
*
*************************************/
graphListFull = {
    
    create: function (g) {
        var gDiv = document.createElement('div');
        gDiv.setAttribute('class', 'gContainer');
        var gList = document.createElement('ul');
        gList.setAttribute('class', 'gList');
        for (var sURI in g.subjects) {
            var s = g.subjects[sURI];
            var sLI = document.createElement('li');
            var sContainer = document.createElement('div');
            sContainer.appendChild(subjectDisplay.create(s));
            for (var pred in s.json[s.subject]) {
                var predDiv = predDisplay.create(s, pred);
                for (var oIndex = 0; oIndex < s.json[s.subject][pred].length; oIndex++) {
                    predDiv.appendChild(objDisplay.create(s, pred, oIndex));
                }
                sContainer.appendChild(predDiv);
            }
            sLI.appendChild(sContainer);
            gList.appendChild(sLI);
        }
        gDiv.appendChild(gList);
        return gDiv;
    }
};

graphDBpediaList = {
    
    create: function (g) {
        var gDiv = document.createElement('div');
        gDiv.setAttribute('class', 'gContainer');
        var gList = document.createElement('ul');
        gList.setAttribute('class', 'gList');
        for (var sURI in g.subjects) {
            var s = g.subjects[sURI];
            var sLI = document.createElement('li');
            sLI.appendChild(dbpediaConfirm.create(s));
            gList.appendChild(sLI);
        }
        gDiv.appendChild(gList);
        return gDiv;
    },
};


/**********************************
*
* Subject Templates
*
*
*************************************/

//template a box to confirm a subject returned from a dbpedia lookup
dbpediaConfirm = {
    create: function (s) {
        var sDiv = document.createElement('div');
        sDiv.ref = s;
        sDiv.setAttribute('class', 'sConfirm');
        var chkBox = document.createElement('input');
        chkBox.setAttribute('type', 'checkbox');
    
        if ( s.isRemoved == false ) {
        chkBox.checked = false;
        } else {
            chkBox.checked = true;
        }
        sDiv.appendChild(chkBox);

        
        var lblP = document.createElement('p');
        var title = s.getTitle();
        lblP.appendChild(document.createTextNode(title));
       
        
        sDiv.appendChild(lblP);
        
        var ico = s.getFirstObj4Pred('http://www.w3.org/1999/xhtml/vocab#icon');
        if(ico) {
            var icoImg = document.createElement('img');
            icoImg.setAttribute('src', ico);
            lblP.appendChild(icoImg);
        }
        
        var desc = s.getFirstObj4Pred('dcterms:description');
        if(desc) {
        
            var toggleDescP = document.createElement('p');
            toggleDescP.appendChild(document.createTextNode('Show Description') );
            toggleDescP.onclick = this.toggleDescAction;
            toggleDescP.setAttribute('class', 'option');        
        
            sDiv.appendChild(toggleDescP);
            var descP = document.createElement('p');
            descP.setAttribute('class', 'description');
            descP.appendChild(document.createTextNode(desc));
            descP.style.display = 'none';
            sDiv.appendChild(descP);
        }
        return sDiv;
    },
    
    toggleDescAction: function(event) {
        var descP = event.target.parentNode.getElementsByTagName('p')[2];

        switch(descP.style.display) {
            case 'block' :
                descP.style.display = 'none';
                event.target.replaceChild(document.createTextNode('Show Description') , event.target.firstChild );
            break;
            
            case 'none' :
            case '': 
                descP.style.display = 'block';
                event.target.replaceChild( document.createTextNode('Hide Description'), event.target.firstChild);
            break;
        
        }
    }
};

subjectDisplayNoEdit = {

    create: function(s) {
            var sDiv = document.createElement('div');
        sDiv.ref = s;
        sDiv.setAttribute('class', 'sDisplay');
        var lblP = document.createElement('p');
        
        //for the UX, use the title/label instead of the URI
        var title = s.getTitle();
        lblP.appendChild(document.createTextNode(title));
        sDiv.appendChild(lblP);
        return sDiv;
    
    }

};

subjectDisplay = {
    
    create: function (s) {
        
        var sDiv = document.createElement('div');
        sDiv.ref = s;
        sDiv.setAttribute('class', 'sDisplay');
        var editBtn = util.makeEditButton();
        sDiv.appendChild(editBtn);
        sDiv.editAction = this .editAction;
        var lblP = document.createElement('p');
        
        //for the UX, use the title/label instead of the URI
        var title = s.getTitle();
        lblP.appendChild(document.createTextNode(title));
        sDiv.appendChild(lblP);
        return sDiv;
    },
    
    editAction: function () {
        // for the UX, editing a subject really means editing the title/label
        var editDiv = subjectEdit.create(this .ref);
        this .parentNode.replaceChild(editDiv, this);
    }
};

subjectEdit = {
    
    create: function (s) {
        
        var sDiv = document.createElement('div');
        sDiv.ref = s;
        sDiv.setAttribute('class', 'sDisplay');
        var editBtn = util.makeEditButton();
        sDiv.appendChild(editBtn);
        sDiv.editAction = this .okAction;
        var lblP = document.createElement('p');
        
        //for the UX, use the title/label instead of the URI
        var title = s.getTitle();
        lblInput = document.createElement('input');
        lblInput.setAttribute('type', 'text');
        lblInput.setAttribute('value', title);
        lblP.appendChild(lblInput);
        sDiv.appendChild(lblP);
        return sDiv;
    },
    
    okAction: function () {
        var inputs = this .getElementsByTagName('input');
        var newVal = inputs[0].value;
        this .ref.json[ this .ref.subject][ "http://purl.org/dc/terms/title" ][0].value = newVal;
        var displayDiv = subjectDisplay.create(this .ref);
        this .parentNode.replaceChild(displayDiv, this);
    }
};


isbnConfirmDisplay = {

    create: function (s) {
        var sDiv = document.createElement('div');
        sDiv.ref = s;
        sDiv.setAttribute('class', 'isbnConfirmDisplay');
        
        var thumb = document.createElement('img');
        thumb.setAttribute('src', s.getFirstObj4Pred('foaf:thumbnail'));
        sDiv.appendChild(thumb);
        
        var chkBox = document.createElement('input');
        chkBox.setAttribute('type', 'checkbox');
        sDiv.appendChild(chkBox);
        
        
        var titleP = document.createElement('p');
        titleP.appendChild(document.createTextNode(s.getTitle()));
        sDiv.appendChild(titleP); 
       
       var publisherP = document.createElement('p');
       publisherP.appendChild(document.createTextNode(s.getFirstObj4Pred('dc:publisher')));
       sDiv.appendChild(publisherP);
/*       
       var sSubjects = s.getObjs4Pred('skos:subject');
       for(var i=0; i<sSubjects.length; i++) {
           var title = ui.currPalette.workingGraph.subjects[sSubjects[i] ].getTitle();
           
           var subjP = document.createElement('p');
           subjP.appendChild(document.createTextNode(title));
           sDiv.appendChild(subjP);
       
       }*/
       
       
        return sDiv;
    
    
    },


};

titleLITemplate = {

    create: function(s) {
        var titleLI = document.createElement('li');
        titleLI.ref = s;
        titleLI.isRemoved = false;
        var titleP = document.createElement('p');
        
        if(s.hasPred('foaf:thumbnail') ) {
            var thumb = document.createElement('img');
            thumb.setAttribute('src', s.getFirstObj4Pred('foaf:thumbnail'));
            titleLI.appendChild(thumb);
            titleLI.setAttribute('class', 'hasThumbnail');
        }
        
        titleP.appendChild(document.createTextNode(s.getTitle()));
        var remRestoreSpan = document.createElement('span');
        remRestoreSpan.appendChild(document.createTextNode('Remove'));
        remRestoreSpan.onclick = titleLITemplate.toggleRemove;
        remRestoreSpan.setAttribute('class', 'removerestore');
        titleP.appendChild(remRestoreSpan);
        titleLI.appendChild(titleP);
        
        
        
        return titleLI;
    },
    
    toggleRemove: function(event) {
        if (event instanceof MouseEvent) {
            var li = event.target.parentNode.parentNode;
        } else {
            var li = event;
            event.target = li.getElementsByTagName('span')[0];
        }
        switch (li.isRemoved) {
            case false:
                li.isRemoved = true;
                li.ref.isRemoved = true;
                li.style.backgroundColor = 'pink';
                event.target.replaceChild(document.createTextNode('Restore'), event.target.firstChild);
            break;
            
            case true:
                li.isRemoved = false;
                li.ref.isRemoved = false;
                li.style.backgroundColor = '';
                event.target.replaceChild(document.createTextNode('Remove'), event.target.firstChild);
            break;
        
        }
    }
};

/**********************************
*
* Predicate Templates
*
*
*************************************/


predDisplayNoEdit = {
    
    create: function (s, pred) {
        var pDiv = document.createElement('div');
        pDiv.ref = s;
        pDiv.pred = pred;
        pDiv.setAttribute('class', 'pDisplay');
        pP = document.createElement('p');
        pP.appendChild(document.createTextNode(util.contractURI(pred)));
        pDiv.appendChild(pP);
        return pDiv;
    }
};

predDisplay = {
    
    create: function (s, pred) {
        var pDiv = document.createElement('div');
        pDiv.ref = s;
        pDiv.pred = pred;
        pDiv.setAttribute('class', 'pDisplay');
        pDiv.appendChild(util.makeEditButton() );
        pDiv.editAction = this.editAction;
        pP = document.createElement('p');
        pP.appendChild(document.createTextNode(util.contractURI(pred)));
        pDiv.appendChild(pP);
        return pDiv;
    }
};


/**********************************
*
* Object Templates
*
*
*************************************/

objImageDisplay = {

    create:function(s, pred, oIndex) {
         var oDiv = document.createElement('div');
         oDiv.ref = s;
         oDiv.oIndex = oIndex;
         oDiv.setAttribute('class', 'oDisplay');
         var oImage = document.createElement('img');
         oImage.setAttribute('class', 'oImageDisplay');
         oImage.setAttribute('src', s.json[s.subject][pred][oIndex].value);
         oDiv.appendChild(oImage);
         return oDiv;    
    }



};

objDisplayNoEdit = {
    create: function (s, pred, oIndex) {
        var oDiv = document.createElement('div');
        oDiv.ref = s;
        oDiv.pred = pred;
        oDiv.oIndex = oIndex;
        oDiv.setAttribute('class', 'oDisplay');
        oP = document.createElement('p');
        if (s.json[s.subject][pred][oIndex].type == 'uri') {
            //figure out the object's label
            //if its not in the main Graph, I don't have it
            var objSubject = mainGraph.subjects[s.json[s.subject][pred][oIndex].value];
            //deal with really not knowing the subject
            if(objSubject == null) {
            var titleTN = document.createTextNode(objSubject.subject);
            } else {
            var titleTN = document.createTextNode(objSubject.getTitle());
            }
            
            oP.appendChild(titleTN);
            //signal that it is a URI (Resource)
            var resSpan = document.createElement('span');
            resSpan.setAttribute('class', 'isResource');
            resSpan.appendChild(document.createTextNode('Resource'));
            op.appendChild(resSpan);
              
        } else {
            oP.appendChild(document.createTextNode(s.json[s.subject][pred][oIndex].value));
        }
        oDiv.appendChild(oP);
        return oDiv;
    }


};

objDisplay = {
    
    create: function (s, pred, oIndex) {
        var oDiv = document.createElement('div');
        oDiv.ref = s;
        oDiv.pred = pred;
        oDiv.oIndex = oIndex;
        oDiv.setAttribute('class', 'oDisplay');
        oDiv.appendChild(util.makeEditButton());
        oDiv.editAction = this .editAction;
        oP = document.createElement('p');
        oP.appendChild(document.createTextNode(s.json[s.subject][pred][oIndex].value));
        oDiv.appendChild(oP);
        return oDiv;
    },
    
    editAction: function () {
        var editDiv = objEdit.create(this .ref, this .pred, this .oIndex);
        this .parentNode.replaceChild(editDiv, this);
    },
};


objEdit = {
    
    create: function (s, pred, oIndex) {
        var oDiv = document.createElement('div');
        oDiv.ref = s;
        oDiv.pred = pred;
        oDiv.oIndex = oIndex;
        oDiv.setAttribute('class', 'oEdit');
        oDiv.appendChild(util.makeOKButton());
        oDiv.okAction = this .okAction;
        oP = document.createElement('p');
        
        oInput = document.createElement('input');
        oInput.setAttribute('type', 'text');
        if (s.json[s.subject][pred][oIndex].value) {
            oInput.setAttribute('value', s.json[s.subject][pred][oIndex].value);
        }
        
        oP.appendChild(oInput);
        oDiv.appendChild(oP);
        return oDiv;
    },
    
    
    okAction: function () {
        var inputs = this .getElementsByTagName('input');
        var newVal = inputs[0].value;
        this .ref.json[ this .ref.subject][ this .pred][ this .oIndex].value = newVal;
        var displayDiv = objDisplay.create(this .ref, this .pred, this .oIndex);
        this .parentNode.replaceChild(displayDiv, this);
    }
};



typesTemplate = {
    // give the graph of types 
    create: function(ref, g, label) {
        var typesDiv = document.createElement('div');
        typesDiv.setAttribute('class', 'types');
        typesDiv.ref = ref;
        typesLabel = document.createElement('h1');
        typesLabel.appendChild(document.createTextNode(label) );
        typesDiv.appendChild(typesLabel);
        
        
        for(var s in g.subjects) {
            var typeP = subjectTypeCheckBoxP.create(g.subjects[s]) ;
            typesDiv.appendChild(typeP);
        }
        
 
        return typesDiv;
    }
};



subjectTypeCheckBoxP = {

    create: function(s, label) {
            var typeP = document.createElement('p');
            typeP.setAttribute('class', 'type');            
            var typeCheckbox = util.makeCheckbox(false, 'rdf:type');
            typeCheckbox. ref = s;            
            typeP.appendChild(typeCheckbox);
            if (label != null ) {
                typeP.appendChild(document.createTextNode('(No label)' ));                
            } else {
               typeP.appendChild(document.createTextNode( s.getTitle() ));
            }
    return typeP;          
    }
};    


/*
var ftg = new Graph();

var fc1 = new Subject('http://example.org/Class1');
fc1.addPO('rdfs:label', util.makeLiteral('Class1') );

var fc2 = new Subject('http://example.org/Class2');
fc2.addPO('rdfs:label', util.makeLiteral('Class2') );

ftg.addSubject(fc1);
ftg.addSubject(fc2);

var foafClassesGraph = new Graph();
var dctypesGraph = new Graph();
dctypesGraph.importJSON(dctypes);

foafClassesGraph.importJSON(foafClasses);*/


var s09json = eval( ({'http://devel.patrickgmj.net/geg/test/Terms/Spring2009':{'http://purl.org/dc/terms/startDate':[{type:"literal", value:"2009-01", datatype:"http://www.w3.org/2001/XMLSchema#Date"}], 'http://purl.org/dc/terms/endDate':[{type:"literal", value:"2009-05", datatype:"http://www.w3.org/2001/XMLSchema#Date"}], 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type':[{type:"uri", value:"http://www.ravendesk.org/giantedugraph#Term"}]}}) );

var Spring2009 = new Subject(s09json);

var f08json = eval ( ({'http://devel.patrickgmj.net/geg/test/Terms/Fall2008':{'http://purl.org/dc/terms/endDate':[{type:"literal", value:"2008-12", datatype:"http://www.w3.org/2001/XMLSchema#Date"}], 'http://purl.org/dc/terms/startDate':[{type:"literal", value:"2008-08", datatype:"http://www.w3.org/2001/XMLSchema#Date"}], 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type':[{type:"uri", value:"http://www.ravendesk.org/giantedugraph#Term"}]}}) ) ;
var Fall2008 = new Subject(f08json);

Fall2008.addPO('dcterms:title', util.makeLiteral('Fall 08 (Aug - Dec)') );
Spring2009.addPO('dcterms:title', util.makeLiteral('Spring 09 (Jan - May)' ) );
var termsGraph = new Graph();
termsGraph.addSubject(Fall2008);
termsGraph.addSubject(Spring2009);
