/**
 * GSK HCP | Javascript
 *
 * @author   fde@emakina.com
 * @version  2008/05/05
 */

/* "prototype" functions */
var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [event || window.event].concat(args));
  }
}

var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

// getElementById() shortcut
function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (typeof element == 'string')
    element = document.getElementById(element);
  return element;
}

if (!window.Event) {
  var Event = new Object();
}
Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,

  element: function(event) {
    return $(event.target || event.srcElement);
  },
  
  stop: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  }
});


var dom = {
	addEvent: function(obj, evType, fn, useCapture) {
		if(obj){
			if (useCapture==undefined)
				useCapture = false; // use bubbling
			if (obj.addEventListener){
				obj.addEventListener(evType, fn, useCapture);
				return true;
			} else if (obj.attachEvent){
				var r = obj.attachEvent("on"+evType, fn);
				return r;
			} else {
				alert("Handler could not be attached");
			}
		}
	},

	delegateEvents: function(element, eventtypes, eventhandler)	{
		for (var i=0;i<eventtypes.length; i++) {
			element['on'+eventtypes[i]] = eventhandler;
		}
	},
	
	setStyle:function(element, oStyles)	{
		for (var property in oStyles) {
			try {
				element.style[property] = oStyles[property];
			} catch(e) { 
			}
		}
	}
}


/**
 * SmartInput - simple class for input with default label that disappears when user enters text
 *
 * The alt attribute contains the default text to use for the input element.
 *
 * @author   fde@emakina.com
 * @version  2008/05/05
 */
var SmartInput = Class.create();
SmartInput.prototype = {
	initialize:function(elem){
		if (elem) {
			this.setLabel(elem);
			dom.delegateEvents(elem,['blur','focus'], this.eventHandler.bindAsEventListener(this));
		}
	},

	eventHandler:function(e){
		var elem = Event.element(e);
		var evType = e.type;
		switch(evType) {
			case 'blur':  this.setLabel(elem); break;
			case 'focus': this.resetLabel(elem); break;
		}
		return true;
	},
	
	setLabel:function(elem){
		var label = elem.getAttribute('alt');
		if (elem.value=='' || elem.value==label){
			elem.value = label;
			dom.setStyle(elem, {color:'#aaa'});
		}
	},

	resetLabel:function(elem){
		var label = elem.getAttribute('alt');
		if (elem.value==label) {
			elem.value = '';
			dom.setStyle(elem, {color:''});
		}
	}
}

var gskMain ={
	init:function(){
		dom.addEvent($('ca-head-login'), 'click', function(e){
			if ($('ca-head-login_form')) {
				dom.setStyle($('ca-head-login_form'),{display:'block'});
				$('ca-head-login_form').getElementsByTagName('INPUT')[0].focus();
			}
		});
		
		
		// search box
		var div = $('ca-head-search');
		if(div){
			input = div.getElementsByTagName('input')[0];
			var si = new SmartInput(input);
		}
		// send to a friend
		var el;
		if ((el = $('friend')) && (el = el.getElementsByTagName('a')[0])){
			el.setAttribute('href', 'mailto:?subject='+escape(document.title)+'&body='+escape(window.location.href));
		}

		// bookmark
		if ((el = $('bookmark')) && (el = el.getElementsByTagName('a')[0]))	{
			dom.addEvent(el, 'click', function(e){
				// IE
				if (window.external) {
					window.external.AddFavorite(window.location.href,document.title);
				} else {
					// Moz.
					if (window.sidebar){
						window.sidebar.addPanel(document.title,window.location.href,'');
					} else {
						alert('Click on Ctrl+D or Apple+D to add this site to your bookmarks');
					}
				}
				Event.stop(e);
			});
		}
		
		// del.icio.us
		if ((el = $('delicious')) && (el = el.getElementsByTagName('a')[0])){
			dom.addEvent(el, 'click', function(e){
				var url = 'http://del.icio.us/post?url='+escape(window.location.href)+'&title='+escape(document.title)+'&noui&jump=close&v=4';
				window.open(url,'delicious','height=400, width=700, left=100, top=100, scrollbars=yes, resizable=yes');
				Event.stop(e);
			});
		}
		
		// print lazy link
		if (el = $('tool_print')) {
			dom.addEvent(el, 'click', function(e) {
				window.print();
				Event.stop(e);
			});
		}
	}
}

dom.addEvent(window,'load',function(){gskMain.init()});
