/* jquery plugin for the Class Catalog component
   used by CCSF.edu for reading course information

   TODO: add example usage and other notes


   Option list:  URL and subject are required
    subject,
    courses -> optional list of courses
    url -> url to obtain the course list from
    umbrella -> boolean value stating whether the course list should be expected in umbrella format

   At this time, all four options should be passed


   example usage:

   <script type="text/javascript">
    $(function() {
        $('#umbrellaCourses').catalog({url:"http://localhost:96/crossdom.php?url=http://www.ccsf.edu/cgi-bin/Catalog/crn-CDX.pl&method=GET",subject:"CS",courses:"",umbrella:true});    
    });
</script>

   */
(function($) {
  //
  // plugin definition
  //


  $.fn.catalog = function(options) {
    debug(this);

    // build main options before element iteration
    var opts = $.extend({}, $.fn.catalog.defaults, options);

    var courses;
    var umbrellaCourses;
    var targetComponent;

    // iterate and reformat each matched element
    return this.each(function() {
        $this = $(this);
        targetComponent = $(this);

        //TODO: If we want to try and make this work w/ meta data options ... we do it here
        //// build element specific options
        //var o = $.meta ? $.extend({}, opts, $this.data()) : opts;


        var dataInfo;
        if(opts.courses != ""){
            dataInfo = ({"CRS" : opts.subject, "NUM" : opts.courses});
        }else{
            dataInfo = ({"CRS" : opts.subject});
        }

        //if a loading icon is present ... then show it    
        if($.fn.catalog.loadingicon != "") {
            $(this).html('<img src="' + $.fn.catalog.loadingicon + '" />');
        }

        //run to a different response method depending on the options passed in
        if(opts.umbrella){
            $.ajax({
                type: "GET",
                url: opts.url,
                data: dataInfo,
                dataType: "xml",
                error: onError,
                success: buildUmbrella
            });
        }else{
            $.ajax({
        	type: "GET",
                url: opts.url,
                data: dataInfo,
        	dataType: "xml",
                error: onError,
        	success: buildTable
            });
        }

        //resulting function if there is an error from the ajax call
        function onError(request, status, error){

            if($.fn.catalog.erroricon != "") {
                targetComponent.html('<img src="' + $.fn.catalog.erroricon + '">');
            }else {
                targetComponent.html('');
            }
        }

        function buildTable(xml)
        {       
            //alert (xml);
            var courseCount = $(xml).find("course").size() ;

            //alert ("course count " + courseCount);
            parseCourses(xml);

        }


        function buildUmbrella(xml)
        {
            var courseCount = $(xml).find("course").size() ;

            //alert ("course count " + courseCount);
            parseUmbrella(xml);

        }

        function parseCourses(rawXml){
            var courseCount = $(rawXml).find("course").size();
            courses = new Array(courseCount);
            var i = 0;
            $(rawXml).find("course").each(function(){

                courses[i++] = $(this);
            });

            displayCourses(targetComponent);
        }

        function parseUmbrella(rawXml){
            var courseCount = $(rawXml).find("course").size();
            umbrellaCourses = new Array(courseCount);
            var i = 0;
            $(rawXml).find("course").each(function(){

                umbrellaCourses[i++] = $(this);
            });

            displayUmbrella(targetComponent);
        }

        function displayCourses(jqueryTarget){
            var i;


            jqueryTarget.html('');    
            jqueryTarget.append('<div class="wrapper">');

            for(i = 0; i < courses.length; i++){

                var sub = courses[i].find('subj').text();
                var crse = courses[i].find('crse').text();
                var type = courses[i].attr('type');
                var title = courses[i].find('title').text();
                var units = courses[i].find('units').text();
                var parenDisplay = "";

                var hoursNonCredit = courses[i].find('hours_noncredit').text();
                var hoursCredit = courses[i].find('hours_credit').text();
                var passNp = courses[i].find('pass_nopass').text();
                var reqs = courses[i].find('prereqs').text();
                var repeat = courses[i].find('repeatability').text();
                var desc = courses[i].find('description').text();
                var trans = courses[i].find('csu_uc').text();
                var transVal = courses[i].find('csu_uc').text();
                var canVal = courses[i].find('can').text();
                var notes = courses[i].find('catalog_notes').text();

                if(units && units != ""){
                    parenDisplay = ' (' + units + ')';
                }else{
                    parenDisplay = ' (' + hoursNonCredit + ' hrs)';
                }

                jqueryTarget.append('<div><b>' + sub + ' ' + crse + '. ' + title  + parenDisplay + '</b></div>');
                if(hoursCredit && hoursCredit != ""){
                    jqueryTarget.append('<div>' + hoursCredit + '&nbsp;&nbsp;&nbsp;' + passNp + '</div>');
                }
                if(reqs && reqs != ""){
                    jqueryTarget.append('<div><i>' + reqs + '</i></div>');
                }
                if(repeat && repeat != ""){
                    jqueryTarget.append('<div><i>' + repeat + '</i></div>');
                }
                if(transVal && transVal != ""){
                    desc = desc + ' ' + transVal;
                }
                if(canVal && canVal != ""){
                    desc = desc + ' ' + canVal;
                }
                jqueryTarget.append('<div>' + desc + '</div>');
//              if(trans && trans != ""){
//              	jqueryTarget.append('<div>' + trans + '</div>');
//	        }
                if(notes && notes != ""){
                    jqueryTarget.append('<div style="font-style:italic">' + notes + '</div>');
                }

                jqueryTarget.append('<div> &nbsp;</div>');


            }            

            jqueryTarget.append('</div>');

        }


        function displayUmbrella(jqueryTarget){
            var i;

            jqueryTarget.html('');  
            jqueryTarget.append('<div class="wrapper">');

            var sub = umbrellaCourses[0].find('subj').text();
            var crse = umbrellaCourses[0].find('crse').text();
            var type = umbrellaCourses[0].attr('type');
            var title = umbrellaCourses[0].find('title').text();
            var units = umbrellaCourses[0].find('units').text();
            var parenDisplay = "";

            var hoursNonCredit = umbrellaCourses[0].find('hours_noncredit').text();
            var hoursCredit = umbrellaCourses[0].find('hours_credit').text();
            var passNp = umbrellaCourses[0].find('pass_nopass').text();
            var reqs = umbrellaCourses[0].find('prereqs').text();
            var repeat = umbrellaCourses[0].find('repeatability').text();
            var desc = umbrellaCourses[0].find('description').text();
            var trans = umbrellaCourses[0].find('csu_uc').text();
            var transVal = umbrellaCourses[0].find('csu_uc').text();
            var canVal = umbrellaCourses[0].find('can').text();
            var notes = umbrellaCourses[0].find('catalog_notes').text();

            if(units && units != ""){
                parenDisplay = ' (' + units + ')';
            }else{
                parenDisplay = ' (' + hoursNonCredit + ' hrs)';
            }

            jqueryTarget.append('<div><b>' + sub + ' ' + crse + '. ' + title  + parenDisplay + '</b></div>');
            if(hoursCredit && hoursCredit != ""){
                jqueryTarget.append('<div>' + hoursCredit + '&nbsp;&nbsp;&nbsp;' + passNp + '</div>');
            }
            if(reqs && reqs != ""){
                jqueryTarget.append('<div><i>' + reqs + '</i></div>');
            }
            if(repeat && repeat != ""){
                jqueryTarget.append('<div><i>' + repeat + '</i></div>');
            }
            if(transVal && transVal != ""){
                desc = desc + ' ' + transVal;
            }
            if(canVal && canVal != ""){
                desc = desc + ' ' + canVal;
            }
            jqueryTarget.append('<div>' + desc + '</div>');
//          if(trans && trans != ""){
//              jqueryTarget.append('<div>' + trans + '</div>');
//          }
            if(notes && notes != ""){
                jqueryTarget.append('<div style="font-style:italic">' + notes + '</div>');
            }

            jqueryTarget.append('<div> &nbsp;</div>');

            for(i = 1; i < umbrellaCourses.length; i++){

                sub = umbrellaCourses[i].find('subj').text();
                crse = umbrellaCourses[i].find('crse').text();

                title = umbrellaCourses[i].find('title').text();
                transVal = umbrellaCourses[i].find('csu_uc').text();

                jqueryTarget.append('<div style="padding-left: 10px;"><b>' + sub + ' ' + crse + '. ' + title  + parenDisplay +  ' ' + transVal + '</b></div>');                

            }            

            jqueryTarget.append('</div>');

        }


    });
  };
  //
  // private function for debugging
  //
  function debug($obj) {
    if (window.console && window.console.log)
      window.console.log('hilight selection count: ' + $obj.size());
  };


    // URL and Subject are required
    //
    // plugin defaults
    //
    $.fn.catalog.defaults = {
        url: '',
        subject: '',
        courses: '',
        umbrella: false
    };

    //loading icon that can be set
    $.fn.catalog.loadingicon = "";

    //error icon that can be set
    $.fn.catalog.erroricon = "";


//
// end of closure
//
})(jQuery);

