/*
 *Copyright 2011 Matt Burns
 *
 *Licensed under the Apache License, Version 2.0 (the "License");
 *you may not use this file except in compliance with the License.
 *You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *Unless required by applicable law or agreed to in writing, software
 *distributed under the License is distributed on an "AS IS" BASIS,
 *WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *See the License for the specific language governing permissions and
 *limitations under the License.
 */

var dropbox, bag, supportedBrowser, exifReadHandler;

function initDropbox(exifReadHandlerParam) {
	exifReadHandler = exifReadHandlerParam;
	
	if (typeof Modernizr === 'undefined') {
		// Modernizr not loaded for chrome plugin
		supportedBrowser = true; 
	} else {
		supportedBrowser = !!window.FileReader && Modernizr.draganddrop;
	}
	
	if (supportedBrowser) {
	    window.addEventListener("dragenter", dragenter, true);
	    dropbox = document.getElementById("dropbox");
	    bag = document.getElementById("bag");
	    window.addEventListener("dragleave", dragleave, true);
	    dropbox.addEventListener("dragover", dragover, true);
	    dropbox.addEventListener("drop", drop, true);
	    bag.addEventListener("dragover", dragover, true);
	    bag.addEventListener("drop", drop, true);
	    document.getElementById('upload-file').addEventListener('change', handleFileSelect, false);
	}
	
	$(".exif-toggle").click(function() {
        $("#exif-table").slideToggle("slow");
    });
	
}

function growDropbox() {
	dropbox.setAttribute("dragenter", true);
}

function shrinkDropbox() {
	dropbox.removeAttribute("dragenter");
}

function dragenter(e) {
    e.stopPropagation();
    e.preventDefault();
    growDropbox();
}

function dragleave(e) {
    e.stopPropagation();
    e.preventDefault();
    shrinkDropbox();
}

function dragover(e) {
    e.stopPropagation();
    e.preventDefault();
    growDropbox();
}

function filter(str) {
  str = new String(str);
  return str.replace(/[^a-zA-Z0-9 .,-_()]/g, "");
}

function clearPreviousResults() {
    $("#results-data").html("");
    $("#results").hide();
    $("#image-details").hide();
	$("#serial-too-short").hide();
  	$("#problem-extracting").hide();
  	$("#not-valid-jpeg").hide();
  	$("#no-exif").hide();
  	$("#model-unsupported").hide();
  	$("#model-unsupported-powershot").hide();
  	$("#fail-header").hide();
  	$("#fail-footer").hide();
  	$("#model-not-found-in-exif").hide();
    $("#bag").html("");
    $("#exif-table").hide();
    $("#exif-table").find("tr").remove();
    $("#exif-summary").find("tr").remove();
}

function showFailMessage(selector, isManual) {
	$("#searching").hide();
	$("#error-message").show();
	$("#fail-header").fadeIn();
	$("#fail-footer").show();
	$(selector).show();
	$("#search-type-toggle").show();
	if (!isManual) {
		$("#dropbox").show();
	}
}

function drop(e) {
    shrinkDropbox();
    e.preventDefault();
    e.stopPropagation();
    var dt = e.dataTransfer;
    var files = dt.files;

    if (files.length > 0) {
    	//for (var i = 0; i < files.length; i++) {
    		showResultsForFile(files[0]);
    	//}
    }
}

function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object
    showResultsForFile(files[0]);
}

function showResultsForFile(file) {
	clearPreviousResults();
	$("#dropbox").hide();
	$("#search-type-toggle").hide();
	$("#searching").show();
	$("#intro").hide();
    if (!handleFile(file)) {
    	showFailMessage("#not-valid-jpeg");
    } else {
        var binaryReader = new FileReader();
        binaryReader.onloadend = function() {
            var exif = $(this).findEXIFinJPEG(binaryReader.result);
            if (!exif) {
            	showFailMessage("#no-exif");
                return;
            } else {
                addExifSummary(exif, "Make");
                addExifSummary(exif, "Model");
                addExifSummary(exif, "Date", "DateTimeOriginal");
                addExifSummary(exif, "Serial Number", "SerialNumber");
                addExifSummary(exif, "Internal Serial Number", "InternalSerialNumber");

                for (var tag in exif) {
                    if (tag == "undefined") continue;
                    if (tag == "MakerNote") continue;
                    if (tag == "UserComment") continue;  
                    if (tag == "InternalSerialInfo") continue;  
                    $("#exif-table").append("<tr><td class='exif-summary-label'>" + filter(tag) + "</td><td>" + filter(exif[tag]) + "</td></tr>");
                }

                exifReadHandler(exif);
            }
        }
        binaryReader.readAsBinaryString(file);
    }
}

function addExifSummary(exif, label, key) {
	if (!key) {
		key = label;
	}
	value = filter(exif[key]);
	if (!isBlank(value)) {
	    $("#exif-summary").append("<tr><td class='exif-summary-label'>" + label + "</td><td>" + value + "</td></tr>");
	}
}

function isBlank(str) {
    return (!str || /^\s*$/.test(str) || str === 'undefined');
}

function handleFile(file) {
    var imageType = /image\/jpeg/;

    if (!file.type.match(imageType)) {
        return false;
    }

    var img = document.createElement("img");
    img.id = "bagimg";
    var dataURLReader = new FileReader();
    dataURLReader.onloadend = function() {
        img.src = dataURLReader.result;
        img.classList.add("obj");
        
        bag.appendChild(img);
    }
    dataURLReader.readAsDataURL(file);
    return true;
}

