/*

Clip-it
Tinderhouse 2006

*/

// Constants
var cookie_name = "clipit";

//var clipit_message = "Add to clippings";
//var clipped_message = "Remove from clippings";

var clipit_message = "Clip it";
var clipped_message = "Unclip it";

var clipit_identifier = "clipit";
var clear_all_identifier = "remove-all";

var time_to_live = 5;
var list_delimiter = "|";
var entry_delimiter = "+";


/*
   REGISTRATION FORM VALIDATION ===============================================
*/
function validateString(field, field_description, msg, min, max) {
	if (!min) { min = 1 }
	if (!max) { max = 65535 }
	if (!field.value){
		alert(msg);
		field.focus();
		field.select();
		return false;
	}
	if(field.value.length < min || field.value.max > max) {
		alert('The ' + field_description + ' field must be between ' + min + ' and ' + max + ' characters long');
		field.focus();
		field.select();
		return false;
	}
	return true;
}

function validateEmail(email, msg, optional) {
if (!email.value && optional) {
return true;
}
var re_mail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z])+$/;
if (!re_mail.test(email.value)) {
alert(msg);
email.focus();
email.select();
return false;
}
return true;
}

/*
   CLIP MANAGEMENT ============================================================
*/
function clipit(e){

	if(!pass_checks){ return false; }

	// Get link
	var link = get_target(e);

	// Get source
	var source = document.getElementById(link.id + "_source");

	if(entry_exists(source.href)){
		unclip(source.innerHTML, source.href);
	}
	else{
		clip(source.innerHTML, source.href);
	} 

	// Update page
	update_page(link, source);
}

function clip(id, url){

	if(!pass_checks){ return false; }

	// Retrieve cookie
	var cookie = read_cookie(cookie_name);

	// Append delimiter if required
	if(cookie != ""){ cookie = cookie + list_delimiter; }

	// Append to cookie
	cookie += id + entry_delimiter + url;

	// Set cookie
	create_cookie(cookie_name, cookie, time_to_live);
}

function unclip(id, url){

	if(!pass_checks){ return false; }

	// Retrieve cookie
	var cookie = read_cookie(cookie_name);
	// remove entry from cookie
	var entries = new Array();
	entries = cookie.split(list_delimiter);
	var new_cookie = '';
        var entry_count = 0;
	for (i = 0; i < entries.length; i++){

		var parameters = entries[i].split(entry_delimiter);

		if(parameters[1] != url){
			if(entry_count != 0){
				new_cookie += list_delimiter;
			}
			entry_count ++;
			new_cookie += entries[i];
		}
	}

	// Set cookie
	create_cookie(cookie_name, new_cookie, time_to_live);
}

function clear(){
	delete_cookie(cookie_name);
	update_page(null, null);
}

function entry_exists(url){

	var cookie = read_cookie(cookie_name);

	if(cookie == ""){ return false; }

	var entries = new Array();
	entries = cookie.split(list_delimiter);
	for (i = 0; i < entries.length; i++){
		var parameters = entries[i].split(entry_delimiter);
		if(parameters[1] == url){ return true; }
	}
	return false;
}


/*
   PAGE UPDATING ==============================================================
*/
function update_page(link, source){
	update_links(link, source);
	update_content();
}

function update_links(link, source){

	if(!pass_checks){ return false; }

	if(link != null){

		var links = document.getElementsByTagName("a");
		for (var i=0; i < links.length; i++) {

			var destination = links[i].href;
			if (destination.indexOf("#" + clipit_identifier) != -1) {
			
				// Set link content
				var source = document.getElementById(links[i].id + "_source");
				if(entry_exists(source.href)){
					links[i].innerHTML = clipped_message;
					links[i].title = source.innerHTML + " is in your clippings";
				}
				else{
					links[i].innerHTML = clipit_message;
					links[i].title = "add " + source.innerHTML + " to your clippings";
				}
			}
		}
	}
	else{
		var links = document.getElementsByTagName("a");
		for (var i=0; i < links.length; i++) {
			var destination = links[i].href;
			if (destination.indexOf("#" + clipit_identifier) != -1) {
				var source = document.getElementById(links[i].id + "_source");
				links[i].innerHTML = clipit_message;
				links[i].title = "add " + source.innerHTML + " to your clippings";
			}
		}
	}
}

function update_content(){

	if(!pass_checks){ return false; }

	// Retrieve cookie
	var cookie = read_cookie(cookie_name);

	var count = document.getElementById('count');
	var clippings = document.getElementById('clippings');
	var clippings_container = document.getElementById('clippings_container');
	var remove_link = document.getElementById('remove_all');
	if(clippings != null){
		clippings_container.removeChild(clippings);
	}
	if(cookie != ""){

		clippings_container.style.display = "block";

		// Count
		var entries = cookie.split(list_delimiter);
		var total = entries.length
		count.innerHTML = total + ' | ';

		// List
		var ul = document.createElement("ul");
		ul.id = "clippings";
		entries = cookie.split(list_delimiter);
		entries.sort() 
		for (i = 0; i < entries.length; i++){
			var parameters = entries[i].split(entry_delimiter);
			var id = parameters[0];
			var url = parameters[1];

			var linka = document.createElement("a");
			linka.innerHTML = id + " ";
			linka.href = url;
			linka.id = "clipit_box_" + i + "_source";

			var removea = document.createElement("a");
			removea.innerHTML = clipped_message;
			removea.id = "clipit_box_" + i;
			removea.className = "clipdel";
			removea.onmousedown = clipit;
			removea.href = "#clipit";

			var li = document.createElement("li");
			li.appendChild(removea);
			li.appendChild(linka);

			ul.appendChild(li);
		}
		clippings_container.appendChild(ul);
	}
	else{
		count.innerHTML = 0 + ' | ';
		clippings_container.style.display = "none";
	}


}


/*
   COOKIE FUNCTIONS ===========================================================
*/
function create_cookie(name,value,days){
	if (days){
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else{
		var expires = "";
	}
	document.cookie = name+"="+value+expires+"; path=/";
}

function read_cookie(name){
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++){
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return "";
}

function delete_cookie(name){
	create_cookie(name,"",-1);
}

function output_cookie(){
	alert(read_cookie(cookie_name));
}

/*
   UTILITY ====================================================================
*/
function pass_checks(){
	if (!document.getElementsByTagName) return false;
	if (!document.getElementById) return false;
	return true;
}

function get_target(e){
	if (navigator.appName == "Microsoft Internet Explorer"){
		return event.srcElement;
	}
	else{
		return e.target;
	}
}

/*
   LOAD EVENTS ================================================================
*/
function add_load_event(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	}
	else{
		window.onload = function() {
			oldonload();
			func();
		}
	}
}

function prepare_clipit_links() {

	if(!pass_checks){ return false; }

	var links = document.getElementsByTagName("a");
	for (var i=0; i < links.length; i++) {

		var destination = links[i].href;
		if (destination.indexOf("#" + clipit_identifier) != -1) {
			
			// Set event
			links[i].onmousedown = clipit;			

			// Set link content
			var source = document.getElementById(links[i].id + "_source");
			if(entry_exists(source.href)){
				links[i].innerHTML = clipped_message;
				links[i].title = source.innerHTML + " is in your clippings";
			}
			else{
				links[i].innerHTML = clipit_message;
				links[i].title = "add " + source.innerHTML + " to your clippings";
			}
		}

		if (destination.indexOf("#" + clear_all_identifier) != -1) {
			// Set event
			links[i].onmousedown = function() {
				clear();
			}
		}
	}
}

function prepare_clipit_page() {
	update_content();
}

add_load_event(prepare_clipit_links);
add_load_event(prepare_clipit_page);


