$(document).ready(function() {	

   //select all the a tag with name equal to modal  
   $('*[name=modal]').each(function(){

   //default params
   var puParams = {
   loadpage : null,       //адрес страницы, которая будет загружена. Если null то без ajax
   event : 'click',       //событие при котором появляется окошко
   closeevent: 'default', //событие при котором закрывается окошко, по умолчанию закрывается при клике на фон (если он есть), или на кнопку закрыть (элемент с классом close внутри id=target)
   target: 'dialog',      //id элемента который будет показываться
   fade: '400',          //скорость появления элемента в миллисекундах
   bgfade : '0.2',        //прозрачность фона, только при mask=true
   mask: true,           //показывать фон
   linkto: 'window',      //привязка window|mouse|#objectid
   offsetleft: 0,
   offsettop: 0,
   callback: null,
   contentid: 'popupcontent'
   };

   var statusHolder = ''; //содержит активное состояние

   //получаем параметры
   var eventType = /event=([a-zA-Z]+)/.exec($(this).attr('popupparams'));
   if(eventType && eventType[1]) puParams.event = eventType[1];
     
   if(/linkto=#?([a-zA-Z]+)/.exec($(this).attr('popupparams'))){
      puParams.linkto=/linkto=#?([a-zA-Z]+)/.exec($(this).attr('popupparams'))[1];
   }

   if(/offsetleft=([0-9-]+)/.exec($(this).attr('popupparams'))){
      puParams.offsetleft=parseInt(/offsetleft=([0-9-]+)/.exec($(this).attr('popupparams'))[1]);
   }

   if(/offsettop=([0-9-]+)/.exec($(this).attr('popupparams'))){
      puParams.offsettop=parseInt(/offsettop=([0-9-]+)/.exec($(this).attr('popupparams'))[1]);
   }
 
   if(/closeevent=([a-zA-Z]+)/.exec($(this).attr('popupparams'))){
      puParams.closeevent=/closeevent=([a-zA-Z]+)/.exec($(this).attr('popupparams'))[1];
   }

   //Get the target
   if(/target=([a-zA-Z0-9-_]+)/.exec($(this).attr('popupparams'))){
      puParams.target=/target=([a-zA-Z0-9-_]+)/.exec($(this).attr('popupparams'))[1];
   }
   
   if(/loadpage=([^;]+)/.exec($(this).attr('popupparams'))){
      puParams.loadpage = /loadpage=([^;]+)/.exec($(this).attr('popupparams'))[1];
   }

   if(/bgfade=([0-9\.]+)/.exec($(this).attr('popupparams'))){
      puParams.bgfade=/bgfade=([0-9\.]+)/.exec($(this).attr('popupparams'))[1];
   }

   if(/[^g]fade=([0-9]+)/.exec($(this).attr('popupparams'))){
      puParams.fade=parseInt(/[^g]fade=([0-9]+)/.exec($(this).attr('popupparams'))[1]);
   }

   puParams.mask=!/mask=false/.test($(this).attr('popupparams'));

   if(/callback=([a-zA-Z]+)/.exec($(this).attr('popupparams'))){
      puParams.callback=/callback=([a-zA-Z]+)/.exec($(this).attr('popupparams'))[1];
   }

   if(/contentid=([a-zA-Z0-9]+)/.exec($(this).attr('popupparams'))){
      puParams.contentid=/contentid=([a-zA-Z0-9]+)/.exec($(this).attr('popupparams'))[1];
   }
   
   var modal = $(this);
   function openEvent(e){

   //Cancel the link behavior
   e.preventDefault();
   statusHolder = 'open';	
   var id = $('#'+puParams.target);

   if(puParams.mask){
		//Get the screen height and width
		var maskHeight = $(document).height();
		var maskWidth = $(window).width();
	
		//Set heigth and width to mask to fill up the whole screen
		$('#mask').css({'width':maskWidth,'height':maskHeight});
		
		//transition effect	
		$('#mask').fadeTo("slow",puParams.bgfade);
   }
if(puParams.loadpage==null){
    linkTo(id, puParams.linkto);
    if(puParams.callback!=null)eval(puParams.callback+"(id,$('#"+puParams.contentid+"'))");
    $(id).fadeIn(puParams.fade);
}else if(/\.(je?pg|gif|bmp|png)/.test(puParams.loadpage)){
	$(id).attr("src", puParams.loadpage);
	linkTo(id, puParams.linkto);
    $(id).fadeIn(puParams.fade);
}else{	 
$.ajax({
  url: puParams.loadpage,
  success: function(data) {
    if(puParams.callback!=null){
		$("#"+puParams.contentid).html(eval(puParams.callback+"(id,$('#"+puParams.contentid+"'),data)"));
	}else{
    	$("#"+puParams.contentid).html(data);
	}
    linkTo(id, puParams.linkto);
    //transition effect
    if(statusHolder!='close')$(id).fadeIn(puParams.fade);

    //make dragabble
    $('#title').bind( 'drag', function( e ){ 
	$(id).css({ 
		top:(e.offsetY+$(window).scrollTop()-document.body.scrollTop), 
		left:(e.offsetX+$(window).scrollLeft()-document.body.scrollLeft) 
	}); 
    });
  }
});
}
//if close button is clicked
	$('#'+puParams.target+' .close').click(function (e) {
		//Cancel the link behavior
		e.preventDefault();
   if(puParams.event==puParams.closeevent){
      modal.unbind(puParams.closeevent);
      modal.bind(puParams.event, openEvent);
   }
		$('#mask').hide();
		$('#'+puParams.target).hide();
	});		
	
      if(puParams.mask){
	//if mask is clicked
	$('#mask').click(function () {
   if(puParams.event==puParams.closeevent){
      modal.unbind(puParams.closeevent);
      modal.bind(puParams.event, openEvent);
   }
		$(this).hide();
		$('#'+puParams.target).hide();
	});
      }
   if(puParams.closeevent){
      if(puParams.event==puParams.closeevent)$(this).unbind(puParams.event);
      $(this).bind(puParams.closeevent, closeEvent);
   } 
   }
function closeEvent(){
   if(puParams.event==puParams.closeevent){
      $(this).unbind(puParams.closeevent);
      $(this).bind(puParams.event, openEvent);
   }
   $('#'+puParams.target).hide();
   statusHolder = 'close';	
}
function linkTo(id, tg){
   if(tg=='mouse'){
    $(document).mousemove(function(e){
     $(id).css('top',  puParams.offsettop+e.pageY);
     $(id).css('left', puParams.offsetleft+e.pageX);
    });
   }
   else if(tg=='window'){
    //Get the window height and width
    var winH = $(window).height();
    var winW = $(window).width();
              
    //Set the popup window to center
    $(id).css('top',  puParams.offsettop+winH/2-$(id).height()/2+$(window).scrollTop());
    $(id).css('left', puParams.offsetleft+winW/2-$(id).width()/2);
   }else{
    $(id).css('top',  puParams.offsettop+$('#'+tg).offset().top);
    $(id).css('left', puParams.offsetleft+$('#'+tg).offset().left);
   }
}
   //attach event
   $(this).bind(puParams.event, openEvent); 
});
});
;(function($){ // secure $ jQuery alias
/*******************************************************************************************/	
// jquery.event.drag.js - rev 10
// Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
// Liscensed under the MIT License (MIT-LICENSE.txt)
// http://www.opensource.org/licenses/mit-license.php
// Created: 2008-06-04 | Updated: 2008-08-05
/*******************************************************************************************/
// Events: drag, dragstart, dragend
/*******************************************************************************************/

// jquery method
$.fn.drag = function( fn1, fn2, fn3 ){
	if ( fn2 ) this.bind('dragstart', fn1 ); // 2+ args
	if ( fn3 ) this.bind('dragend', fn3 ); // 3 args
	return !fn1 ? this.trigger('mousedown',{ which:1 }) // 0 args
		: this.bind('drag', fn2 ? fn2 : fn1 ); // 1+ args
	};

// special event configuration
var drag = $.event.special.drag = {
	distance: 0, // default distance dragged before dragstart
	setup: function( data ){
		data = $.extend({ distance: drag.distance }, data || {});
		$.event.add( this, "mousedown", drag.handler, data );
		},
	teardown: function(){
		$.event.remove( this, "mousedown", drag.handler );
		if ( this == drag.dragging ) drag.dragging = drag.proxy = null; // deactivate element
		selectable( this, true ); // enable text selection
		},
	handler: function( event ){ 
		var returnValue;
		// mousedown has initialized
		if ( event.data.elem ){ 
			// update event properties...
			event.dragTarget = event.data.elem; // source element
			event.dragProxy = drag.proxy || event.dragTarget; // proxy element or source
			event.cursorOffsetX = event.data.x - event.data.left; // mousedown offset
			event.cursorOffsetY = event.data.y - event.data.top; // mousedown offset
			event.offsetX = event.pageX - event.cursorOffsetX; // element offset
			event.offsetY = event.pageY - event.cursorOffsetY; // element offset
			}
		// handle various events
		switch ( event.type ){
			// mousedown, left click
			case !drag.dragging && event.which==1 && 'mousedown': // initialize drag
				$.extend( event.data, $( this ).offset(), { 
					x: event.pageX, y: event.pageY, elem: this, 
					dist2: Math.pow( event.data.distance, 2 ) //  xІ + yІ = distanceІ
					}); // store some initial attributes
				$.event.add( document.body, "mousemove mouseup", drag.handler, event.data );
				selectable( this, false ); // disable text selection
				return false; // prevents text selection in safari 
			// mousemove, check distance, start dragging
			case !drag.dragging && 'mousemove': // DRAGSTART >>	
				if ( Math.pow( event.pageX-event.data.x, 2 ) 
					+ Math.pow( event.pageY-event.data.y, 2 ) //  xІ + yІ = distanceІ
					< event.data.dist2 ) break; // distance tolerance not reached
				drag.dragging = event.dragTarget; // activate element
				event.type = "dragstart"; // hijack event
				returnValue = $.event.handle.call( drag.dragging, event ); // trigger "dragstart", return proxy element
				drag.proxy = $( returnValue )[0] || drag.dragging; // set proxy
				if ( returnValue !== false ) break; // "dragstart" accepted, stop
				selectable( drag.dragging, true ); // enable text selection
				drag.dragging = drag.proxy = null; // deactivate element
			// mousemove, dragging
			case 'mousemove': // DRAG >> 
				if ( drag.dragging ){
					event.type = "drag"; // hijack event
					returnValue = $.event.handle.call( drag.dragging, event ); // trigger "drag"
					if ( $.event.special.drop ){ // manage drop events
						$.event.special.drop.allowed = ( returnValue !== false ); // prevent drop
						$.event.special.drop.handler( event ); // "dropstart", "dropend"
						}
					if ( returnValue !== false ) break; // "drag" not rejected, stop		
					event.type = "mouseup"; // hijack event
					}
			// mouseup, stop dragging
			case 'mouseup': // DRAGEND >> 
				$.event.remove( document.body, "mousemove mouseup", drag.handler ); // remove page events
				if ( drag.dragging ){
					if ( $.event.special.drop ) // manage drop events
						$.event.special.drop.handler( event ); // "drop"
					event.type = "dragend"; // hijack event
					$.event.handle.call( drag.dragging, event ); // trigger "dragend"	
					selectable( drag.dragging, true ); // enable text selection
					drag.dragging = drag.proxy = null; // deactivate element
					event.data = {};
					}
				break;
			} 
		} 
	};
	
// toggles text selection attributes	
function selectable( elem, bool ){ 
	if ( !elem ) return; // maybe element was removed ? 
	elem.unselectable = bool ? "off" : "on"; // IE
	elem.onselectstart = function(){ return bool; }; // IE
	if ( elem.style ) elem.style.MozUserSelect = bool ? "" : "none"; // FF
	};	
	
/*******************************************************************************************/
})( jQuery ); // confine scope
